在做Spring声明式事务的时候,数据库连接池是HikariCP, 如果sql报错,比如某一个字段can’t be null, 这种sql exception就无法回滚,但是如果是1/0报错,事务就可以回滚,在网上查了很多资料,试了下面几个方法:
- 检查mysql是否是innodb?
- 自定义异常;
- throw new RuntimeException();
- 在try catch中catch中手动回滚:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
在试了上面所有的方法之后,还是无法解决sql exception无法回滚事务的问题,偶然看到一篇这样的文章:
Why are transactions not rolling back when using SpringJUnit4ClassRunner/MySQL/Spring/Hibernate

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

Default: true, 也就是说没有设置这个属性,那autoCommit=true就是默认自动提交事务,然后准备打算在HikariCP中设置这个属性autoCommit=false,然后就解决了事务回滚的问题!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/164125.html