Подтвердить что ты не робот

EJB 3.0 - Вложенная транзакция!= Требуется Новое?

Я просто прочитал главу (10) "Операции над EJB 3.0" и теперь я запутался в вложенных транзакциях.

В книге говорится:

"Управляющий транзакцией, созданный EJB, не поддержка вложенных транзакций; он требует поддержки только плоских транзакций" (сайт 278, примечание)

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

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

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

Отношения Норман

4b9b3361

Ответ 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, это будет создана новая транзакция, которая будет отменена, а не "внешняя" транзакция.