Comment gérer 2 méthodes DAO en une seule transaction?

12

Dans une interview, quelqu'un m'a demandé: Comment gérer 2 méthodes transactionnelles / DAO en une seule transaction. Capacités souhaitées:

  1. Si l'un d'eux échoue, nous devons annuler les deux méthodes.
  2. Les deux méthodes peuvent être appelées séparément avec une seule transaction.
  3. La gestion doit être sur la couche DAO, pas sur la couche service.

Je pense: la question concerne la gestion des transactions printanières.

Satish Pandey
la source

Réponses:

12

Tout d'abord, la gestion des transactions doit être effectuée sur la couche service, et non sur la couche DAO car cela créerait beaucoup de surcharge de performance (pour gérer le niveau d'isolement des transactions et la propagation appropriés à chaque méthode différente). En outre, la portée d'une unité de travail provient de la couche service au lieu de la couche d'accès aux données: imaginez effectuer un processus métier qui doit traiter avec 2 DAO ou plus.

Il y a beaucoup de discussions sur Internet qui vont dans ce sens comme ici , ici et ici .

Quoi qu'il en soit, puisqu'il s'agit d'une interview, acceptons la question telle quelle. De mon point de vue, vous utiliseriez l' @Transactionalannotation (ou la configuration XML) dans les deux méthodes et avec une propagation de transaction avec REQUIREDvaleur. De cette façon, lorsqu'une de ces méthodes est invoquée et si aucune transaction précédente n'existe, une nouvelle transaction sera créée:

@Transactional
class MyDAO {

   @Transactional(propagation = REQUIRED)
   public void foo() {
   }

   @Transactional(propagation = REQUIRED)
   public void bar() {
   }

}
Alonso Dominguez
la source
Est-ce que cela signifie foo()et bar()partage la même transaction et si 1 échoue, un autre sera également annulé? Pouvez-vous apporter quelques éclaircissements?
Satish Pandey
eh bien, chaque méthode déclare sa propre unité de travail: tx sera validée à la fin de chaque méthode et si l'une d'entre elles lève une exception, elle sera annulée.
Alonso Dominguez du
nous devons donc ajouter la @Transactional(propagation = REQUIRED)méthode de couche DAO pour la propagation et la @Transactionalcouche de service, mais si je mets @Transactionaluniquement sur la couche de service au lieu de la mettre sur la couche DAO, quelle est la différence?
atish shimpi
propagation = REQUIREDest la valeur par défaut pour la propagation d'annotation transactionnelle, il n'est donc pas nécessaire de l'écrire.
Daniel Higueras
2

Ignorant le ressort et les cadres dans ma réponse ..... juste l'idée de base d'utiliser des paramètres de fonction. Je suis sûr que le concept pourrait s'appliquer dans [insérer le cadre ici].

Vous devrez gérer la validation / restauration en dehors des 2 méthodes DAO. Les 2 méthodes devraient prendre la transaction / connexion en entrée.

code pseudo:

bool method1(Tran t) { /* stuff */}
bool method2(Tran t) { /* stuff */ }

callingMethod() {
     Tran t = null;
     try {
         t = new Conn().open().startTran();
         if(method1(t) && method2(t))
             t.commit();
         else
             t.rollBaack();
     }
     catch(ex) {  t.rollBack();  }
     finally {  t.closeConn();  }
}
mike30
la source
1 question: pourquoi nous passons Tran ten paramètre avec les deux méthodes. Pouvez-vous fournir quelques explications?
Satish Pandey
@Satish, car dans la question (item # 1 et # 2), les méthodes DAO doivent avoir la flexibilité d'être appelées de manière indépendante et dépendante. Si vous vous engagez à l'intérieur de la méthode 1 avec une transaction de portée locale, vous ne pourrez pas revenir en arrière si quelque chose s'est mal passé dans la méthode 2, car vous avez déjà validé la méthode 1 avant l'appel de la méthode 2.
mike30
0

Il est possible que deux méthodes fonctionnent de manière indépendante, en même temps qu'elles s'exécutent dans une même transaction. Nous devons donc utiliser la propagation requise. Si la transaction doit s'exécuter dans la même transaction, elle utilisera la première transaction, sinon une nouvelle transaction sera créée si elle est invoquée indépendamment. Corrigez-moi si je me trompe.

M Anil Kumar
la source
Pouvez-vous fournir un exemple s'il vous plaît?
Jay Elston