2012-06-23 2 views
2

j'insérer des données dans trois tables-à-direrouleau arrière transaction en utilisant MySQL en java

Transaction 
TransactionEntry 
Payment 

d'abord insérer les données dans Transaction, puis obtenir ID de transaction et insérer des données dans TransactionEntry , après cette insertion dans Paiement

Supposons que dans les deux premières tables, les données ont été insérées avec succès. Puis panne du serveur.

Comment pouvons-nous annuler toutes les entrées? pouvons-nous le contrôler par programmation ou la base de données a la fonctionnalité par défaut pour contrôler ce type de situation?

Comment atteindre la cohérence et l'intégrité?

Quel framework, In java, peut contrôler ce type de situation?

MySQLJava EE

+0

JDBC prend en charge rollback. – EJP

Répondre

2

MySQL prend en charge les transactions de façon normale. Ouvrez la transaction au début et validez à la fin, si quelque chose arrive au milieu, rien ne sera posté.

Puisque vous utilisez Java EE, vous devez vérifier si votre client mysql java propose ou non des instructions. Sinon, utilisez

SET AUTOCOMMIT=0; 

... statements ... 

COMMIT; 
+0

-1, Lors de l'utilisation de JDBC, vous devez toujours utiliser la méthode 'setAutoCommit (false)' et les méthodes 'commit()' ou rollback() 'et non les commandes natives de la base de données. Voir la documentation: http://docs.oracle.com/javase/6/docs/api/java/sql/Connection.html (_ "Les applications ne doivent pas appeler les commandes SQL directement pour changer la configuration de la connexion lorsqu'une méthode JDBC est disponible . "_) –

+0

I Investigate, En java connection.setAutoCommit (false); connection.commit(); et en exception connection.rollback(); Je rafraîchis la page après mes COMMETNS mais @MarkRotteveel a déjà donné la réponse;) –

+0

@ MarkRotteveel, vous avez raison, c'est pourquoi j'ai dit IF j2ee ne fournit pas de méthodes intégrées ... :-) – Sebas

2

Vous devez désactiver la validation automatique et engager après votre unité de travail est fait (ou rollback quand il a échoué).

Cela devrait être quelque chose comme:

Connection con = ...; //set earlier 
con.setAutoCommit(false); 
... 
try { 
    //insert here 
    ... 
    con.commit(); 
} catch (Exception e) { 
    con.rollback(); 
    // other exception handling 
} 
+0

Cher, j'utilise MVC. J'ai un contrôleur qui appelle trois méthodes des services et chaque service a son sur la connexion? alors comment fonctionne votre solution proposée? –

+0

Je pense que vous devriez poser une autre question et inclure cette information dans votre question. Vous pouvez vous intéresser aux transactions distribuées (XA) ou aux fonctionnalités de gestion des transactions de Spring. –

Questions connexes