Unterschiede zwischen require_new und verschachtelter Weitergabe in Spring-Transaktionen

80

Ich kann den Verhaltensunterschied zwischen der PROPAGATION_REQUIRES_NEWund der PROPAGATION_NESTEDWeitergaberichtlinie nicht verstehen . Es scheint mir, dass in beiden Fällen der aktuelle Prozess zurückgesetzt wird, aber nicht die gesamte Transaktion. Irgendeine Ahnung?

Alexis Dufrenoy
quelle
7
Siehe diesen Link: forum.springsource.org/archive/index.php/t-16594.html - Jürgen Hoeller erklärt es sehr gut
Ralph
@ Ralph: Danke, genau das habe ich gesucht. Sie sollten es als Antwort hinzufügen.
Alexis Dufrenoy
1
@ Ralph: toll, das wäre die beste Antwort.
Nandkumar Tekale
1
Der Hauptunterschied besteht also darin, dass bei einer verschachtelten Transaktionsrichtlinie die Transaktion auf den Anfang der aktuellen atomaren Operation zurückgesetzt werden kann. Dies entspricht der in einer require_new-Richtlinie, wird jedoch erst am Ende des gesamten Prozesses festgeschrieben. Dies unterscheidet sich grundlegend von der Richtlinie "require_new", bei der jede atomare Operation festgeschrieben wird, wenn sie endet.
Alexis Dufrenoy
1
@Ralph Ihr Link verweist leider nicht mehr auf eine vorhandene Seite :(
knittl

Antworten:

117

Siehe diesen Link: PROPAGATION_NESTED versus PROPAGATION_REQUIRES_NEW? Jürgen Hoeller erklärt es sehr gut. - Das Spring Source Forum ist seit dem 28. Februar 2019 vollständig offline. Sie können jedoch den entsprechenden Teil des Artikels im folgenden Zitat lesen

PROPAGATION_REQUIRES_NEW startet eine neue, unabhängige "innere" Transaktion für den angegebenen Bereich. Diese Transaktion wird vollständig unabhängig von der äußeren Transaktion festgeschrieben oder zurückgesetzt, hat einen eigenen Isolationsbereich, einen eigenen Satz von Sperren usw. Die äußere Transaktion wird zu Beginn der inneren Transaktion ausgesetzt und fortgesetzt, sobald die innere Transaktion abgeschlossen ist abgeschlossen. ...

PROPAGATION_NESTED hingegen startet eine "verschachtelte" Transaktion, bei der es sich um eine echte Subtransaktion der vorhandenen handelt. Was passieren wird, ist, dass zu Beginn der verschachtelten Transaktion ein Sicherungspunkt erstellt wird. FailsWenn die verschachtelte Transaktion fehlschlägt, wird ein Rollback auf diesen Sicherungspunkt durchgeführt. Die verschachtelte Transaktion ist Teil der äußeren Transaktion und wird daher erst am Ende der äußeren Transaktion festgeschrieben. ...

Ralph
quelle
Gute Antwort und gute Frage. Ihre Kommentare und der folgende Link waren sehr nützlich für mich: byteslounge.com/tutorials/…
yaki_nuka
Ist es das richtige Verhalten, das Sie in propagation_requires_new beschrieben haben? Ursache, wie ich es überprüft habe, rollt beide Transaktionen zurück.
eatSleepCode
Bitte klären Sie das Verhalten der äußeren Transaktion, wenn eine verschachtelte Transaktion fehlschlägt (wird sie auch fehlschlagen?) und umgekehrt
gstackoverflow
Wenn also bei einer verschachtelten Transaktion die innere zurückgesetzt wird, wird die äußere am Speicherpunkt fortgesetzt, während bei der äußeren Transaktion alle Aktionen zurückgesetzt werden, oder?
Wecherowski
Unterschiede im Verhalten?
gstackoverflow
14

PROPAGATION_REQUIRES_NEW: Verwendet für jeden betroffenen Transaktionsbereich eine völlig unabhängige Transaktion. In diesem Fall sind die zugrunde liegenden physischen Transaktionen unterschiedlich und können daher unabhängig festgeschrieben oder zurückgesetzt werden, wobei eine äußere Transaktion nicht vom Rollback-Status einer inneren Transaktion betroffen ist.

PROPAGATION_NESTED: Verwendet eine einzelne physische Transaktion mit mehreren Sicherungspunkten, auf die ein Rollback durchgeführt werden kann. Solche teilweisen Rollbacks ermöglichen es einem inneren Transaktionsbereich, einen Rollback für seinen Bereich auszulösen, wobei die äußere Transaktion die physische Transaktion fortsetzen kann, obwohl einige Operationen zurückgesetzt wurden. Diese Einstellung wird normalerweise JDBC-Sicherungspunkten zugeordnet und funktioniert daher nur mit JDBC-Ressourcentransaktionen.

Check Frühjahr Dokumentation

Nandkumar Tekale
quelle
2
Ja, ich verstehe den unterstrichenen Unterschied, aber ich kann nicht sehen, wie er sich anders verhält: In einem Fall werde ich a auf den vorherigen Sicherungspunkt zurücksetzen, in dem anderen Fall werde ich die aktuelle Transaktion zurücksetzen und nicht den äußeren, aber In beiden Fällen werde ich zum Anfang der aktuellen atomaren Operation zurückkehren und von diesem Punkt aus erneut beginnen.
Alexis Dufrenoy
1
@Traroth: Die beiden Zeilen auf dem Link von @Ralph würden den Unterschied im Verhalten erkennen lassen. PROPAGATION_REQUIRES_NEW: Die äußere Transaktion wird zu Beginn der inneren ausgesetzt und fortgesetzt, sobald die innere abgeschlossen ist. Jede innere Transaktion wird nach Abschluss festgeschrieben / zurückgesetzt. PROPAGATION_NESTED: Die verschachtelte Transaktion ist Teil der äußeren Transaktion, wird also erst am Ende der äußeren Transaktion festgeschrieben.
Nandkumar Tekale
Ich stimme zu, also schlug ich ihm vor, aus seinem Kommentar eine Antwort zu machen.
Alexis Dufrenoy
1
@ Traroth: Ich stimme dir zu. :) Er hat die beste Antwort.
Nandkumar Tekale
-6

Bitte finden Sie den Unterschied

1.) Use of NESTED Transaction

In einer verschachtelten Transaktion ausführen, wenn eine aktuelle Transaktion vorhanden ist, verhalten Sie sich wie PROPAGATION_REQUIRED else. Verschachtelte Transaktionen werden von Spring unterstützt

2.) Verwendung der erforderlichen Transaktion Unterstützen Sie eine aktuelle Transaktion, erstellen Sie eine neue, falls keine vorhanden ist. . Es bedeutet für Bankdomänen wie Abheben, Einzahlen, Aktualisieren der Transaktion

3.) Verwendung der Transaktion REQUIRES_NEW Erstellen Sie eine neue Transaktion und setzen Sie die aktuelle Transaktion aus, falls vorhanden.

Ankit
quelle