Różnice między require_new i zagnieżdżoną propagacją w transakcjach Spring

80

Nie rozumiem różnicy w zachowaniu między zasadami PROPAGATION_REQUIRES_NEWi PROPAGATION_NESTEDzasadami rozpowszechniania. Wydaje mi się, że w obu przypadkach wycofywany jest obecny proces, ale nie cała transakcja. Jakaś wskazówka?

Alexis Dufrenoy
źródło
7
Zobacz ten link: forum.springsource.org/archive/index.php/t-16594.html - Juergen Hoeller wyjaśnia to bardzo dobrze
Ralph
@Ralph: dziękuję, właśnie tego szukałem. Powinieneś to dodać jako odpowiedź.
Alexis Dufrenoy
1
@Ralph: świetnie, to byłaby najlepsza odpowiedź.
Nandkumar Tekale
1
Więc główna różnica polega na tym, że w przypadku zagnieżdżonej polityki transakcji transakcja może zostać cofnięta do początku do bieżącej operacji atomowej, która jest taka sama jak w polityce require_new, ale zostanie zatwierdzona dopiero na końcu całego procesu, która jest zupełnie inna niż polityka require_new, w której każda niepodzielna operacja zostanie zatwierdzona po jej zakończeniu.
Alexis Dufrenoy
1
@Ralph niestety, twój link nie wskazuje już na istniejącą stronę :(
knittl

Odpowiedzi:

117

Zobacz ten link: PROPAGATION_NESTED kontra PROPAGATION_REQUIRES_NEW? Juergen Hoeller wyjaśnia to bardzo dobrze. - Forum Spring Source działa całkowicie offline 28 lutego 2019 r., ale odpowiednią część artykułu możesz przeczytać w poniższym cytacie

PROPAGATION_REQUIRES_NEW rozpoczyna nową, niezależną transakcję „wewnętrzną” dla danego zakresu. Ta transakcja zostanie zatwierdzona lub wycofana całkowicie niezależnie od transakcji zewnętrznej, mając własny zakres izolacji, własny zestaw blokad itp. Transakcja zewnętrzna zostanie zawieszona na początku transakcji wewnętrznej i wznowiona, gdy transakcja wewnętrzna zostanie zakończony. ...

Z drugiej strony PROPAGATION_NESTED rozpoczyna transakcję „zagnieżdżoną”, która jest prawdziwą transakcją podrzędną istniejącej. Co się stanie, to punkt zapisu zostanie przyjęty na początku zagnieżdżonej transakcji. Jeśli zagnieżdżona transakcja się nie powiedzie, cofniemy się do tego punktu zapisu. Zagnieżdżona transakcja jest częścią transakcji zewnętrznej, więc zostanie zatwierdzona dopiero na końcu transakcji zewnętrznej. ...

Ralph
źródło
Dobra odpowiedź i dobre pytanie. Wasze komentarze i poniższy link były dla mnie bardzo przydatne: byteslounge.com/tutorials/…
yaki_nuka
czy jest to właściwe zachowanie, które opisałeś w propagation_requires_new? ponieważ jak sprawdziłem to wycofuje obie transakcje.
eatSleepCode
proszę wyjaśnić zachowanie transakcji zewnętrznej, jeśli transakcja zagnieżdżona się nie powiedzie (czy też się nie powiedzie?) i odwrotnie
gstackoverflow
Tak więc w przypadku transakcji zagnieżdżonej, gdy wewnętrzna wycofuje się, zewnętrzna kontynuuje w punkcie zapisu, podczas gdy zewnętrzna wycofuje wszystkie akcje, prawda?
Wecherowski
Jakieś różnice w zachowaniu?
gstackoverflow
14

PROPAGATION_REQUIRES_NEW: używa całkowicie niezależnej transakcji dla każdego zakresu transakcji, na którą ma to wpływ. W takim przypadku podstawowe transakcje fizyczne są różne i dlatego mogą niezależnie zatwierdzać lub wycofywać, przy czym status wycofania transakcji wewnętrznej nie ma wpływu na transakcję zewnętrzną.

PROPAGATION_NESTED: używa pojedynczej fizycznej transakcji z wieloma punktami zapisu, do których może się cofnąć. Takie częściowe wycofania pozwalają wewnętrznemu zakresowi transakcji wyzwolić wycofanie dla swojego zakresu, przy czym zewnętrzna transakcja może kontynuować fizyczną transakcję pomimo wycofania niektórych operacji. To ustawienie jest zwykle mapowane na punkty zapisu JDBC, więc będzie działać tylko z transakcjami zasobów JDBC.

sprawdź dokumentację sprężyny

Nandkumar Tekale
źródło
2
Tak, rozumiem podkreślającą różnicę, ale nie widzę, jak będzie się zachowywać inaczej: w jednym przypadku cofnę a do poprzedniego punktu zapisu, w drugim wycofam bieżącą transakcję, a nie zewnętrzną, ale w rzeczywistości w obu przypadkach cofnę się do początku bieżącej operacji atomowej i zacznę ponownie od tego punktu.
Alexis Dufrenoy
1
@Traroth: Dwie linie w linku autorstwa @Ralph wskazywałyby różnicę w zachowaniu. PROPAGATION_REQUIRES_NEW: Transakcja zewnętrzna zostanie zawieszona na początku transakcji wewnętrznej i wznowiona po zakończeniu transakcji wewnętrznej. Każda transakcja wewnętrzna zatwierdzona / wycofana po zakończeniu. PROPAGATION_NESTED: Zagnieżdżona transakcja jest częścią transakcji zewnętrznej, więc zostanie zatwierdzona dopiero na końcu transakcji zewnętrznej.
Nandkumar Tekale
Zgadzam się, więc zasugerowałem mu, aby udzielił odpowiedzi na jego komentarz.
Alexis Dufrenoy
1
@Traroth: Zgadzam się z tobą. :) On ma najlepszą odpowiedź.
Nandkumar Tekale
-6

Proszę znaleźć różnicę

1.) Use of NESTED Transaction

Wykonaj w ramach zagnieżdżonej transakcji, jeśli istnieje bieżąca transakcja, zachowuj się jak PROPAGATION_REQUIRED w innym przypadku. Zagnieżdżona transakcja jest obsługiwana przez Spring

2.) Korzystanie z WYMAGANEJ transakcji Wspieraj bieżącą transakcję, utwórz nową, jeśli żadna nie istnieje. . Oznacza to dla domeny bankowej, takiej jak wypłata, wpłata, aktualizacja transakcji

3.) Użycie REQUIRES_NEW Transakcja Utwórz nową transakcję i zawieś bieżącą transakcję, jeśli taka istnieje.

Ankit
źródło