1、问题描述:在对数据库增删改的方法上加了@transaction注解,又由于业务需求,在方法中有异常出现时,需要打印日志。所以在方法内部进行了try捕获异常,此时如果有异常发生就不会触发@transaction注解的事务回滚。
2、原因:@transaction注解底层基于动态代理实现事务的支持(动态代理对象调用方法前开启事务,捕获到异常后回滚事务),我们在方法内部进行了手动try捕获异常,此时动态代理对象就捕获不到异常了(异常被我们手动捕获了,没有向外抛出),所以动态代理对象就不会进行事务的回滚。
3、解决方法:
1、不在方法内部手动捕获对象,所有的异常都回抛出。
2、在手动捕获异常后,进行业务处理,然后再将该异常手动抛出。
3、手动捕获异常后,进行业务处理。然后不抛出异常,而在catch中通过调用TransactionAspectSupport.currentTransactionStatus().setRollbackOnly()方法将当前事务状态设置为只能回滚。
4、总结:我选用的是第三种解决方法。因为业务需求,在捕获异常后还有其他代码需要执行,而前两种方法catch代码块之后的代码就执行不到了。
spring中transaction注解本地事务失效的问题
最新推荐文章于 2023-04-21 13:13:21 发布