记一个spring注解式事物不生效问题

今天同事找到我说我给的demo项目的Spring @Transactional注解无法生效了。由于框架是我搭的,于是我就开始排查问题。




思路一:怀疑异常被捕获了。

众所周知,spring @Transactional注解是利用动态代理的方式,生成一个当前被spring管理的类的代理对象,并通过在代理方法的前后进行事物的边界提交和回滚。如果异常被捕获了,那么代理方法后就无法捕获到异常,代理对象就无法对事物进行回滚。

然而,我看了他们的代码,并没有自己捕获异常,于是此怀疑推翻。

思路二:怀疑抛出的不是RuntimeException,Spring 的默认事物管理器无法捕获非RuntimeException。

然而,我尝试在方法里进行除0操作。也无法正常事物回滚。

思路三:会不会是没加@Transactional的方法调用了加了@Transactional的方法导致的事物失效。

然而,并没有。





思路四:此时已经没有思路了,开始漫无目的的疯狂百度谷歌来回切换搜索任何的一个可能性。






思路五:我开始尝试手动回退事物,很简单,在方法里执行:TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 进行手动回滚。

这个时候,控制台打印的一行信息引起了我的注意。


意思就是说,Spring没有找到事物管理器,也就是没有找到transactionManager,无法进行事物处理。


我又没有进行本地化自定义transactionManager,就开了个注解,不是应该会走sping的默认transactionManager来处理的么。


这时候机智的我已经感受了了一点异常的气息。




于是我开启了本地日志,日志级别改到DEBUG,开整。


在齐刷刷而过的代码中,火眼金睛的我注意到了这样一行代码;




就是这行代码,意思就是说,因为spring没有开启事物,所以就关闭了一个没有事物的sqlSession连接。



????????????????????????????????????????????????????????????????????????????????????????




我已经胸有成竹了,如果@Transactional没有能开开默认的事物配置,那么默认的事物配置一定在哪个地方不是被自定义冲掉了,就是被排除了。



开始疯狂的翻找这个项目的配置文件。


找到了。



就是这行配置,直接吧默认的数据库自动配置和数据库事物自动注解给排除掉了。

于是事物不生效了。




我真是又想哭,又想笑。


原因是,在另外一个不需要数据库配置的项目中,由于依赖了持久层的三方包,但是三方包里又依赖了数据库初始化的某些包。此时的做法有两种,排除掉包,或者直接不走数据库默认配置。我采取了第二种方法。



他们抄我的配置的时候,看都不带看的,全部抄过去了。



我非常平淡的解释了给同事听这行配置是做什么的,为什么加了会没有事物以及没加事物就会生效以及我为什么加以及以后抄配置要看下注释啥意思再抄。






暂无评论