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

EJB : Two stateless objects use two different transaction

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

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

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

当然可以。您可能会发现阅读有关 transaction attributes.

的内容很有用

如果在您的第​​一个 class(例如 StatelessFirst)中调用的方法具有事务类型 REQUIRED(默认值)或 REQUIRES_NEW,当它被调用时将发起一个新的交易。如果这随后在您的第二个 class(例如 StatelessSecond)中调用事务类型为 REQUIRES_NEW 的方法,则第一个事务将暂停,并在第二个方法执行时启动第二个事务。当 StatelessSecond 中的方法完成时,第二个事务提交,第一个事务恢复,控制权返回给 StatelessFirst

要在调用 StatelessSecond 之前提交第一个事务,您可以在 BMT 中使用 bean-managed transactions. This gives you full control over the transaction management, so in StatelessFirst you can begin a transaction, then commit then call StatelessSecond. If you go with this approach, note that you can't perform nested transactions

允许您留在 CMT 中的另一个选项是将事务行为从 StatelessFirst 中拉出到第三个 EJB 中,使用 REQUIRES_NEW。那么模式就是:

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