一次事务配置失败引发的总结

本文探讨了在SpringBoot环境中,如何正确配置和使用事务管理。通过具体案例,分析了MyISAM表引擎不支持事务的问题及解决方案,以及Shiro注入顺序对事务的影响。

环境 :

  springboot + mybatis + shiro + mysql

需求:

   service 层配置事务
过程 :

  1.  springboot 启动类加上 @EnableTransactionManagement 注解

  2. service 方法上加上@Transactional 注解

  3. 人为造一个 RunTimeException, 比如 1/0

  4. 测试

问题:

  1.  为了避免问题偶发性,在两个service类同时配置 @Transactional 注解 ,刚开始测试后发现两个service的事务都没有起作用

  解决:表引擎为 Myisam 不支持事务,改为 innoDB (解决该问题的时候还有人提过mysql 的 auto_commit问题,但是我没有遇到)

  2. 第一个问题解决的前提下,aService 的事务起作用了,但是 bService 的事务仍然没有起作用,这个就有点奇怪了。。。
  解决:a) 尝试了n多方法之后仍然没有解决,请求了上司,上司给了一个思路,aService 经过了 spring的代理,bService 没有经过代理

     b) 查看了这两个service的不同,发现shiro中注入了bService

     c) 注释掉 shiro 中的 bService 注入, bService 事务生效

     d) 查了一下原因,主流说法是:shiro 比 spring 先加载,导致spring 没有生成 bService的代理类

解决该问题时涉及到的问题:

  spring注入时,代理类的创建问题,可以参考 : https://www.cnblogs.com/zcmzex/p/8822509.html

  我总结如下:

    1. 注入接口会生成jdk动态代理类,注入类会生成cglib动态代理类

    2. 只有在加入了aop拦截配置(比如 @transactional注解)的时候,spring 才会生成代理类

转载于:https://www.cnblogs.com/lwmp/p/9809831.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值