web-dev-qa-db-fra.com

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

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.

12
Satish Pandey

Tout d'abord, la gestion des transactions doit être effectuée sur la couche service, pas 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). De plus, la portée d'une unité d'oeuvre vient de la couche service au lieu de la couche d'accès aux données: imaginez un processus métier qui doit gérer au moins 2 DAO.

Il y a beaucoup de discussions sur Internet qui pointent dans cette direction 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 le @Transactional annotation (ou la configuration XML) dans les deux méthodes et avec une propagation de transaction avec la valeur REQUIRED. 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() {
   }

}
12
Alonso Dominguez

Ignorer le ressort et les cadres dans ma réponse ... juste l'idée de base d'utiliser les 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();  }
}
2
mike30

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.

0
M Anil Kumar