1
- 我有一个EJB方法methodA(),它用TransactionAttribute.REQUIRES_NEW注释。方法A()调用远程服务器上运行的两个EJB方法(可以说methodB(),methodC())(方法IIOP通信)
- methodB()执行少量数据库插入操作。methodB也用TransactionAttribute.REQUIRED注释
- methodC()它也被注释为TransactionAttribute.REQUIRED,我让它抛出一些运行时异常来测试事务管理。
- 当我测试了methodA的事务管理,我发现以下..
在OpenEJB的日志,
TX REQUIRES_NEW:没有交易暂停。EJB CMT:事务回滚不回滚持久数据
TX REQUIRES_NEW:启动的事务...... gerenimo通过TransactionImp ....从执行的methodB
日志...完成。
methodC抛出一些RuntimeException的
TX REQUIRES_NEW:回滚事务...
============
即使它说事务正在回滚。通过methodA()保存的数据库记录仍然出现在数据库中。我希望数据库插入也应该回滚。
你能帮我理解可能会出错吗?
methodB和methodC在同一台服务器上,它们是第三方EJB ..文档说,如果我们提供一个事务,将在执行B和C时使用。现在我该如何确保分布式事务是从我的EJB实现的了methodA? –
好的,但即使methodB()和methodC()运行在同一台服务器上,情况也是一样的,因为methodA()是调用者。 如果methodB()调用methodC(),在这种情况下在C中抛出一个运行时exeption将会回滚在B中插入的数据,这是因为它们在相同的事务上下文中运行。 说实话,分布式事务是一个很大的话题,也许[this](http://stackoverflow.com/questions/4217270/what-is-a-distributed-transaction)可能是一个很好的起点。此外,请尝试根据您的应用程序服务器和EJB的版本查找示例。 –
感谢Gabriel,我做了一些阅读并意识到,可能是我在OPenEJB/Websphere上运行的EJB的一面。我没有必要做任何事情,因为它已经是Contrainer Managed,并且没有在我的EJB上定义的数据源(即methodA)。你知道我该如何确定远程EJB(methodB和methodC)是否支持分布式事务? –