Transaction rolled back because it has been marked as rollback-only

今天在开发中遇到了这个问题,意思是事务已回滚,因为事务被标记为只能回滚

原因:

这是因为嵌套事务造成的,由于Spring中事务的默认传播级别是PROPAGATION_REQUIRED,即当前上下文存在事务则用此事务,如果不存在事务则新建一个事务执行;

示例:

@Service
public class PersonServiceImpl implements PersonService {
    @Autowired
    CatService catService;
    @Override
    @Transactional
    public void a() {
        System.out.println("person");
        try {
            catService.b();
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("张三");
    }
}
@Service
public class CatServiceImpl implements CatService {

    @Override
    @Transactional
    public void b() {
        System.out.println("cat");
        int i = 1/0;
    }
}

如上所示,这里有a方法和b方法,a和b都开启了事务,按照Spring的默认传播级别,这两个方法会使用同一个事务,这个时候b方法出现了异常,该事务被标记为仅回滚,由于在外面a方法中进行了catch,并没有抛出异常,所以a方法继续执行该事务,执行完成之后,准备提交事务的时候,发现该事务被标记为仅回滚,便造成了上面的错误。

Transaction rolled back because it has been marked as rollback-only_第1张图片

 

 

你可能感兴趣的:(数据库)