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(无论如何都没有任何更改)
我想问一下关于 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 和 returnsStatelessFirst
调用StatelessSecond
,启动事务 C,并执行其工作StatelessSecond
提交事务 C 和 returnsStatelessFirst
完成并提交事务 A(无论如何都没有任何更改)