问题描述
我想知道,当@Transactional(readonly=true) 方法调用@Transactional(readonly=false) 方法时会发生什么?说一下propagation = Propagation.required(在外层事务范围内)的情况。
public class ServiceA {
ServiceB serviceB;
@Transactional(readonly = true)
public void readOnly() {
// some reading from repo
serviceB.write()
}
}
public class ServiceB {
@Transactional
public void write() {
// some write to repo
}
}
相反情况的相同问题,如果@Transactional(readonly=false) 方法调用@Transactional(readonly=true) 方法会发生什么?我想对于最后一种情况,它只会从外部范围考虑 @Transactional(readonly=false)。
解决方法
从 readOnly=false
调用 readOnly=true
不起作用,因为前一个事务仍在继续。
这是因为之前的交易正在继续。
如果你想让它工作,你必须让它开始一个新的事务。 示例:
public class ServiceB {
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void write() {
// some write to repo ..
}
}
在这种情况下,它将起作用,因为将启动一个新的事务。