Все, что я знаю об этом исключении, из документации Spring и некоторых сообщений форума с frostrated разработчиками, вставляющими огромные отслеживания стека и никакие ответы.
Из документации Spring:
Брошенный, когда попытка фиксировать транзакцию привела к неожиданному откату
Я хочу понять раз и навсегда
Точно, что вызывает его?
Как избежать его? там какая-либо лучшая практика должна избежать его?
] Прокрутите немного назад в журнал (или увеличьте его размер в буфере) и вы увидите, что именно вызвало исключение. [
] [] Если его там нет, проверьте методы [] getMostSpecificCause()[
] и [] getRootCause()[
] из [] UnexpectedRollbackException[
] - они могут быть полезны.[
] Я нашел это ответом на остальную часть вопроса: []https://jira.springsource.org/browse/SPR-3452[][
] [] []]Наверное, нам нужно дифференцировать между "логическими" областями действия и "физические" транзакции здесь...[
] []То, что PROPAGATION_REQUIRED создает - это логический диапазон операций для каждого метод, к которому он применяется. Каждый такой логический диапазон операций может индивидуально принимать решение об откате статус, с внешней сделкой область применения логически независима от внутренний объем сделки. Из конечно, в случае стандартного ПРОПАГАЦИОННОЕ_РЕКОМЕНДАЦИОННОЕ Поведение, они будет нанесён на тот же физический сделка. Значит, маркер с откатом установленный во внутреннем круге сделок влияет на внешнюю сделку шанс действительно совершить что-то. Однако, поскольку сфера действия внешней сделки не решаться на сам откат, на откат (бесшумно вызванный внутренний объём сделок) приходит неожиданный на этом уровне - то есть почему Неожиданная перемотка назад бросается.[
] []PROPAGATION_REQUIRES_NEW, напротив, использует полностью независимый операция для каждого затрагиваемого лица объём сделок. В этом случае основные физические транзакции быть другим и, следовательно, может совершить или откат независимо, с внешним сделка, не затронутая внутренним статус отката транзакции.[
] []PROPAGATION_NESTED опять другой. в том смысле, что он использует один физический транзакция с несколькими точками сохранения к которому он может вернуться. Такой частичный откаты позволяют провести внутреннюю сделку прицел для запуска отката сфера действия, с внешней сделкой возможность продолжать физическую транзакция, несмотря на некоторые операции будучи свернутым назад. Это обычно наносится на точки сохранения JDBC, так что будет работать только с ресурсом JDBC сделки (весенний DataSourceTransactionManager).[
] []Завершить обсуждение: UnexpectedRollbackException может также быть брошенным без приложения когда-либо установив маркер отката сам по себе. Вместо этого, сделка инфраструктура, возможно, решила, что единственный возможный результат - откат, в связи с ограничениями в текущее состояние сделки. Это особенно актуально с XA сделки.[
] []Как я предлагал выше, бросая исключение при внутренней сделке сфера охвата, а затем поймать это исключение в внешний диапазон и его перевод в беззвучный наборОдиночный звонок должно сработать для твоего сценария. A звонящий по внешней сделке будет никогда не видел исключений. Так как ты только беспокоиться о таких тихих откатах из-за особых требований навязанный звонящим, я бы даже утверждать, что правильная архитектура решением является использование исключений внутри сервисный уровень, а также для перевода исключения в бесшумных откатах на уровне служебного фасада (справа прежде чем вернуться к этому специальному ...[
] [] Поскольку ваша проблема, возможно, не в том, чтобы... только об исключениях отката, но скорее о любых выброшенных исключениях с вашего уровня обслуживания, вы могли бы даже использовать стандартные исключения откаты по всему тебе служебный уровень, а затем ловить и вести журнал такие исключения после сделки уже завершено, в некоторых адаптирующий служебный фасад, который переводит ваш сервисный уровень исключения в ошибках пользовательского интерфейса состояния.[
] []Juergen[
] [