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

时间:2012-05-30 13:59:42

标签: java-ee transactions ejb-3.0 nested-transactions

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

这本书说

  

“EJB定义的事务管理器没有   支持嵌套事务;它只需要支持平板交易。“(Site 278,Note)

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

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

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

此致 诺曼

2 个答案:

答案 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,则它创建的新事务将被回滚,而不是“外部”事务。