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

80

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

Алексис Дюфреной
источник
7
См. Эту ссылку: forum.springsource.org/archive/index.php/t-16594.html - Юрген Хеллер очень хорошо это объяснил
Ральф
@ Ральф: спасибо, это именно то, что я искал. Вы должны добавить это как ответ.
Alexis Dufrenoy
1
@ Ральф: отлично, это был бы лучший ответ.
Нандкумар Текале
1
Таким образом, основное различие заключается в том, что с политикой вложенных транзакций транзакцию можно откатить до начала текущей атомарной операции, что аналогично политике requires_new, но она будет зафиксирована только в конце всего процесса, который полностью отличается от политики requires_new, в которой каждая атомарная операция будет выполняться по завершении.
Alexis Dufrenoy
1
@Ralph, к сожалению, ваша ссылка больше не указывает на существующую страницу :(
knittl

Ответы:

117

См. Эту ссылку: PROPAGATION_NESTED против PROPAGATION_REQUIRES_NEW? Юрген Хеллер очень хорошо это объяснил. - Spring Source Forum полностью офлайн с 28 февраля 2019 года, но вы можете прочитать соответствующую часть статьи в приведенной ниже цитате.

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

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

Ральф
источник
Хороший ответ и хороший вопрос. Ваши комментарии и следующая ссылка были мне очень полезны: byteslounge.com/tutorials/…
yaki_nuka
это правильное поведение, которое вы описали в procation_requires_new? Потому что, как я проверял, откатываются обе транзакции.
eatSleepCode
поясните, пожалуйста, поведение внешней транзакции, если вложенная транзакция завершится сбоем (будет ли она тоже
терпеть
Итак, с вложенной транзакцией, когда внутренняя транзакция откатывается, внешняя продолжает работу в точке сохранения, тогда как при откате внешней транзакции откатываются все действия, верно?
Wecherowski
Есть ли различия в поведении?
gstackoverflow
14

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

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

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

Нандкумар Текале
источник
2
Да, я понимаю разницу в подчеркивании, но я не вижу, как она будет вести себя по-другому: в одном случае я откатываю a до предыдущей точки сохранения, в другом я откатываю текущую транзакцию, а не внешнюю, но фактически, в обоих случаях я вернусь к началу текущей атомарной операции и начну снова с этой точки.
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 Создайте новую транзакцию и приостановите текущую транзакцию, если таковая существует.

Анкит
источник