springboot 集成 shiro 导致事务无效

7 篇文章 0 订阅
6 篇文章 0 订阅

项目中遇到的问题:

某一天突然发现事务出现异常不会回滚了,原因是shirobean先于Spring事务将userService实例化了,结果导致spring事务初始化时好无法扫描到该bean,导致这个bean上没有绑定事务,导致事务无效。UserRealm改成注入userMapper就好了。

一.排查bug过程:

  1. 数据库的引擎是否是innoDB(可以用show engines; 查看数据库引擎)
  2. 启动类上是否加入@EnableTransactionManagement注解
  3. 方法是否为public
  4. 是否是因为抛出了Exceptionchecked异常

 二.运行时问题排查:

在上面4个原因检查时,发现将已有的service 类 copy下现在有两个除了名字其他都一模一样的类,这时运行下发现,在原来的类中@Transational失效,在新copy中的类中@Transational就起效了,这个问题好莫名奇妙,什么都没改就一个有效一个无效,现在的思路就是比较下这两个类在运行时有什么不同

通过log发现打出了一下信息,说是jdbcconnection 不是Spring管的

 

而正常回归的service类则是,调用了 JtaTransactionManager 类,而且 spring是管理jdbcconnection

  

通过这个分析,可以知道这spring对于这两个类的处理是不一样的,应该是spring代理或者初始化的问题,翻了下log 发现service 在
ProxyTransactionManagementConfiguration 配置之前就被创建了,那应该是这里的问题了,这里就要分析下service为啥提前被创建了,发现在开始启动的是shiro ,而shiro中有个realm中引用了这些服务,所以这些服务在Transaction创建扫描之前创建了 

 

引发问题原因总结

导致问题的真正原因是bean创建顺序问题,解决问题方法就是,在Transaction之后创建service

解决方法一:

realm引用的service服务上加@lazy注解

 

 

解决方法二:

把在UserRealm注入的UserService换成UserMapper就可以

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值