Відмінності між require_new та вкладеним поширенням у весняних транзакціях


80

Я не можу зрозуміти різницю поведінки між політиками PROPAGATION_REQUIRES_NEWта PROPAGATION_NESTEDрозповсюдженням. Мені здається, що в обох випадках поточний процес відкочується, але не вся транзакція. Будь-яка підказка?


7
Дивіться це посилання: forum.springsource.org/archive/index.php/t-16594.html - Юрген Холлер це дуже добре пояснив
Ральф

@Ralph: дякую, це саме те, що я шукав. Ви повинні додати це як відповідь.
Alexis Dufrenoy

1
@Ralph: чудово, це була б найкраща відповідь.
Нандкумар Текале

1
Отже, головна відмінність полягає в тому, що за допомогою вкладеної політики транзакцій транзакція може бути повернута до початку до поточної атомної операції, яка така ж, як і в політиці require_new, але вона буде здійснена лише в кінці всього процесу, що повністю відрізняється від політики require_new, де кожна атомна операція буде здійснена після її закінчення.
Alexis Dufrenoy

1
@Ralph, на жаль, ваше посилання більше не вказує на існуючу сторінку :(
knittl

Відповіді:


117

Дивіться це посилання: PROPAGATION_NESTED проти PROPAGATION_REQUIRES_NEW? Юрген Хеллер дуже добре це пояснює. - Весняний джерельний форум повністю поза мережею 28 лютого 2019 року, але відповідну частину статті ви можете прочитати у цитаті нижче

PROPAGATION_REQUIRES_NEW запускає нову, незалежну "внутрішню" транзакцію для даного обсягу. Ця транзакція буде здійснена або відкочена повністю незалежно від зовнішньої транзакції, мати свою власну область ізоляції, власний набір замків тощо. Зовнішня транзакція буде призупинена на початку внутрішньої та відновиться, коли внутрішня буде завершено. ...

PROPAGATION_NESTED, з іншого боку, починає "вкладену" транзакцію, яка є справжньою субтранзакцією існуючої. Що станеться, так це те, що точка збереження буде взята на початку вкладеної транзакції. Якщо вкладена транзакція не вдається, ми повернемося до цієї точки збереження. Вкладена транзакція є частиною зовнішньої транзакції, тому вона буде здійснена лише в кінці зовнішньої транзакції. ...


Хороша відповідь і гарне запитання. Ваші коментарі та таке посилання були для мене дуже корисними: byteslounge.com/tutorials/…
yaki_nuka

це правильна поведінка, яку ви описали у propagation_requires_new? тому що, як я перевірив, це відхиляє обидві транзакції.
eatSleepCode

уточнюйте поведінку зовнішніх транзакцій, якщо вкладена транзакція не вдається (чи не вдасться і вона?), і навпаки
gstackoverflow

Отже, з вкладеною транзакцією, коли внутрішня відкочується, зовнішня продовжується в точці збереження, тоді як коли відкачується зовнішня, всі дії відкочуються, чи не так?
Wecherowski

Будь-які відмінності в поведінці?
gstackoverflow

14

PROPAGATION_REQUIRES_NEW: використовує абсолютно незалежну транзакцію для кожної сфери дії, на яку впливає. У цьому випадку базові фізичні транзакції відрізняються і, отже, можуть здійснювати або відкочуватися самостійно, причому зовнішня транзакція не залежить від статусу відкоту внутрішньої транзакції.

PROPAGATION_NESTED: використовує одну фізичну транзакцію з кількома точками збереження, до яких вона може повернутися. Такі часткові відкоти дозволяють внутрішній області транзакцій викликати відкат для своєї області, причому зовнішня транзакція може продовжувати фізичну транзакцію, незважаючи на те, що деякі операції були відкатані. Це налаштування зазвичай відображається у точках збереження JDBC, тому буде працювати лише з транзакціями ресурсів JDBC.

перевірити весняну документацію


2
Так, я розумію різницю підкреслення, але я не бачу, як це буде поводитися інакше: в одному випадку я відкачу а до попередньої точки збереження, в іншому - поверну поточну транзакцію, а не зовнішню, але насправді, в обох випадках я повернусь до початку поточної атомної операції і розпочну знову з цього моменту.
Alexis Dufrenoy

1
@Traroth: Два рядки за посиланням @Ralph означають різницю в поведінці. PROPAGATION_REQUIRES_NEW: Зовнішня транзакція буде призупинена на початку внутрішньої та відновлена ​​після завершення внутрішньої транзакції. Кожна внутрішня транзакція, яка здійснюється / відміняється після її завершення. PROPAGATION_NESTED: Вкладена транзакція є частиною зовнішньої транзакції, тому вона буде здійснена лише в кінці зовнішньої транзакції.
Нандкумар Текале

Я погоджуюсь, тому я запропонував йому зробити відповідь зі свого коментаря.
Alexis Dufrenoy

1
@Traroth: Я згоден з тобою. :) У нього найкраща відповідь.
Нандкумар Текале

-6

Знайдіть різницю

1.) Use of NESTED Transaction

Виконувати в межах вкладеної транзакції, якщо поточна транзакція існує, поводитись як PROPAGATION_REQUIRED ще. Вкладена транзакція підтримується Spring

2.) Використання ПОТРІБНИХ транзакцій Підтримка поточної транзакції, створіть нову, якщо такої не існує. . Це означає для банківського домену, як зняти, внести, оновити транзакцію

3.) Використання транзакції REQUIRES_NEW Створіть нову транзакцію та призупиніть поточну транзакцію, якщо вона існує.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.