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 откат будет выполнен по новой транзакции, а не по "внешней" транзакции.

Другие вопросы по тегам