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


12

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 mit einer einzigen Transaktion getrennt aufgerufen werden.
  3. Die Verwaltung sollte auf der DAO-Ebene und nicht auf der Service-Ebene erfolgen.

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

Antworten:


12

Zuallererst sollte die Transaktionsverwaltung auf der Service-Ebene und nicht auf der DAO-Ebene erfolgen, da dies einen hohen Performance-Overhead verursachen würde (um die entsprechende Transaktionsisolationsstufe und -weitergabe bei den verschiedenen Methoden zu berücksichtigen). Der Umfang einer Arbeitseinheit kommt auch von der Service-Schicht anstelle der Datenzugriffsschicht: Stellen Sie sich vor, Sie führen einen Geschäftsprozess durch, der zwei oder mehr DAOs verarbeiten muss.

Es gibt viele Diskussionen im Internet, die in diese Richtung weisen, wie 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 die @TransactionalAnnotation (oder die XML-Konfiguration) in beiden Methoden und mit einer Transaktionsweitergabe mit REQUIREDWert verwenden. 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() {
   }

}

Bedeutet foo()und bar()teilt es die gleiche Transaktion und wenn 1 fehlschlägt, wird 1 ebenfalls zurückgesetzt? Können Sie etwas Klarheit schaffen?
Satish Pandey

Nun, jede Methode deklariert ihre eigene Arbeitseinheit: tx wird am Ende jeder Methode festgeschrieben, und wenn eine der Methoden eine Ausnahme auslöst, wird ein Rollback durchgeführt.
Alonso Dominguez

Wir müssen also die @Transactional(propagation = REQUIRED)DAO-Ebenenmethode für die Weitergabe und die Dienstebene hinzufügen. @TransactionalAber @Transactionalwas ist der Unterschied , wenn ich nur die Dienstebene anstelle der DAO-Ebene anlege?
Atish Shimpi

propagation = REQUIREDDer Standardwert für die Weitergabe von Transaktionsanmerkungen ist nicht erforderlich.
Daniel Higueras

2

Spring und Frameworks in meiner Antwort ignorieren ..... nur die Grundidee der Verwendung von Funktionsparametern. Ich bin mir sicher, dass das Konzept in [Rahmen hier einfügen] angewendet werden könnte.

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

Pseudocode:

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();  }
}

1 Frage: Warum übergeben wir Tran tbeide Methoden als Parameter? Können Sie eine Erklärung geben?
Satish Pandey

@Satish, da in der Frage (Punkt 1 und 2) die DAO-Methoden die Flexibilität haben müssen, sowohl unabhängig als auch abhängig aufgerufen zu werden. Wenn Sie method1 mit einer Transaktion mit lokalem Gültigkeitsbereich festschreiben, können Sie kein Rollback durchführen, wenn in method2 ein Fehler aufgetreten ist, da Sie method1 bereits festgeschrieben haben, bevor method2 aufgerufen wurde.
mike30

0

Es besteht die Möglichkeit, dass zwei Methoden unabhängig voneinander funktionieren und gleichzeitig in derselben Transaktion ausgeführt werden. Daher müssen Sie 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. Korrigiere mich, wenn ich falsch liege.


Können Sie bitte ein Beispiel geben?
Jay Elston
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.