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.
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 wiePROPAGATION_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.
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.
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.
Tags und Links java spring transactions spring-aop