在项目中,service层所有方法需要try catch自行处理运行错误,然后导致无法进行自动的事务管理(Spring的事务管理需要捕获RuntimeException)。
不过有解决方案是在catch里使用 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();进行手动事务回滚(需要在类或方法上添加@Transactional(rollbackFor = Exception.class)),本来到这已经完了,但是某一天在测试某项功能的时候发现回滚功能不好使了,于是在百度和CSDN上度过了一天半。。。。
当你发现回滚功能不好使了的时候检查一下几个要素,毕竟springboot的事务管理就那么点东西,啥都不需要配置的。
- 需要进行回滚功能的方法或者类上有没有@Transactional(rollbackFor = Exception.class)
- show table status like ‘表名’; 查看表的Engine是不是InnoDB
- 也就是我碰到的这个问题,在执行batchUpdate()方法时,sql集合是不是掺杂有DDL语句(CREATE、ALTER、DROP)。
关于启动类上加@EnableTransactionManagement这个东西的,经过测试,没有必要。。。