Propagierungsverhalten der Transaktion

8

Ich verwende Annotation-basierten deklarativen Ansatz für Frühjahr aop. Beispielcode

%Vor%

Aber ich habe immer noch Zweifel an der Verwendung von propagation.des Propagation.Requires_New bedeutet, dass jede Anfrage eine neue Transaktion startet.

Zweite Frage:

Führt der Fehler einer Methode wie method2, method3 zum Rollback der Transaktion?

Ich werde mich sehr freuen, wenn mir etwas helfen kann, die Transaktionsausbreitung zu lehnen.

kann mir jemand ein Beispiel aus der realen Welt geben, wo wir an einer bestehenden Transaktion teilnehmen müssen. Denn ich stelle mir vor, dass die add-Funktion, die wir im obigen Beispiel verwenden, für alle Benutzer unabhängig ist oder jede andere Funktion für jeden Benutzer unabhängig ist Wer ruft an. Ich bin nicht in der Lage, Beispiele zu finden, bei denen andere Propagierungsmethoden wie PROPAGATION_SUPPORTS, PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW usw. verwendet werden.

    
Vish 05.04.2011, 10:43
quelle

3 Antworten

31

Beantworten Sie diesen Kommentar, nicht die eigentliche Frage:

  

Transaktion ist sitzungsspezifisch oder   Anfrage spezifisch - Vish vor 3 Stunden

Weder. Anfrage und Sitzung sind beide webspezifische Bereiche, während die Spring-Transaktionsabstraktion nichts mit Webtechnologien zu tun hat.

Der Bereich von @Transactional ist pro Methodenaufruf, da @Transactional durch Spring AOP implementiert wird. Der Transaktionszustand wird in ThreadLocal -Variablen gehalten, die initialisiert werden, wenn die äußerste @Transactional -Methode eingegeben und mit Commit oder Rollback gelöscht wird, wenn sie verlassen wird. Diese ganze Abstraktion arbeitet auf Java-Methodenebene und benötigt daher keinen Webcontainer.

Und als Antwort auf diese Frage im Kommentar unten:

  

danke @ Sean, ich bin immer noch nicht in der Lage zu bekommen   antworte wo andere Vermehrung   Verhalten wie PROPAGATION_SUPPORTS   , PROPAGATION_MANDATORY, PROPAGATION_REQUIRES_NEW   usw. werden benutzt. siehe oben für   ganze Frage

Hier ist die Liste von Propagation Werte mit meinen Kommentaren:

  

OBLIGATORISCH
  Unterstützen Sie eine aktuelle Transaktion, werfen Sie eine Ausnahme aus   keine existiert.

Startet keine neue Transaktion, sondern prüft nur, ob eine Transaktion aktiv ist (muss sich entweder in einem anderen @Transactional -Methodenaufruf oder in einer programmatisch erstellten Transaktion befinden)

  

NESTED
  Wird in einer geschachtelten Transaktion ausgeführt, wenn eine aktuelle Transaktion vorhanden ist   existiert, benehmen sich wie    PROPAGATION_REQUIRED sonst.

Starten Sie eine geschachtelte Transaktion, wenn eine Transaktion vorhanden ist, starten Sie andernfalls eine neue Transaktion.

  

NIE
  Führen Sie nicht-transaktional aus, werfen Sie eine Ausnahme bei einer Transaktion aus   existiert.

Startet keine Transaktion. Schlägt fehl, wenn eine Transaktion vorhanden ist.

  

NOT_SUPPORTED
  Führen Sie nicht-transaktional aus, unterbrechen Sie die aktuelle Transaktion, falls vorhanden   existiert.

Startet keine Transaktion. Unterbricht alle bestehenden Transaktionen.

  

ERFORDERLICH
  Unterstützen Sie eine aktuelle Transaktion, erstellen Sie eine neue Transaktion, wenn keine vorhanden ist   existiert.

Wenn eine Transaktion existiert, verwenden Sie diese, wenn nicht, erstellen Sie eine neue. In 95% der Fälle benötigen Sie das.

  

REQUIRES_NEW
  Erstellen Sie eine neue Transaktion, unterbrechen Sie die aktuelle Transaktion, falls vorhanden   existiert.

Erstellt immer eine neue Transaktion, unabhängig davon, ob eine vorhandene Transaktion vorhanden ist. Wenn dies der Fall ist, wird es für die Dauer dieser Methodenausführung ausgesetzt.

  

UNTERSTÜTZT
  Unterstützen Sie eine aktuelle Transaktion, führen Sie sie aus   nicht-transaktional, wenn keins existiert.

Kann eine Transaktion verwenden, wenn eine vorhanden ist, aber keine benötigt (und auch keine neue beginnt)

In den meisten Fällen ist REQUIRED das, was Sie brauchen (daher ist es der Standard in der Annotation @Transactional ). Ich persönlich habe nie einen anderen Wert als REQUIRED und REQUIRES_NEW in Verwendung gesehen.

    
Sean Patrick Floyd 05.04.2011, 15:17
quelle
1

Die Transaktionsfortpflanzung gibt an, wie das Verhalten der angegebenen Methode beim Aufruf sein soll. REQUIRES_NEW bedeutet, dass eine neue Transaktion immer gestartet werden sollte, auch wenn eine laufende Transaktion stattfindet.

Wenn method1() zum Beispiel REQUIRES_NEW definiert, wird es in einer neuen Transaktion ausgeführt.

Eine Ausnahme wird die aktuelle aktive Transaktion zurücksetzen, ja.

    
Bozho 05.04.2011 10:50
quelle
0

Ja. Requires_New bedeutet, dass jede Anfrage bearbeitet wird Starten Sie eine neue Transaktion. und Ja-Fehler in Methode2, Methode3 bewirkt, dass die Transaktion abhängig von den Rollback-Eigenschaften zurückgesetzt wird. Überprüfen Sie Transactional Eigenschaften.

    
Manoj 05.04.2011 10:50
quelle