EJB:两个无状态对象使用两个不同的事务

时间:2015-08-01 17:14:51

标签: java jpa ejb eclipselink jta

我想问一下关于EJB的问题。我正在使用JPA的eclipselink。

我的代码中的无状态对象中有两个无状态对象。

这两个无状态对象可能使用两个不同的事务吗?

1 个答案:

答案 0 :(得分:1)

绝对。您可能会发现阅读transaction attributes

非常有用

如果第一个类中的被调用方法(比如StatelessFirst)具有事务类型REQUIRED(默认值)或REQUIRES_NEW,则在调用它时将启动新事务。如果这样调用第二个类中的方法(例如StatelessSecond)并使用事务类型REQUIRES_NEW,则第一个事务将被挂起,第二个事务将在第二个方法执行时启动。当StatelessSecond中的方法完成,第二个事务提交时,将恢复第一个事务,并将控制权传递回StatelessFirst

要在调用StatelessSecond之前进行第一次事务提交,可以使用bean-managed transactions。这使您可以完全控制事务管理,因此在StatelessFirst中您可以开始事务,然后提交然后调用StatelessSecond。如果您采用这种方法,请注意BMT中的can't perform nested transactions

允许您保持在CMT内的另一个选项是将事务行为从StatelessFirst拉出到具有REQUIRES_NEW的第三个EJB中。然后模式是:

  • 客户致电StatelessFirst,启动交易A
  • StatelessFirst调用NewBean,启动事务B,并执行一些工作
  • NewBean提交事务B并返回
  • StatelessFirst调用StatelessSecond,启动事务C并执行其工作
  • StatelessSecond提交事务C并返回
  • StatelessFirst完成,并提交事务A(无论如何都没有任何更改)