28

我刚刚阅读了“掌握 EJB 3.0”的事务第 (10) 章,现在我对嵌套事务感到困惑。

书上说

“EJB 定义的事务管理器不支持嵌套事务;它只需要支持平面事务。” (站点 278,注)

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

但是,如果我从 a 中调用“Requires New”注释方法,比如说“Required”注释 Methode,我所拥有的是嵌套事务,不是吗?我可以回滚或提交内部事务,而不影响外部事务。如果我想中止外部事务,我会抛出一个 EJBException 并且整个事务将被回滚。

那么仅仅是EJB 3.0规范不需要这种行为还是我误解了什么?我只是无法区分嵌套事务和所描述的行为。

问候诺曼

4

2 回答 2

47

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)
于 2012-05-30T17:18:54.073 回答
9

简单的答案是“外部”事务在新事务开始之前被挂起。这两个交易的命运没有任何联系,因此从所有意图和目的来看,一个交易不会嵌套在另一个交易中。

如果该REQUIRES_NEW方法抛出一个EJBException它将被回滚的是它创建的新事务,而不是“外部”事务。

于 2012-05-30T17:19:17.993 回答