当启动新事务时,在使用@Transactional(propagation = Propagation.REQUIRED)
启动的当前事务中使用@Transactional(propagation = Propagation.REQUIRES_NEW
),是否为新事务创建了一个新 session ?
如果上述情况成立,是否有一种方法可以仅使用一个 session 来处理所有事务?
这是一个直观的示例:
@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
中吗?
最佳答案
您已绑定(bind) Spring @Transactional
注释。
通常情况下,即使存在现有事务,Propagation.REQUIRE_NEW
也会启动一个新事务。
但是如果你在本地调用newChildTransaction
(只是在同一个方法中),那么Spring AOP没有机会与@Transaction
注释交互。
因此,在这种情况下,newChildTransaction()
使用现有事务
关于java - 嵌套 @Transactional(propagation = Propagation.REQUIRES_NEW) 是否创建新的 Hibernate session ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50177838/