Connection.setTransactionIsolation(int)
prévient:
Remarque: Si cette méthode est appelée pendant une transaction, le résultat est défini par l'implémentation.
Cela soulève la question: comment commencer une transaction dans JDBC? Il est clair comment terminer une transaction, mais pas comment la commencer.
Si un Connection
démarre à l'intérieur d'une transaction, comment sommes-nous censés invoquer Connection.setTransactionIsolation(int)
en dehors d'une transaction pour éviter un comportement spécifique à l'implémentation?
Répondre à ma propre question:
Sources:
JDBC délimite implicitement chaque requête/mise à jour que vous effectuez sur la connexion avec une transaction. Vous pouvez personnaliser ce comportement en appelant setAutoCommit (false) pour désactiver le mode de validation automatique et appelez commit ()/rollback () pour indiquer la fin d'une transaction . Code Pesudo
try
{
con.setAutoCommit(false);
//1 or more queries or updates
con.commit();
}
catch(Exception e)
{
con.rollback();
}
finally
{
con.close();
}
Maintenant, il y a un type dans la méthode que vous avez montrée. Il doit être setTransactionIsolation (int level) et n'est pas l'api pour la démarcation des transactions. Il gère comment/quand les modifications apportées par une opération deviennent visibles pour d'autres opérations simultanées, le "I" in ACIDE (http : //en.wikipedia.org/wiki/Isolation_ (database_systems))
Je vous suggère de lire this vous verrez
Par conséquent, le premier appel de setAutoCommit (false) et chaque appel de commit () marquent implicitement le début d'une transaction. Les transactions peuvent être annulées avant d'être validées en appelant
Modifier:
Consultez la documentation officielle sur les transactions JDBC
Lorsqu'une connexion est créée, elle est en mode de validation automatique. Cela signifie que chaque instruction SQL individuelle est traitée comme une transaction et est automatiquement validée juste après son exécution. (Pour être plus précis, la valeur par défaut consiste à valider une instruction SQL lorsqu'elle est terminée, et non lorsqu'elle est exécutée. Une instruction est terminée lorsque tous ses jeux de résultats et nombres de mises à jour ont été récupérés. Dans presque tous les cas, cependant , une instruction est terminée et donc validée juste après son exécution.)
La façon d'autoriser le regroupement de deux instructions ou plus dans une transaction consiste à désactiver le mode de validation automatique. Ceci est illustré dans le code suivant, où con est une connexion active:
con.setAutoCommit (false);
Source: transactions JDBC
En fait, cette page du tutoriel JDBC serait une meilleure lecture.
.
Au départ, vous pouvez exécuter manuellement une transaction, si vous souhaitez laisser votre connexion en mode "setAutoCommit (true)" mais que vous souhaitez toujours une transaction:
try (Statement statement = conn.createStatement()) {
statement.execute("BEGIN");
try {
// use statement ...
statement.execute("COMMIT");
}
catch (SQLException failure) {
statement.execute("ROLLBACK");
}
}
Cela répondra peut-être à votre question: vous ne pouvez avoir qu'une seule transaction par connexion. Si la validation automatique est activée (par défaut), chaque sélection, mise à jour, suppression démarre automatiquement et valide (ou annule) une transaction. Si vous désactivez la validation automatique, vous lancez une "nouvelle" transaction (cela signifie que la validation ou l'annulation ne se produira pas automatiquement). Après certaines instructions, vous pouvez appeler commit ou rollback, ce qui termine la transaction en cours et en démarre automatiquement une nouvelle. Vous ne pouvez pas ouvrir deux transactions activement sur une seule connexion JDBC sur du JDBC pur.
Vous pouvez utiliser ces méthodes pour la transaction:
con
con.setAutoCommit(false);
con.commit();
con.rollback();