当前使用版本(必填,否则不予处理)
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()来存,事务能正常回滚了
疑问:
- 为啥serviceImpl类里的方法上要加上事务注解呢?
- 一般不都是提供方法然后让用户自己去控制事务吗,serviceImpl类里的一些方法上加事务注解的目的是啥呢?
报错信息
无
Comment From: qmdx
批量涉及到事务,默认加上是防止个人遗忘
Comment From: atjiu
个人遗忘出问题好歹也知道是没加事务注解,回头加上就是了,但ServiceImpl里默认给加上了事务注解了,导致程序里事务不回滚,这问题在不知道的时候,连排查的头绪都没有
所以建议给去掉吧,让用户自己来维护事务,出了问题也好排查。
Comment From: jptx1234
没能复现出这个问题,是不是方式不太一样?我按照你的代码写了个demo,发现抛异常之后,super.save()依然被回滚了。附件是我的demo,看下是不是咱们的某些使用方式不太一样。
Comment From: atjiu
@jptx1234 感谢你的demo,我下载下来后,测试确实没有问题,事务能照常回滚。
开始怀疑是数据库的原因,我就把h2换成了mysql,测试事务还是照常回滚
接着怀疑是flyway的原因,我又把flyway给加上了,事务正常
然后看pom.xml里依赖的版本跟我项目也不太一样,改成一样的,测试,事务正常
最后怀疑是shiro里可能有什么代理类导致的,然后又把shiro也引入了,测试,事务正常
现在我也不知道为啥了 😂