web-dev-qa-db-fra.com

Comment démarrer une transaction dans JDBC?

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?

56
Gili

Répondre à ma propre question:

  • Les connexions JDBC commencent avec le mode de validation automatique activé, où chaque instruction SQL est implicitement démarquée par une transaction.
  • Les utilisateurs qui souhaitent exécuter plusieurs instructions par transaction doivent désactiver auto-commit off .
  • La modification du mode de validation automatique déclenche une validation de la transaction en cours (si l'une est active).
  • Connection.setTransactionIsolation () peut être invoqué à tout moment si la validation automatique est activée.
  • Si la validation automatique est désactivée, Connection.setTransactionIsolation () ne peut être invoqué qu'avant ou après une transaction. L'invoquer au milieu d'une transaction entraîne un comportement indéfini.

Sources:

50
Gili

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))

25
Aravind R. Yarram

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

18
Necronet

En fait, cette page du tutoriel JDBC serait une meilleure lecture.
.

9
Romain Hippeau

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");
      }
  }
3
rogerdpack

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.

3
Pittmann György

Vous pouvez utiliser ces méthodes pour la transaction:

  1. vous devez créer l'objet de connexion comme con
  2. con.setAutoCommit(false);
  3. vos requêtes
  4. si tout est vrai con.commit();
  5. else con.rollback();
2
Manochehr