2012-05-30 2 views
24

Я только что прочитал главу (10) транзакций «Освоение EJB 3.0», и теперь я смущен о вложенных транзакциях.EJB 3.0 - Вложенная транзакция! = Требуется Новое?

Книга говорит

«EJB-определенный менеджер транзакций не поддерживает вложенные транзакции, он требует поддержки только плоских транзакций.» (Сайт 278, примечание)

Этот факт описан не только в этой книге, я нашел это заявление в других книгах/веб-сайтах.

Но если я называю «Требуется новый» аннотированный метод из a, допустим, «Требуемый» аннотированный метод, то, что у меня есть вложенная транзакция, не так ли? Я могу откатить внутреннюю транзакцию или зафиксировать ее, не затрагивая внешнюю транзакцию. И если я хочу, чтобы внешняя транзакция была прервана, я отбрасываю исключение EJBException, и вся транзакция будет отменена.

Так оно и есть: не требуется по спецификации EJB 3.0 или я что-то не понял? Я просто не могу получить разницу между вложенными транзакциями и описанным поведением.

С уважением Norman

+0

«Внутренний» и «внешний» подразумевает, что если мы _commit_ внутренний, а затем _rollback_ внешний, то внутренняя часть как-то откатывается назад, даже если она уже была выполнена, но EJB не поддерживает это поведение: все транзакции совершены и откатываются независимо друг от друга. – DavidS

ответ

37

RequiresNew не создает вложенную транзакцию, так как первая транзакция приостанавливается в то время как вторая транзакция выполняется. Вложенный сделка выглядит следующим образом:

Nested transaction example 
> method1 - begin tran1 
    > method2 - begin tran2 
    workA 
    < method2 - commit tran2 
< method1 - rollback tran1 (tran2 also rolled back because it's 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) 
+1

Спасибо за этот ответ, теперь мне становится понятно :), но если я использую мандату или требуется для внутренней транзакции, она ведет себя как вложенная транзакция, хотя она принадлежит внешней транзакции, правильно? – NorRen

+5

Если вы используете обязательный или обязательный, то контейнер не делает ничего для внутреннего метода. Там нет «внутреннего»/«внешнего» разграничения транзакций, контейнер просто оставляет транзакцию в одиночку. –

+0

Итак, каков правильный термин для этого типа транзакций «RequiresNew»? Является ли это вложенной транзакцией верхнего уровня, как описано здесь http://publib.boulder.ibm.com/infocenter/txformp/v5r1/index.jsp?topic=%2Fcom.ibm.txseries510.doc%2Faetgpw0055.htm? – mmm

7

Простой ответ является «внешняя» транзакция приостанавливается до запуска новой транзакции. Судьбы двух транзакций никоим образом не связаны между собой, поэтому по всем целям и целям один не вложен в другой.

Если метод REQUIRES_NEW выбрасывает EJBException, это новая транзакция, которую она создала, которая будет откат, а не «внешняя» транзакция.

Смежные вопросы