【发布时间】:2015-10-24 04:42:06
【问题描述】:
我想问有关 EJB 的问题。我正在使用 JPA 的 eclipselink。
我的代码中一个无状态对象中有两个无状态对象。
这两个无状态对象可能使用两个不同的事务吗?
【问题讨论】:
标签: java jpa ejb eclipselink jta
我想问有关 EJB 的问题。我正在使用 JPA 的 eclipselink。
我的代码中一个无状态对象中有两个无状态对象。
这两个无状态对象可能使用两个不同的事务吗?
【问题讨论】:
标签: java jpa ejb eclipselink jta
当然。您可能会发现阅读transaction attributes 很有用。
如果你的第一个类中被调用的方法(比如StatelessFirst)的事务类型为REQUIRED(默认)或REQUIRES_NEW,当它被调用时,它将启动一个新事务。如果这随后调用事务类型为REQUIRES_NEW 的第二个类中的方法(例如StatelessSecond),则在执行第二个方法时将暂停第一个事务并启动第二个事务。当StatelessSecond 中的方法完成时,第二个事务提交,第一个事务恢复,控制权交还给StatelessFirst。
要在调用StatelessSecond 之前进行第一次事务提交,您可以使用bean-managed transactions。这使您可以完全控制事务管理,因此在StatelessFirst 中您可以开始事务,然后提交,然后调用StatelessSecond。如果您采用这种方法,请注意您在 BMT 中 can't perform nested transactions。
另一个允许您留在 CMT 中的选项是将事务行为从 StatelessFirst 拉到第三个 EJB 中,使用 REQUIRES_NEW。那么模式是:
StatelessFirst,启动事务AStatelessFirst 调用 NewBean,后者启动事务 B,并执行一些工作NewBean 提交事务 B 并返回StatelessFirst 调用 StatelessSecond,后者启动事务 C,并执行其工作StatelessSecond 提交事务 C 并返回StatelessFirst 完成并提交事务 A(无论如何都没有任何更改)【讨论】: