Я не могу понять разницу в поведении между политиками PROPAGATION_REQUIRES_NEW
и PROPAGATION_NESTED
политиками распространения. Мне кажется, что в обоих случаях откатывается текущий процесс, а не вся транзакция. Есть подсказка?
java
spring
transactions
propagation
Алексис Дюфреной
источник
источник
Ответы:
См. Эту ссылку: PROPAGATION_NESTED против PROPAGATION_REQUIRES_NEW? Юрген Хеллер очень хорошо это объяснил. - Spring Source Forum полностью офлайн с 28 февраля 2019 года, но вы можете прочитать соответствующую часть статьи в приведенной ниже цитате.
источник
PROPAGATION_REQUIRES_NEW: использует полностью независимую транзакцию для каждой затронутой области транзакции. В этом случае базовые физические транзакции различны и, следовательно, могут фиксироваться или откатываться независимо, при этом внешняя транзакция не зависит от состояния отката внутренней транзакции.
PROPAGATION_NESTED: использует одну физическую транзакцию с несколькими точками сохранения, к которым можно выполнить откат. Такие частичные откаты позволяют внутренней области транзакции запускать откат для своей области, при этом внешняя транзакция может продолжить физическую транзакцию, несмотря на то, что некоторые операции были отменены. Этот параметр обычно отображается на точки сохранения JDBC, поэтому будет работать только с транзакциями ресурсов JDBC.
проверьте весеннюю документацию
источник
PROPAGATION_REQUIRES_NEW
: Внешняя транзакция будет приостановлена в начале внутренней и возобновится после завершения внутренней. Каждая внутренняя транзакция фиксируется / откатывается после ее завершения.PROPAGATION_NESTED
: Вложенная транзакция является частью внешней транзакции, поэтому она будет зафиксирована только в конце внешней транзакции.Найдите разницу
1.) Use of NESTED Transaction
Выполнять внутри вложенной транзакции, если текущая транзакция существует, иначе вести себя как PROPAGATION_REQUIRED. Вложенная транзакция поддерживается Spring
2.) Использование ОБЯЗАТЕЛЬНОЙ транзакции Поддержите текущую транзакцию, создайте новую, если ее нет. . Это означает для банковского домена, например, снятие, депозит, обновление транзакции
3.) Использование транзакции REQUIRES_NEW Создайте новую транзакцию и приостановите текущую транзакцию, если таковая существует.
источник