Я не можу зрозуміти різницю поведінки між політиками PROPAGATION_REQUIRES_NEW
та PROPAGATION_NESTED
розповсюдженням. Мені здається, що в обох випадках поточний процес відкочується, але не вся транзакція. Будь-яка підказка?
Я не можу зрозуміти різницю поведінки між політиками PROPAGATION_REQUIRES_NEW
та PROPAGATION_NESTED
розповсюдженням. Мені здається, що в обох випадках поточний процес відкочується, але не вся транзакція. Будь-яка підказка?
Відповіді:
Дивіться це посилання: PROPAGATION_NESTED проти PROPAGATION_REQUIRES_NEW? Юрген Хеллер дуже добре це пояснює. - Весняний джерельний форум повністю поза мережею 28 лютого 2019 року, але відповідну частину статті ви можете прочитати у цитаті нижче
PROPAGATION_REQUIRES_NEW запускає нову, незалежну "внутрішню" транзакцію для даного обсягу. Ця транзакція буде здійснена або відкочена повністю незалежно від зовнішньої транзакції, мати свою власну область ізоляції, власний набір замків тощо. Зовнішня транзакція буде призупинена на початку внутрішньої та відновиться, коли внутрішня буде завершено. ...
PROPAGATION_NESTED, з іншого боку, починає "вкладену" транзакцію, яка є справжньою субтранзакцією існуючої. Що станеться, так це те, що точка збереження буде взята на початку вкладеної транзакції. Якщо вкладена транзакція не вдається, ми повернемося до цієї точки збереження. Вкладена транзакція є частиною зовнішньої транзакції, тому вона буде здійснена лише в кінці зовнішньої транзакції. ...
PROPAGATION_REQUIRES_NEW: використовує абсолютно незалежну транзакцію для кожної сфери дії, на яку впливає. У цьому випадку базові фізичні транзакції відрізняються і, отже, можуть здійснювати або відкочуватися самостійно, причому зовнішня транзакція не залежить від статусу відкоту внутрішньої транзакції.
PROPAGATION_NESTED: використовує одну фізичну транзакцію з кількома точками збереження, до яких вона може повернутися. Такі часткові відкоти дозволяють внутрішній області транзакцій викликати відкат для своєї області, причому зовнішня транзакція може продовжувати фізичну транзакцію, незважаючи на те, що деякі операції були відкатані. Це налаштування зазвичай відображається у точках збереження JDBC, тому буде працювати лише з транзакціями ресурсів JDBC.
перевірити весняну документацію
PROPAGATION_REQUIRES_NEW
: Зовнішня транзакція буде призупинена на початку внутрішньої та відновлена після завершення внутрішньої транзакції. Кожна внутрішня транзакція, яка здійснюється / відміняється після її завершення. PROPAGATION_NESTED
: Вкладена транзакція є частиною зовнішньої транзакції, тому вона буде здійснена лише в кінці зовнішньої транзакції.
Знайдіть різницю
1.) Use of NESTED Transaction
Виконувати в межах вкладеної транзакції, якщо поточна транзакція існує, поводитись як PROPAGATION_REQUIRED ще. Вкладена транзакція підтримується Spring
2.) Використання ПОТРІБНИХ транзакцій Підтримка поточної транзакції, створіть нову, якщо такої не існує. . Це означає для банківського домену, як зняти, внести, оновити транзакцію
3.) Використання транзакції REQUIRES_NEW Створіть нову транзакцію та призупиніть поточну транзакцію, якщо вона існує.