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

最近项目上用到spring事务时碰到一个问题,报错信息 Transaction rolled back because it has been marked as rollback-only

现场情况是有两个service:service1,service2;这两个里面都是用的编程式事务,如下。

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
//CODE
}
});

如果有异常是以status.setRollbackOnly() ;方式回滚; 现在有个biz层bizA调这两个service

transactionTemplate.execute(new TransactionCallbackWithoutResult() {
@Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
service1();
service2();
});

要保证这两个service同时成功,有一个回滚了那整体要回滚,因为不是用的注解式的事务,所以同样包了一层,事务嵌套事务 transactionTemplate.execute 结果执行的时候出现了文章开头的错误;最后查阅了资料后终于解决,记录如下: 原因:因为历史原因,service1和service2是对外提供的接口;有错误是以错误码的形式返回的,所以biz层的事务和service层其实是同一个事务,在service层更改了status,而biz层并不知道,还是继续commit,就导致了status非has been marked as rollback-only异常。所以解决方案就是biz层在调用完service后一定要判断下是否成功,不成功的话要在biz层再做一遍status.setRollbackOnly();

发表评论

电子邮件地址不会被公开。 必填项已用*标注