在使用@Transactional(propagation = Propagation.REQUIRES_NEW
开始的当前事务中使用@Transactional(propagation = Propagation.REQUIRED)
启动新事务时,是否为新事务创建了新会话?
如果上述情况成立,有没有办法只对所有交易使用一个会话?
这是一个视觉示例:
@Transactional(propagation = Propagation.REQUIRED
public void startParentTransaction() {
ChildObject childObject = newChildTransaction();
childObject.lazyLoadedAttribute();
ChildObject childObject = newChildTransaction();
childObject.lazyLoadedAttribute();
}
@Transactional(propagation = Propagation.REQUIRES_NEW
public ChildObject newChildTransaction() {
ChildObject childObject = callRepositoryOrDao();
childObject.changeState();
return childObject;
}
呼叫
childOjbect.lazyLoadedAttribute()
可以吗?还是会抛出LazyInitializationException
?我们可以将所有交易集中在一个
Session
中吗? 最佳答案
您必须绑定到Spring @Transactional
注释。
通常,即使存在existint事务,Propagation.REQUIRE_NEW
也会启动新事务。
但是,如果您在本地调用newChildTransaction
(只是在同一方法内),则spring AOP将没有机会与@Transaction
注释进行交互。
因此,在这种情况下,newChildTransaction()
使用现有事务
关于java - 嵌套@Transactional(propagation = Propagation.REQUIRES_NEW)是否创建新的Hibernate session ?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50177838/