【问题标题】:can transaction span multiple business methods with stateless + transaction scoped persistence context事务可以跨多个业务方法与无状态 + 事务范围的持久性上下文
【发布时间】:2018-08-06 19:51:23
【问题描述】:

鉴于 EJB(包括无状态)的默认持久性上下文是 TRANSACTION_SCOPED,据我所知,即使持久性上下文默认为 TRANSACTION_SCOPED 或者它只是特定于无状态 bean 持久化上下文的流行用例(即EXTENDED)

非常感谢参考支持的答案

编辑:

我要问的用例是这样的:

@Stateless
TransactionManagement(TransactionManagementType.BEAN)
public class MyStatelessBean(){
  @PersistenceContext(unitName="pU",type=PersistenceContextType.TRANSACTION) //default
  @Resource UserTransaction tx;

  public method1(){
    tx.begin();
    //bla bla bla
  }

  public method2(){
    tx.commit();
  }
}

在客户端:

callerMethod(){
   myStatelessBean.method1();
   myStatelessBean.method2();
}

从method1() 返回后事务是否会保持活动状态,然后可以在客户端对另一个方法method2() 的单独调用中提交?这种场景的用例是什么?

【问题讨论】:

    标签: java jpa ejb stateless-session-bean


    【解决方案1】:

    编辑:基于原始帖子的更改。由于您使用的是 BEAN 托管事务,因此您对事务及其范围负责。你有两种情况:

    您使用远程客户端,如果远程没有事务 UserTransaction 关联,那么这两个方法将在两个不同的上下文中执行。由于您的事务是 BEAN 管理的,因此容器不会接管。它是一个无状态会话 Bean,因此您不能保证第二个方法将在无状态 bean 的完全相同的实例上调用。所以你明白为什么答案是否定的了。

    您的客户实际上是另一个 EJB。只要您重用相同的事务管理器,例如使用 Hibernate 时的情况,这两种方法将参与同一个事务。

    您好,TRANSACTION_SCOPED 和 EXTENDED 范围的持久性上下文都可以跨越多个业务方法。在 TRANSACTION_SCOPED 持久性上下文的情况下,上下文被限制在事务的边界内。但是有一种叫做TRANSACTION PROPAGATION的东西,一个事务可以跨越多个业务方法。这就是为什么在文档中声明它可以跨越多种业务方法的原因。

    Here is a link of transaction propagation explained

    TRANSACTION_SCOPED 和 EXTENDED 的主要区别在于 EXTENDED 上下文可以跨越多个事务,这就是为什么它总是绑定到有状态会话 bean。一旦 Statefull 会话 bean 被移除,持久化上下文就会关闭。

    事务传播的一个非常简单的例子是:

    @EJB A类{

       @TransactionAttribute(TransactionAttributeType.REQUIRED)
       public methodA
    
    }
    
    @EJB
    class B {
    
       @TransactionAttribute(TransactionAttributeType.REQUIRED)
       public methodB()
    
    }
    

    在这种情况下,由于方法A 具有必需属性,方法B 具有必需属性,因此从A 调用B 将传播事务上下文。这里的关键点是,如果 EJB A 作为对 EntityManager 的访问权,并且 EJB B 对 EntityManager 有访问权,那么同一事务中的两个 EJB 的会话将是相同的。

    现在,如果我们将 methodB 声明切换为 @TransactionAttribute(TransactionAttributeType.NEW) ,则将在 methodA 中发起的事务并行创建一个新事务

    没有定义@TransactionAttribute 时的默认值是REQUIRED。因此,在正常情况下,所有交易都会传播。

    【讨论】:

    • 谢谢你的回答,实际上我不是在问传播......我的意思是我在编辑中提到的某个场景,如果你能帮助我将不胜感激
    • @osamayaccoub 当您在编辑中说客户端时,您是指另一个 EJB,还是指远程客户端。如果它是远程客户端,那么事务将不会跨越不同的业务方法 wi。如果客户端是另一个 EJB,则将传播事务上下文。
    • 感谢亚历克斯,但实际上我不太关心传播......我知道远程客户端没有传播......我很担心事务是否会超过方法回复然后再次调用...当我调用 method2() 时,事务是否仍然打开 .... 即是否允许使用上述配置在一个业务方法 (method1()) 中打开事务并在另一个 (method2()) 中关闭它鉴于 method2() 不会在 method1() 内部调用,而是在来自客户端的单独调用中调用?
    • @osamayaccoub 这两件事是相关的。再次阅读我在答案的编辑部分中写的内容。如果你有远程客户端,它不会比它更长寿。如果你有 EJB 作为客户端,那么你可以在同一个事务中使用这两种方法。我已经在答案的编辑中描述了这一点。
    猜你喜欢
    • 2013-07-14
    • 2012-03-23
    • 2010-09-16
    • 2012-11-02
    • 1970-01-01
    • 2016-06-18
    • 2016-04-10
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多