it-swarm.com.de

Wie verwalte ich zwei DAO-Methoden in einer einzigen Transaktion?

In einem Interview fragte mich jemand: Wie verwalten wir zwei Transaktions-/Dao-Methoden in einer einzigen Transaktion? Gewünschte Fähigkeiten:

  1. Wenn einer von ihnen fehlschlägt, müssen wir beide Methoden zurücksetzen.
  2. Beide Methoden können separat mit einer einzigen Transaktion verbunden aufgerufen werden.
  3. Die Verwaltung sollte auf der DAO-Ebene erfolgen, nicht auf der Service-Ebene.

Ich denke: Die Frage bezieht sich auf das Frühjahrstransaktionsmanagement.

12
Satish Pandey

Zuallererst sollte das Transaktionsmanagement auf der Service-Schicht und nicht auf der DAO-Schicht erfolgen, da dies einen hohen Leistungsaufwand verursachen würde (um die angemessene Transaktionsisolationsstufe und -ausbreitung bei jeder unterschiedlichen Methode zu bewältigen). Auch der Umfang einer Arbeitseinheit kommt von der Serviceschicht anstelle der Datenzugriffsschicht: Stellen Sie sich eine Leistung vor Ein Geschäftsprozess, der sich mit zwei oder mehr DAOs befassen muss.

Es gibt viele Diskussionen im Internet, die in diese Richtung weisen: hier , hier und hier .

Wie auch immer, da es sich um ein Interview handelt, akzeptieren wir die Frage so wie sie ist. Aus meiner Sicht würden Sie das @Transactional Annotation (oder die XML-Konfiguration) in beiden Methoden und mit einer Transaktionsweitergabe mit REQUIRED Wert. Auf diese Weise wird beim Aufrufen einer dieser Methoden und wenn keine vorherige Transaktion vorhanden ist, eine neue Transaktion erstellt:

@Transactional
class MyDAO {

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

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

}
12

Ignorieren von Federn und Frameworks in meiner Antwort ..... nur die Grundidee der Verwendung von Funktionsparametern. Ich bin sicher, dass das Konzept innerhalb von [Framework hier einfügen] angewendet werden könnte.

Sie müssten das Commit/Rollback außerhalb der 2 DAO-Methoden durchführen. Die beiden Methoden müssten die Transaktion/Verbindung als Eingabe verwenden.

pseudo-Code:

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

Es besteht die Möglichkeit, dass zwei Methoden unabhängig voneinander funktionieren, auch wenn sie gleichzeitig in derselben Transaktion ausgeführt werden. Daher müssen wir Propagation-Required verwenden. Wenn die Transaktion in derselben Transaktion ausgeführt werden muss, wird die erste Transaktion verwendet. Andernfalls wird eine neue Transaktion erstellt, wenn sie unabhängig aufgerufen wird. Korrigieren Sie mich, wenn ich falsch liege.

0
M Anil Kumar