Я не могу понять разницу в поведении между политиками PROPAGATION_REQUIRES_NEW
и PROPAGATION_NESTED
политиками распространения. Мне кажется, что в обоих случаях откатывается текущий процесс, а не вся транзакция. Есть подсказка?
Я не могу понять разницу в поведении между политиками PROPAGATION_REQUIRES_NEW
и PROPAGATION_NESTED
политиками распространения. Мне кажется, что в обоих случаях откатывается текущий процесс, а не вся транзакция. Есть подсказка?
Ответы:
См. Эту ссылку: PROPAGATION_NESTED против PROPAGATION_REQUIRES_NEW? Юрген Хеллер очень хорошо это объяснил. - Spring Source Forum полностью офлайн с 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 Создайте новую транзакцию и приостановите текущую транзакцию, если таковая существует.