我有一个类,它有一个标记为@transactional的方法。从该方法调用多个标记为@transactional的方法。因此,从层次上讲,这就像有一个父事务和多个子事务一样。当我调用从数据库获取数据的方法,然后在最后调用应将数据存储在数据库中的方法,然后事务提交失败,并将事务标记为“ ... transaction marked as rollback only ...
".
代码示例:
甲级
class A{
@Transactional
public void parentMethod(){
B b = B.getB();
C c = c.getC();
D d = new D();
d.setB(b);
d.setC(c);
service.save(d);
}
}
b类
class B{
@Transactional
public B getB(){
repository.getById(xxx);
}
}
c类
class C{
@Transactional
public C getC(){
repository.getById(xxx);
}
}
服务
@Transactional
public D save(D d){
repository.save(d);
}
正如您在上面的代码中看到的,当我调用 service.save(d);
我得到“ ... transaction marked as rollback only ...
“例外。但是,如果我像这样注解所有“get”子事务
@Transactional(readOnly = true, propagation = Propagation.REQUIRES_NEW)
我得到了预期的结果,例如,交易被正确提交,没有发生异常。
注意:在我的真实示例中,我有多个“save();”方法和多个“get();”最后一个“save();”之前的方法方法。
1条答案
按热度按时间disho6za1#
propagation.requires_new:不要使用它,因为它会创建一个新事务,如果当前事务存在,则会挂起当前事务。
使用@transaction:propagation.required的默认配置来支持当前事务,如果不存在,则创建一个新事务。