事务可以跨越多个具有无状态+事务范围的持久性上下文的业务方法吗

can transaction span multiple business methods with stateless + transaction scoped persistence context

据我所知,EJB(包括无状态)的默认持久性上下文是 TRANSACTION_SCOPED,即使持久性上下文默认为 TRANSACTION_SCOPED,语句 'transaction can span multiple business methods with stateless bean' 是否有效,或者它仅特定于无状态 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() 的单独调用中提交?这种情况的用例是什么?

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

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

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

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

Here is a link of transaction propagation explained

TRANSACTION_SCOPED 和 EXTENDED 之间的主要区别在于 EXTENDED 上下文可以跨越多个事务,这就是它始终绑定到有状态会话 bean 的原因。删除有状态会话 bean 后,持久性上下文将关闭。

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

@EJB class一个{

   @TransactionAttribute(TransactionAttributeType.REQUIRED)
   public methodA

}

@EJB
class B {

   @TransactionAttribute(TransactionAttributeType.REQUIRED)
   public methodB()

}

在这种情况下,由于 methodA 具有 required 属性而 methodB 具有 required 属性,因此从 A 调用 B 将传播事务上下文。这里的关键点是,如果 EJB A 作为对 EntityManager 的访问权限,而 EJB B 都可以访问 EntityManager,则同一事务中的两个 EJB 的会话将是相同的。

现在,如果我们将 methodB 声明切换为 @TransactionAttribute(TransactionAttributeType.NEW),那么将与在 methodA

中启动的事务并行创建一个新事务

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