单例中具有上下文类型 TRANSACTION 的 EntityManager 是否会加入外部 bean 管理的事务?
Will an EntityManager with context type TRANSACTION in a Singleton join an external bean-managed transaction?
假设我有一个 Singleton
bean,里面有一个 EntityManager
。单例还指定(在方法或 class 级别上)事务属性 REQUIRED
。实体管理器是通过指定持久性上下文类型 TRANSACTION
的 @PersistenceContext
注入获得的。出于所有意图和目的,如果使用现有事务调用此单例上的方法,则实体管理器应加入该事务或可能提供一个已存在的通过代理链接到该事务的方法。如果在事务之外调用此类方法,将在方法调用期间启动新事务。
现在假设我们有第二个 bean,它使用 bean 管理的事务并注入单例。如果它显式地启动一个用户事务然后在单例上调用一个方法,那么该方法中的实体管理器是否会加入该用户事务?从 bean 管理的事务上下文跳转到容器管理的事务上下文是否有效?我知道反过来不行,会形成障碍。
单例class:
@Singleton
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class PersistenceSingleton {
@PersistenceContext(unitName = "test", type = PersistenceContextType.TRANSACTION)
private EntityManager em;
public void doStuff() {
// perform actions with the entity manager that imply changes in the database
}
}
具有用户事务的 bean(也可能是无状态的或有状态的):
@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class PersistenceFacade {
@EJB
private PeristenceSingleton ps;
@Resource
private UserTransaction userTx;
public void doStuff() {
userTx.begin();
ps.doStuff();
userTx.commit();
}
}
在 PersistenceSingleton
上调用 doStuff()
时,是否考虑了在 PersistenceFacade
的方法 doStuff()
中启动的事务?实体管理器是否自动加入事务并在并发访问期间按照事务隔离的预期行为?
UserTransaction 用于更改默认事务划分,但我们仍然控制 JTA 事务。
If you have UserTransaction you can start demarcating what is to be executed within the transaction. Notice that you’re still controlling
the JTA transactions
因此持久性上下文传播规则将应用于 UserTransaction 划分。
专业 JPA 书说:
When a method is invoked on the transaction-scoped entity manager, it
must first see whether there is a propagated persistence context. If
one exists, the entity manager uses this persistence context to carry
out the operation. All subsequent transaction-scoped entity manager
operations, in this component or any other, will thereafter use this
newly created persistence context. This behavior works independently
of whether container-managed or bean-managed transaction demarcation
has been used.
你的问题的答案是肯定的(第一个问题)
Does the entity manager automatically join the transaction and behave
as expected from transaction isolation during concurrent access?
实体管理器检查传播的持久性上下文是否存在并使用它。
假设我有一个 Singleton
bean,里面有一个 EntityManager
。单例还指定(在方法或 class 级别上)事务属性 REQUIRED
。实体管理器是通过指定持久性上下文类型 TRANSACTION
的 @PersistenceContext
注入获得的。出于所有意图和目的,如果使用现有事务调用此单例上的方法,则实体管理器应加入该事务或可能提供一个已存在的通过代理链接到该事务的方法。如果在事务之外调用此类方法,将在方法调用期间启动新事务。
现在假设我们有第二个 bean,它使用 bean 管理的事务并注入单例。如果它显式地启动一个用户事务然后在单例上调用一个方法,那么该方法中的实体管理器是否会加入该用户事务?从 bean 管理的事务上下文跳转到容器管理的事务上下文是否有效?我知道反过来不行,会形成障碍。
单例class:
@Singleton
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class PersistenceSingleton {
@PersistenceContext(unitName = "test", type = PersistenceContextType.TRANSACTION)
private EntityManager em;
public void doStuff() {
// perform actions with the entity manager that imply changes in the database
}
}
具有用户事务的 bean(也可能是无状态的或有状态的):
@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class PersistenceFacade {
@EJB
private PeristenceSingleton ps;
@Resource
private UserTransaction userTx;
public void doStuff() {
userTx.begin();
ps.doStuff();
userTx.commit();
}
}
在 PersistenceSingleton
上调用 doStuff()
时,是否考虑了在 PersistenceFacade
的方法 doStuff()
中启动的事务?实体管理器是否自动加入事务并在并发访问期间按照事务隔离的预期行为?
UserTransaction 用于更改默认事务划分,但我们仍然控制 JTA 事务。
If you have UserTransaction you can start demarcating what is to be executed within the transaction. Notice that you’re still controlling the JTA transactions
因此持久性上下文传播规则将应用于 UserTransaction 划分。
专业 JPA 书说:
When a method is invoked on the transaction-scoped entity manager, it must first see whether there is a propagated persistence context. If one exists, the entity manager uses this persistence context to carry out the operation. All subsequent transaction-scoped entity manager operations, in this component or any other, will thereafter use this newly created persistence context. This behavior works independently of whether container-managed or bean-managed transaction demarcation has been used.
你的问题的答案是肯定的(第一个问题)
Does the entity manager automatically join the transaction and behave as expected from transaction isolation during concurrent access?
实体管理器检查传播的持久性上下文是否存在并使用它。