2009-09-01 5 views
2

S'il vous plaît laissez-moi savoir quand avons-nous besoin d'appeler la méthode connection.rollback();Quand devrions-nous appeler la méthode connection.rollback()?

try{ 
    connection = getConnection(); 
    connection.setAutoCommit(false); 
    pstmt1 = connection.preparedstatement (...); 
    ... 
    pstt1.executeUpdate(); 
    pstmt2 = connection.preparedstatement (...); 
    ... 
    pstt2.executeUpdate(); 
    connection.commit(); 
}catch (Exception sqe) { sqe.printStacktrace(); 
}finally { 
    closeQuitely (pstmt1); 
    closeQuitely (pstmt2); 
    closeQuitely (connection); 
} 

Dans le code ci-dessus, nous n'utilisent pas connection.rollback(), mais si une exception se produit, même alors, tout va bien fonctionner [je suppose], cos connexion est déjà définie dans autoCommit = mode faux.

Alors, quelle pourrait être la situation possible lorsque nous devons utiliser cette méthode. Veuillez également poster l'exemple.

+0

Réponse simple: le programmeur ne doit jamais appeler manuellement rollback() ou commit(). – SteveD

+0

En plus d'apprendre JDBC, d'écrire une bibliothèque/framework ou de faire quelque chose de critique, je ne recommanderais pas JDBC brut - utiliser Spring, JPA ou un autre framework pour gérer automatiquement les transactions et les connexions.Il est trop facile de bousiller les interactions et il y a énormément de code standard. – SteveD

Répondre

4

La plupart des SGBD annulent votre transaction parce qu'ils ne savent pas dans quelles circonstances la connexion a été interrompue (peut-être que votre programme a été tué?). Donc, si vous avez déjà commis, la restauration ne fera rien. En revanche, si vous utilisez Connection-Pooling, lorsque vous fermez la connexion, le Gestionnaire de pools l'intercepte et rétablira probablement (espérons-le) la connexion et laissera la connexion ouverte.

Il est recommandé de revenir en arrière dans la clause catch, ou même dans la clause finally. Cela ne fait généralement pas de mal de faire une restauration inutile après un commit. En outre, si vous utilisez Postgres, il est recommandé d'annuler avant de démarrer pour vous assurer que l'heure de début de votre transaction est réinitialisée. C'est parce que Postgres détient la valeur current_timestamp au moment où la transaction a commencé et si vous utilisez des connexions groupées, cela aurait pu être il y a longtemps!

+1

En présence de la mise en commun de connexion dans certains serveurs d'applications, la fermeture de la connexion ** ne ** annulera pas la transaction. Ceci est une optimisation délibérée des performances, cela signifie qu'une seconde ouverture d'une connexion donnera réellement la même connexion **, toujours associée à la transaction. – djna

4

Dans le cas d'exception, votre transaction n'est pas résolue. Finalement, il va expirer, et comme vous le dites, il va revenir en arrière. Mais jusque-là (ce qui peut prendre plusieurs minutes) tous les verrous pris par votre transaction seront retenus. La connexion n'a aucun moyen de réaliser que vous ne pouvez pas juste commettre(). Maintenir les verrous pendant une période prolongée comme ça est très en arrière pour la concurrence.

Ajoutez l'annulation à votre cas d'exception.

Il peut sembler que la fermeture de votre connexion mettra également fin à la conversion. Lors de l'utilisation de JDBC simple, cependant en présence de la mise en commun des connexions implémentée dans les serveurs d'applications fermant la connexion a la sémantique de "retour au pool" et le pool de connexion conservera l'association de la connexion avec votre transaction en cours. Si plus tard dans votre code, toujours dans le cadre de la même transaction, vous demandez une connexion, le pool vous renverra la même connexion. Ceci est très pratique pour écrire des applications de moular, mais a la pénalité que vous ne pouvez pas supposer en fermant une connexion résout la transaction.

begin tran 

// call a method 
    get connection 

    work 

    close connection 

// call another method 

    get connection // you get the **same** connection still associated with the tran 

    work 

    close connection 

commit 
+0

sera-t-il dépassé? Je pense que le calme se referme enfin va rejeter la transaction –

+0

Oui, il sera dans la presenece de la mise en commun des connexions. J'ai étendu la réponse pour essayer de rendre cela clair – djna

0

Si vous fermez une connexion sans valider, la transaction sera annulée. Si vous utilisez un pool de connexion, il le fait probablement pour vous.

Une restauration explicite est probablement plus appropriée lorsque vous rencontrez une condition qui ne provoque pas d'exception mais que vous ne voulez pas valider. Lorsque vous fermez votre connexion, votre transaction sera terminée.

Questions connexes