我刚刚阅读了“掌握EJB 3.0”的事务章节(10),现在我对嵌套事务感到困惑。
这本书说
“EJB定义的事务管理器没有 支持嵌套事务;它只需要支持平板交易。“(Site 278,Note)
这个事实不仅在本书中有所描述,我在其他书籍/网站上发现了这一说法。
但是,如果我从a调用“Requires New”注释方法,让我们说“必需”带注释的Methode,我所拥有的是嵌套事务,不是吗?我可以回滚内部事务或提交它,而不会影响外部事务。 如果我想要中止外部事务,我会抛出一个EJBException,整个事务将被回滚。
这只是EJB 3.0规范的这种行为不是必需的还是我误解了什么?我无法区分嵌套事务和描述的行为。
此致 诺曼
答案 0 :(得分:41)
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 :(得分:9)
简单回答是“外部”交易在新交易开始前暂停。两个交易的命运没有任何联系,所以所有意图和目的都不会嵌套到另一个交易中。
如果REQUIRES_NEW
方法抛出EJBException
,则它创建的新事务将被回滚,而不是“外部”事务。