@transactional仅当@transactional与子事务一起使用时才标记为回滚

wh6knrhe  于 2021-09-13  发布在  Java
关注(0)|答案(1)|浏览(401)

我有一个类,它有一个标记为@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();”之前的方法方法。

disho6za

disho6za1#

propagation.requires_new:不要使用它,因为它会创建一个新事务,如果当前事务存在,则会挂起当前事务。
使用@transaction:propagation.required的默认配置来支持当前事务,如果不存在,则创建一个新事务。

相关问题