Подтвердить что ты не робот

Различия между require_new и вложенным распространением в транзакции Spring

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

4b9b3361

Ответ 1

Смотрите эту ссылку: PROPAGATION_NESTED против PROPAGATION_REQUIRES_NEW? Юрген Холлер очень хорошо объясняет это

PROPAGATION_REQUIRES_NEW запускает новую независимую "внутреннюю" транзакцию для данного объема. Эта транзакция будет совершена или откат полностью независим от внешней транзакции, имея свои собственные объем изоляции, собственный набор блокировок и т.д. Внешняя транзакция будет подвешивается в начале внутреннего и возобновляется после внутренний завершен....

PROPAGATION_NESTED, с другой стороны, запускает "вложенную" транзакцию, который является истинным субтранзакцией существующего. Что случится заключается в том, что точка сохранения будет взята в начале вложенного сделка. Если вложенная транзакция не удалась, мы вернемся к это точка сохранения. Вложенная транзакция является частью внешней транзакция, поэтому она будет совершена только в конце внешнего сделка....

Ответ 2

PROPAGATION_REQUIRES_NEW: использует полностью независимую транзакцию для каждой затронутой области транзакции. В этом случае основные физические транзакции различны и, следовательно, могут совершать или откатываться независимо друг от друга, при этом внешняя транзакция не зависит от состояния отката внутренней транзакции.

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

проверить spring документация

Ответ 3

Найдите разницу

1.) Use of NESTED Transaction

Выполнять внутри вложенной транзакции, если существует текущая транзакция, вести себя как PROPAGATION_REQUIRED else. Вложенная транзакция поддерживается Spring

2.) Использование ТРЕБУЕМОЙ Сделки Поддержите текущую транзакцию, создайте новую, если она не существует. , Это означает для банковского домена, как снятие, депозит, обновление транзакции

3.) Использование транзакции REQUIRES_NEW Создайте новую транзакцию и приостановите текущую транзакцию, если она существует.