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 @Transactional
Annotation (oder die XML-Konfiguration) in beiden Methoden und mit einer Transaktionsweitergabe mit REQUIRED
Wert 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() {
}
}
foo()
undbar()
teilt es die gleiche Transaktion und wenn 1 fehlschlägt, wird 1 ebenfalls zurückgesetzt? Können Sie etwas Klarheit schaffen?@Transactional(propagation = REQUIRED)
DAO-Ebenenmethode für die Weitergabe und die Dienstebene hinzufügen.@Transactional
Aber@Transactional
was ist der Unterschied , wenn ich nur die Dienstebene anstelle der DAO-Ebene anlege?propagation = REQUIRED
Der Standardwert für die Weitergabe von Transaktionsanmerkungen ist nicht erforderlich.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:
quelle
Tran t
beide Methoden als Parameter? Können Sie eine Erklärung geben?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.
quelle