Я не могу понять разницу в поведении между политиками распространения PROPAGATION_REQUIRES_NEW
и PROPAGATION_NESTED
. Мне кажется, что в обоих случаях откатывается текущий процесс, а не вся транзакция. Любая подсказка?
Различия между require_new и вложенным распространением в транзакциях Spring
Ответы (3)
См. эту ссылку: PROPAGATION_NESTED против PROPAGATION_REQUIRES_NEW? Юрген Хеллер объясняет это очень хорошо. -- Форум Spring Source полностью отключен с 28 февраля 2019 г., но вы можете прочитать соответствующую часть статьи в цитате ниже
PROPAGATION_REQUIRES_NEW запускает новую, независимую «внутреннюю» транзакцию для данной области. Эта транзакция будет зафиксирована или отменена полностью независимо от внешней транзакции, имея собственную область изоляции, собственный набор блокировок и т. д. Внешняя транзакция будет приостановлена в начале внутренней транзакции и возобновлена после завершения внутренней. завершенный. ...
PROPAGATION_NESTED, с другой стороны, запускает «вложенную» транзакцию, которая является настоящей подтранзакцией существующей. Что произойдет, так это то, что точка сохранения будет взята в начале вложенной транзакции. Если вложенная транзакция завершится неудачно, мы вернемся к этой точке сохранения. Вложенная транзакция является частью внешней транзакции, поэтому она будет зафиксирована только в конце внешней транзакции. ...
PROPAGATION_REQUIRES_NEW: использует полностью независимую транзакцию для каждой затрагиваемой области транзакции. В этом случае лежащие в основе физические транзакции отличаются и, следовательно, могут фиксировать или откатывать независимо друг от друга, при этом на внешнюю транзакцию не влияет состояние отката внутренней транзакции.
PROPAGATION_NESTED: использует одну физическую транзакцию с несколькими точками сохранения, к которым можно откатиться. Такие частичные откаты позволяют внутренней области транзакции инициировать откат для своей области, при этом внешняя транзакция может продолжить физическую транзакцию, несмотря на откат некоторых операций. Этот параметр обычно сопоставляется с точками сохранения JDBC, поэтому будет работать только с транзакциями ресурсов JDBC.
проверьте документацию Spring а>
PROPAGATION_REQUIRES_NEW
: Внешняя транзакция будет приостановлена в начале внутренней и возобновлена после завершения внутренней. Каждая внутренняя транзакция фиксируется/откатывается после ее завершения. PROPAGATION_NESTED
: вложенная транзакция является частью внешней транзакции, поэтому она будет зафиксирована только в конце внешней транзакции.
- person Nandkumar Tekale; 12.09.2012
Пожалуйста, найдите разницу
1.) Use of NESTED Transaction
Выполнять во вложенной транзакции, если текущая транзакция существует, в противном случае вести себя как PROPAGATION_REQUIRED. Вложенная транзакция поддерживается Spring
2.) Использование НЕОБХОДИМОЙ транзакции Поддержите текущую транзакцию, создайте новую, если таковой не существует. . Это означает для банковского домена, например, снятие, депозит, обновление транзакции.
3.) Использование транзакции REQUIRES_NEW Создайте новую транзакцию и приостановите текущую транзакцию, если она существует.