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