【问题标题】:EJB : Two stateless objects use two different transactionEJB:两个无状态对象使用两个不同的事务
【发布时间】:2015-10-24 04:42:06
【问题描述】:

我想问有关 EJB 的问题。我正在使用 JPA 的 eclipselink。

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

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

【问题讨论】:

    标签: java jpa ejb eclipselink jta


    【解决方案1】:

    当然。您可能会发现阅读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,启动事务A
    • StatelessFirst 调用 NewBean,后者启动事务 B,并执行一些工作
    • NewBean 提交事务 B 并返回
    • StatelessFirst 调用 StatelessSecond,后者启动事务 C,并执行其工作
    • StatelessSecond 提交事务 C 并返回
    • StatelessFirst 完成并提交事务 A(无论如何都没有任何更改)

    【讨论】:

    • 好吧,我实际上已经在 1 天前声明了这两个 java 方法 require_new。然而。我希望 statelessfirst 在执行 statelesssecond 之前应该提交。不像你写的那样——>第一个事务被挂起,第二个事务在第二个方法执行时启动。
    • 啊,好的,那么您将需要 bean 管理的事务。我会将其编辑到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 2012-06-08
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2011-09-08
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多