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?
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:
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))
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
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.
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.
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");
}
}
vous pouvez utiliser ces méthodes pour la transaction:
- vous devez créer l'objet connection comme
con
con.setAutoCommit(false);
- vos requêtes
- si tout est vrai
con.commit();
- sinon
con.rollback();