Java Spring: понимание @Transactional rollbackFor и разграничение транзакций - PullRequest
3 голосов
/ 10 февраля 2012

Я полагаю, что в качестве вызова Java используется следующая трассировка стека:

B.method2 (annotated with a plain @Transactional)
A.method1 (annotated with a plain @Transactional)
Main.main (starting point of the call, with no current transaction)

Я ожидаю, что транзакция запускается при вводе A.method1 - и транзакция будет зафиксирована (или откатана), когда A.method1осталось.Я также ожидаю, что та же транзакция будет использоваться в B.method2.

Выдается исключение RuntimeException из B.method2.Это исключение, которое «включено» в список для отката по умолчанию.Исключение перехватывается в A.method1, но оно выходит за границы @Transactional при выходе из B.method2.

Это мой вопрос: будет ли (текущая) транзакция отмечена для отката или нет?

1 Ответ

0 голосов
/ 10 февраля 2012

Режим распространения по умолчанию - REQUIRED, и метод2 будет использовать транзакцию, запущенную для метода1. В случае исключения эта транзакция будет помечена для отката, поэтому ничего не будет зафиксировано в базе данных. Вы можете получить UnexpectedRollbackException после method1.

Это нежелательное поведение, поскольку код, который запустил транзакцию (владеет ею), должен контролировать откат / принятие. Я бы реорганизовал ваш код, чтобы избежать такой возможности.

...