Spring Boot项目多数据源事务不生效的问题

1.问题场景描述

在方法中操作数据库,向表中插入一条数据;然后抛出RuntimeException,发现事务没有回滚,插入的数据依然提交到了数据库中。

2.问题查找及分析过程

2.1 首先查看项目中是否配置了事务

项目中确实做了事务相关的配置:

spring.transaction.expression=execution(* xxxxxxx.service.impl.*Impl.*(..))

那么这个配置是否生效呢?我们在执行insert后面手动抛出一个RuntimeException,看到如下的报错信息,说明异常确实抛出了,但是查询数据后发现,事务确实没有回滚。

2.2 没办法,打断点跟代码吧,看执行过程

我们根据报错的日志,找到 TransactionAspectSupport 和 TransactionInterceptor这两个类:

找到日志中报错的TransactionInterception的invok()方法,在这里打断点,

 然后进入invokWithinTransaction()这个方法,就进入到了其父类TransactionAspectSupport的invokWithinTransaction()方法,我们在里面打断点继续跟踪执行过程:

 然后继续,我们进入异常后回滚事务的方法:completeTransactionAfterThrowing(txInfo, var17)

跟到这里面,我们注意rollbackOn(ex)方法和txInfo.getTransactionManager().rollback()方法,

1.rollbackOn(ex)方法(在DefaultTransactionAttribute类里)的入参是一个异常类型,通过这个方法的源码我们可以发现,Spring事务默认只有在发生RuntimeException类型的异常和Error时才走下面的rollback()方法,也就是默认在捕捉到Runt

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值