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

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


person Alexis Dufrenoy    schedule 12.09.2012    source источник
comment
См. эту ссылку: forum.springsource.org/archive/index.php/ t-16594.html -- Юрген Хеллер очень хорошо это объясняет.   -  person Ralph    schedule 12.09.2012
comment
@Ralph: спасибо, это именно то, что я искал. Вы должны добавить это как ответ.   -  person Alexis Dufrenoy    schedule 12.09.2012
comment
@Ralph: отлично, это был бы лучший ответ.   -  person Nandkumar Tekale    schedule 12.09.2012
comment
Итак, основное отличие состоит в том, что при вложенной политике транзакций транзакцию можно откатить в начало до текущей атомарной операции, что аналогично политике require_new, но зафиксировать ее можно будет только в конце всего процесса, что полностью отличается от политики require_new, где каждая атомарная операция будет зафиксирована, когда она завершится.   -  person Alexis Dufrenoy    schedule 12.09.2012
comment
ИМХО, эта разница понятнее на самом деле. Но REQUIRED и NESTED, которые ведут себя одинаково, сбивают с толку. У них есть некоторые различия в способностях, таких как savePoints.   -  person webyildirim    schedule 20.05.2016
comment
stackoverflow.com/questions/52918369/   -  person gstackoverflow    schedule 21.10.2018
comment
@Ralph, к сожалению, ваша ссылка больше не указывает на существующую страницу :(   -  person knittl    schedule 17.05.2020


Ответы (3)


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

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

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

person Ralph    schedule 12.09.2012
comment
Хороший ответ и хороший вопрос. Ваши комментарии и следующая ссылка были очень полезны для меня: byteslounge.com/tutorials/ - person yaki_nuka; 23.06.2014
comment
это правильное поведение, которое вы описали в propagation_requires_new? Потому что, как я проверил, он откатывает обе транзакции. - person eatSleepCode; 16.10.2015
comment
пожалуйста, уточните поведение внешней транзакции, если вложенная транзакция не удалась (она тоже не удалась?) и наоборот - person gstackoverflow; 10.01.2017
comment
Так что с вложенной транзакцией, когда внутренняя транзакция откатывается, внешняя продолжается в точке сохранения, тогда как при откате внешней все действия откатываются, верно? - person Wecherowski; 19.07.2017
comment
Есть отличия в поведении? - person gstackoverflow; 21.10.2018
comment
stackoverflow.com/questions/52918369/ - person gstackoverflow; 21.10.2018
comment
Этот справочник Spring объясняет это довольно подробно: docs.spring.io/spring-framework/docs/current/ - person bluelurker; 23.10.2020

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

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

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

person Nandkumar Tekale    schedule 12.09.2012
comment
Да, я понимаю разницу в подчеркивании, но я не вижу, как она будет вести себя по-другому: В одном случае я буду откатывать на предыдущую точку сохранения, в другом - текущую транзакцию, и не внешнюю, а на самом деле, в обоих случаях я вернусь к началу текущей атомарной операции и начну снова с этой точки. - person Alexis Dufrenoy; 12.09.2012
comment
@Traroth: две строки в ссылке @Ralph покажут разницу в поведении. PROPAGATION_REQUIRES_NEW : Внешняя транзакция будет приостановлена ​​в начале внутренней и возобновлена ​​после завершения внутренней. Каждая внутренняя транзакция фиксируется/откатывается после ее завершения. PROPAGATION_NESTED: вложенная транзакция является частью внешней транзакции, поэтому она будет зафиксирована только в конце внешней транзакции. - person Nandkumar Tekale; 12.09.2012
comment
Я согласен, поэтому я предложил ему сделать ответ из своего комментария. - person Alexis Dufrenoy; 12.09.2012
comment
@Traroth: я согласен с тобой. :) У него лучший ответ. - person Nandkumar Tekale; 12.09.2012

Пожалуйста, найдите разницу

1.) Use of NESTED Transaction

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

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

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

person Ankit    schedule 04.12.2015