EJB 3.0 - 嵌套事务!=需要新的吗?

Nor*_*Ren 25 transactions nested-transactions java-ee ejb-3.0

我刚刚阅读了"掌握EJB 3.0"的事务章节(10),现在我对嵌套事务感到困惑.

这本书说

"EJB定义的事务管理器不支持嵌套事务;它只需要支持平面事务." (网站278,注)

这个事实不仅在本书中有所描述,我在其他书籍/网站上发现了这一说法.

但是,如果我从a调用一个"Requires New"注释方法,让我们说"必需"注释Methode,我所拥有的是一个嵌套事务,不是吗?我可以回滚内部事务或提交它,而不会影响外部事务.如果我想要中止外部事务,我会抛出一个EJBException,整个事务将被回滚.

那么,只是EJB 3.0规范不要求这种行为,或者我误解了什么?我无法区分嵌套事务和描述的行为.

关心诺曼

Bre*_*ail 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)
Run Code Online (Sandbox Code Playgroud)

相反,RequiresNew看起来像这样:

EJB RequiresNew example
> method1 - begin tran1
  > method2 - suspend tran1, begin tran2
    workA
  < method2 - commit tran2, resume tran1
< method1 - rollback tran1 (tran2 remains committed)
Run Code Online (Sandbox Code Playgroud)

  • 如果使用mandatory或required,则容器不会对inner方法执行任何操作.没有"内部"/"外部"事务区别,容器只留下事务. (5认同)
  • @MikeArgyriou不,在那种情况下,企业bean方法重用客户端的现有事务,它不会开始新的事务(嵌套或其他).此时,您可能应该打开一个新问题,而不是在这个旧答案上提问. (2认同)

Dav*_*ins 9

简单的答案是"外部"事务在新事务开始之前被暂停.两个事务的命运没有任何联系,所以所有意图和目的都不会嵌套到另一个事务中.

如果REQUIRES_NEW方法抛出EJBException它,则它创建的新事务将被回滚,而不是"外部"事务.