Comment démarrer une transaction en JDBC?

Connection.setTransactionIsolation(int) met en garde:

Note: si cette méthode est appelée lors d'un mouvement, le résultat est implémentation-defined.

Ce poser la question: comment commencer une transaction dans JDBC? il est clair comment terminer une transaction, mais pas comment la commencer.

Si Connection commence à l'intérieur d'une transaction, comment sommes-nous censés appeler Connection.setTransactionIsolation(int) à l'extérieur d'une transaction pour éviter une mise en œuvre spécifique le comportement?

44
demandé sur Tiny 2011-02-09 05:09:29

7 réponses

Répondre à ma propre question:

  • les connexions JDBC commencent avec le mode auto-commit activé, où chaque instruction SQL est implicitement délimitée par une transaction.
  • les Utilisateurs qui souhaitent exécuter plusieurs instructions par transaction doit tourner auto-commit.
  • modifier le mode auto-commit déclenche une commit de la transaction courante (si on est actif).
  • Connexion.setTransactionIsolation () peut-être invoqué à tout moment si auto-commit est activé.
  • si auto-commit est désactivé,Connexion.setTransactionIsolation () ne peut être invoquée avant ou après une opération. L'invoquer au milieu d'une transaction conduit à un comportement non défini.

Sources:

41
répondu Gili 2016-07-20 13:36:54

JDBC délimite implicitement interrogation / 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 auto-commit et appeler le 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 indiqué. Il devrait être setTransactionIsolation (niveau int) et n'est pas de l'api pour démarcation des transactions. Il gère comment / quand les changements apportés par une opération deviennent visibles à d'autres opérations concurrentes, le "moi"ACIDE (http://en.wikipedia.org/wiki/Isolation_ (database_systems))

22
répondu Aravind R. Yarram 2011-02-10 18:50:47

je vous conseille de lire vous verrez

par conséquent, le premier appel de setAutoCommit (faux) et chaque appel de commit() marque implicitement le début de transaction. Les Transactions peuvent être annulé avant ils sont commis par des appel de

Edit:

vérifier la documentation officielle sur les Transactions JDBC

Lorsqu'une connexion est créée, elle est en mode auto-commit. Cela signifie que chaque instruction SQL est traitée comme une transaction et est engagé automatiquement juste après son exécution. (Pour être plus précis, la valeur par défaut est pour qu'une instruction SQL soit engagée quand elle est terminé, pas quand il est exécuté. Une déclaration est remplie lorsque tous de ses ensembles de résultats et des comptes de mise à jour ont été récupérés. Dans presque dans tous les cas, toutefois, une déclaration est remplie et, par conséquent,, juste après elle est exécutée.)

le chemin vers permettre de regrouper deux ou plusieurs énoncés en un seul la transaction consiste à désactiver le mode de propagation automatique. ceci est démontré dans le code suivant, où con est une connexion active:

con.setAutoCommit (false);

Source: Transactions JDBC

17
répondu Necronet 2012-09-13 08:35:58

en Fait, cette page du tutoriel JDBC serait une meilleure lecture.

Vous obtenez votre connexion, définissez votre niveau d'isolation et ensuite faire vos mises à jour amd trucs et puis commit ou rollback.

9
répondu Romain Hippeau 2011-02-09 02:51:05

peut-être que ceci répondra à votre question: Vous ne pouvez avoir qu'une transaction par connexion. Si autocommit est activé (par défaut), chaque opération select, update, delete démarrera et commit (ou roll-back) automatiquement. Si vous définissez autocommit off, vous démarrez une "nouvelle" transaction (ce qui signifie que commit ou rollback ne se fera pas automatiquement). Après certaines instructions, vous pouvez appeler commit ou rollback, qui termine la transaction courante et démarre automatiquement une nouvelle. Vous ne pouvez pas avoir deux transactions ouverture active sur une connexion JDBC sur JDBC pure.

3
répondu Pittmann György 2016-04-24 13:15:02

de manière surprenante, vous pouvez exécuter manuellement une transaction, si vous souhaitez laisser votre connexion en mode" setAutoCommit(true) " mais que vous voulez quand même une transaction:

 try (Statement statement = conn.createStatement()) {
      statement.execute("BEGIN");
      try {
        // use statement ...
        statement.execute("COMMIT");
      }
      catch (SQLException failure) {
        statement.execute("ROLLBACK");
      }
  }
2
répondu rogerdpack 2017-11-27 17:58:13

vous pouvez utiliser ces méthodes pour la transaction:

  1. vous devez créer l'objet connection comme con
  2. con.setAutoCommit(false);
  3. vos requêtes
  4. si tout est vrai con.commit();
  5. sinon con.rollback();
0
répondu Manochehr 2016-11-28 03:06:03