2013-06-22 40 views
1
  1. 我有一个EJB方法methodA(),它用TransactionAttribute.REQUIRES_NEW注释。方法A()调用远程服务器上运行的两个EJB方法(可以说methodB(),methodC())(方法IIOP通信)
  2. methodB()执行少量数据库插入操作。methodB也用TransactionAttribute.REQUIRED注释
  3. methodC()它也被注释为TransactionAttribute.REQUIRED,我让它抛出一些运行时异常来测试事务管理。
  4. 当我测试了methodA的事务管理,我发现以下..

在OpenEJB的日志,

  1. TX REQUIRES_NEW:没有交易暂停。EJB CMT:事务回滚不回滚持久数据

  2. TX REQUIRES_NEW:启动的事务...... gerenimo通过TransactionImp ....从执行的methodB

  3. 日志...完成。

  4. methodC抛出一些RuntimeException的

  5. TX REQUIRES_NEW:回滚事务...

============

即使它说事务正在回滚。通过methodA()保存的数据库记录仍然出现在数据库中。我希望数据库插入也应该回滚。

你能帮我理解可能会出错吗?

回答

0

问题是,方法A,B和C在不同的事务上下文中运行,因此,有三种不同的独立事务在你的过程中独立执行。

每个应用程序服务器都定义一个事务上下文,它由部署在同一服务器中的EJB共享。

当您调用运行在远程服务器上的EJB时,不会使用当前事务。

如果要通过不同的远程服务器共享相同的事务,则必须实施分布式事务。

+0

methodB和methodC在同一台服务器上,它们是第三方EJB ..文档说,如果我们提供一个事务,将在执行B和C时使用。现在我该如何确保分布式事务是从我的EJB实现的了methodA? –

+0

好的,但即使methodB()和methodC()运行在同一台服务器上,情况也是一样的,因为methodA()是调用者。 如果methodB()调用methodC(),在这种情况下在C中抛出一个运行时exeption将会回滚在B中插入的数据,这是因为它们在相同的事务上下文中运行。 说实话,分布式事务是一个很大的话题,也许[this](http://stackoverflow.com/questions/4217270/what-is-a-distributed-transaction)可能是一个很好的起点。此外,请尝试根据您的应用程序服务器和EJB的版本查找示例。 –

+0

感谢Gabriel,我做了一些阅读并意识到,可能是我在OPenEJB/Websphere上运行的EJB的一面。我没有必要做任何事情,因为它已经是Contrainer Managed,并且没有在我的EJB上定义的数据源(即methodA)。你知道我该如何确定远程EJB(methodB和methodC)是否支持分布式事务? –