当前使用版本(必填,否则不予处理)

3.4.3

该问题是如何引起的?(确定最新版也有问题再提!!!)

使用mbp里提供的extension ServiceImpl 类里的方法出现的事务无法回滚的问题

重现步骤(如果有就写完整)

@Service
public class FooService extends ServiceImpl<RoleMapper, Role> {

    @Resource private BarService barService;

    @Transactional(rollbackFor = Exception.class)
    public void mysave() {
        super.save();
        // 一些其它的操作,发生了异常
        barService.saveBatch();
    }
}

如上这个service里的mysave()方法,当调用后,super.save()执行正常,但barService.saveBatch()执行之前报错了,事务不会回滚,super.save()保存的数据依然入库了

查了一下ServiceImpl里的这两个方法发现,save()方法上面没有事务注解,saveBatch()方法上有事务注解

然后将saveBatch()方法也换成save()来存,事务能正常回滚了

疑问:

  1. 为啥serviceImpl类里的方法上要加上事务注解呢?
  2. 一般不都是提供方法然后让用户自己去控制事务吗,serviceImpl类里的一些方法上加事务注解的目的是啥呢?

报错信息

Comment From: qmdx

批量涉及到事务,默认加上是防止个人遗忘

Comment From: atjiu

个人遗忘出问题好歹也知道是没加事务注解,回头加上就是了,但ServiceImpl里默认给加上了事务注解了,导致程序里事务不回滚,这问题在不知道的时候,连排查的头绪都没有

所以建议给去掉吧,让用户自己来维护事务,出了问题也好排查。

Comment From: jptx1234

没能复现出这个问题,是不是方式不太一样?我按照你的代码写了个demo,发现抛异常之后,super.save()依然被回滚了。附件是我的demo,看下是不是咱们的某些使用方式不太一样。

mp-tx.zip

Comment From: atjiu

@jptx1234 感谢你的demo,我下载下来后,测试确实没有问题,事务能照常回滚。

开始怀疑是数据库的原因,我就把h2换成了mysql,测试事务还是照常回滚

接着怀疑是flyway的原因,我又把flyway给加上了,事务正常

然后看pom.xml里依赖的版本跟我项目也不太一样,改成一样的,测试,事务正常

最后怀疑是shiro里可能有什么代理类导致的,然后又把shiro也引入了,测试,事务正常

现在我也不知道为啥了 😂