sql异常,Spring Aop事务不回滚解决方案

在做Spring声明式事务的时候,数据库连接池是HikariCP, 如果sql报错,比如某一个字段can’t be null, 这种sql exception就无法回滚,但是如果是1/0报错,事务就可以回滚,在网上查了很多资料,试了下面几个方法:
1. 检查mysql是否是innodb?
2. 自定义异常;
3. throw new RuntimeException();
4. 在try catch中catch中手动回滚: TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

在试了上面所有的方法之后,还是无法解决sql exception无法回滚事务的问题,偶然看到一篇这样的文章:

https://stackoverflow.com/questions/2827770/why-are-transactions-not-rolling-back-when-using-springjunit4classrunner-mysql-s

sql异常,Spring Aop事务不回滚解决方案_第1张图片

一语惊醒梦中人,立刻去看数据库连接池HikariCP, 发现没有设置defaultAutoCommit这个属性,然后去查HikariCP的官方文档:
https://github.com/brettwooldridge/HikariCP#configuration-knobs-baby

这里写图片描述

Default: true, 也就是说没有设置这个属性,那autoCommit=true就是默认自动提交事务,然后准备打算在HikariCP中设置这个属性autoCommit=false,然后就解决了事务回滚的问题!

你可能感兴趣的:(事务)