UnexpectedRollbackException - полный анализ сценариев

Все, что я знаю об этом исключении, из документации Spring и некоторых сообщений форума с frostrated разработчиками, вставляющими огромные отслеживания стека и никакие ответы.

Из документации Spring:

Брошенный, когда попытка фиксировать транзакцию привела к неожиданному откату

Я хочу понять раз и навсегда

  1. Точно, что вызывает его?

    • Где откат происходил? в коде Сервера приложений или в Базе данных?
    • Это было вызвано из-за определенного базового исключения (например, что-то от java.sql.*)?
    • Это связано для Спящего режима? Это связано с Менеджером транзакций Spring (не JTA в моем случае)?
  2. Как избежать его? там какая-либо лучшая практика должна избежать его?

  3. Как отладить его? это, кажется, трудно воспроизвести, какие-либо доказанные способы диагностировать его?

20
задан Valentin Rocher 9 January 2010 в 13:00
поделиться

2 ответа

[

] Прокрутите немного назад в журнал (или увеличьте его размер в буфере) и вы увидите, что именно вызвало исключение. [

] [

] Если его там нет, проверьте методы [] getMostSpecificCause()[] и [] getRootCause()[] из [] UnexpectedRollbackException[] - они могут быть полезны.[

].
8
ответ дан 30 November 2019 в 00:59
поделиться
[

] Я нашел это ответом на остальную часть вопроса: []https://jira.springsource.org/browse/SPR-3452[][

] [
] [

]Наверное, нам нужно дифференцировать между "логическими" областями действия и "физические" транзакции здесь...[

] [

]То, что PROPAGATION_REQUIRED создает - это логический диапазон операций для каждого метод, к которому он применяется. Каждый такой логический диапазон операций может индивидуально принимать решение об откате статус, с внешней сделкой область применения логически независима от внутренний объем сделки. Из конечно, в случае стандартного ПРОПАГАЦИОННОЕ_РЕКОМЕНДАЦИОННОЕ Поведение, они будет нанесён на тот же физический сделка. Значит, маркер с откатом установленный во внутреннем круге сделок влияет на внешнюю сделку шанс действительно совершить что-то. Однако, поскольку сфера действия внешней сделки не решаться на сам откат, на откат (бесшумно вызванный внутренний объём сделок) приходит неожиданный на этом уровне - то есть почему Неожиданная перемотка назад бросается.[

] [

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

] [

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

] [

]Завершить обсуждение: UnexpectedRollbackException может также быть брошенным без приложения когда-либо установив маркер отката сам по себе. Вместо этого, сделка инфраструктура, возможно, решила, что единственный возможный результат - откат, в связи с ограничениями в текущее состояние сделки. Это особенно актуально с XA сделки.[

] [

]Как я предлагал выше, бросая исключение при внутренней сделке сфера охвата, а затем поймать это исключение в внешний диапазон и его перевод в беззвучный наборОдиночный звонок должно сработать для твоего сценария. A звонящий по внешней сделке будет никогда не видел исключений. Так как ты только беспокоиться о таких тихих откатах из-за особых требований навязанный звонящим, я бы даже утверждать, что правильная архитектура решением является использование исключений внутри сервисный уровень, а также для перевода исключения в бесшумных откатах на уровне служебного фасада (справа прежде чем вернуться к этому специальному ...[

] [

] Поскольку ваша проблема, возможно, не в том, чтобы... только об исключениях отката, но скорее о любых выброшенных исключениях с вашего уровня обслуживания, вы могли бы даже использовать стандартные исключения откаты по всему тебе служебный уровень, а затем ловить и вести журнал такие исключения после сделки уже завершено, в некоторых адаптирующий служебный фасад, который переводит ваш сервисный уровень исключения в ошибках пользовательского интерфейса состояния.[

] [

]Juergen[

] [
]
12
ответ дан 30 November 2019 в 00:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: