EJB 3.0 - вложенная транзакция!= Требуется новая?
Я только что прочитал главу "Транзакции" (10) "Mastering EJB 3.0", и теперь я запутался во вложенных транзакциях.
Книга говорит
"Менеджер транзакций, определенный EJB, не поддерживает вложенные транзакции; ему требуется поддержка только плоских транзакций". (Сайт 278, Примечание)
Этот факт описан не только этой книгой, я нашел это утверждение в других книгах / сайтах.
Но если я вызову аннотированный метод "Требуется новый" из, скажем, "Обязательного" аннотированного метода, я получу вложенную транзакцию, не так ли? Я могу откатить внутреннюю транзакцию или зафиксировать ее, не затрагивая внешнюю транзакцию. И если я хочу, чтобы внешняя транзакция была прервана, я возвращаю исключение EJBException, и вся транзакция будет откатываться.
Так это просто, что такое поведение не требуется спецификацией EJB 3.0, или я что-то неправильно понял? Я просто не могу понять разницу между вложенными транзакциями и описанным поведением.
С уважением, Норман
2 ответа
RequireNew не создает вложенную транзакцию, поскольку первая транзакция приостанавливается во время выполнения второй транзакции. Вложенная транзакция выглядит так:
Nested transaction example
> method1 - begin tran1
> method2 - begin tran2
workA
< method2 - commit tran2
< method1 - rollback tran1 (tran2 also rolled back because it's nested)
Вместо этого Требуется Новый выглядит следующим образом:
EJB RequiresNew example
> method1 - begin tran1
> method2 - suspend tran1, begin tran2
workA
< method2 - commit tran2, resume tran1
< method1 - rollback tran1 (tran2 remains committed)
Ответ прост: "внешняя" транзакция приостановлена до начала новой транзакции. Судьбы двух транзакций никоим образом не связаны, так что, по сути, одно не вкладывается в другое.
Если REQUIRES_NEW
метод бросает EJBException
откат будет выполнен по новой транзакции, а не по "внешней" транзакции.