近日朋友项目出现了一个问题,就是使用JPA的save方法进行DB保存,即使出现错误,也不希望事务回滚(但是如果这样不应该不加事务注解么?),但是使用过程中发现即使catch住异常,事务依然回滚了,
经过调试,调用save方法后根本不走catch代表块,通过debug观察SQL打印时间,发现调用save方法后,并没有出现SQL语句在日志中,而是等业务方法执行完毕后,才打印SQL语句并出现异常,
异常则被代理类捕捉了,由于JPA做了很多优化,根据调用save方法不及时打印SQL来看,极有可能是JPA为了节省SQL请求开销,等到事务准备提交时才请求DB,
根据查阅资料发现确实是如此,因此如果想理解请求DB,请不要调用save方法,调用saveAndFlush方法,即可立即请求数据库,此时数据库发生异常即可被业务方法catch到。
此文章说的也比较详细:https://www.jianshu.com/p/717b681d04f3