事务可以跨越多个具有无状态+事务范围的持久性上下文的业务方法吗
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_SCOPED 和 EXTENDED 范围的持久性上下文都可以跨越多个业务方法。在 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 时的默认值是必需的。因此,在正常情况下,所有交易都会被传播。
据我所知,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_SCOPED 和 EXTENDED 范围的持久性上下文都可以跨越多个业务方法。在 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 时的默认值是必需的。因此,在正常情况下,所有交易都会被传播。