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

25

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

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

"The EJB-defined transaction manager does not support nested transactions; it requires support for only flat transactions." (Site 278, Note)

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

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

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

С уважением Норман

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

Ваш Ответ

2   ответа
41

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

Nested transaction example
> method1 - begin tran1
  > method2 - begin tran2
    workA
  < method2 - commit tran2
< method1 - rollback tran1 (tran2 also rolled back because it's nested)

Instead, ТребуетсяНовое выглядит так:

EJB RequiresNew example
> method1 - begin tran1
  > method2 - suspend tran1, begin tran2
    workA
  < method2 - commit tran2, resume tran1
< method1 - rollback tran1 (tran2 remains committed)
Спасибо за этот ответ, теперь он мне становится понятен :), но если я использую мандату или требуется для внутренней транзакции, она ведет себя как вложенная транзакция, хотя и принадлежит внешней транзакции, верно? NorRen
Если вы используете обязательный или обязательный, контейнер ничего не делает для внутреннего метода. Там нет разницы между «внутренней» и «внешней» транзакцией, контейнер просто оставляет транзакцию в покое. Brett Kail
Да, EJB requireNew - это то же самое, что «вложенная транзакция верхнего уровня», описанная в этом документе. В EE нет ничего такого, что было бы «вложенной субтранзакцией», описанной в этом документ Brett Kail
@ MikeArgyriou Нет, для не вложенных (JTA) транзакций две транзакции полностью независимы: фиксация / откат одной транзакции не влияет на другую. Brett Kail
@ MikeArgyriou Нет, в этом сценарии метод корпоративного компонента повторно использует существующую транзакцию клиента, он не начинает новую транзакцию (вложенную или нет). На этом этапе вам, вероятно, следует открыть новый вопрос, а не задавать вопросы по этому старому ответу. Brett Kail
9

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

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

Похожие вопросы