zoukankan      html  css  js  c++  java
  • 一次事务配置失败引发的总结

    环境 :

      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 才会生成代理类

  • 相关阅读:
    lhgdialogv3.13 使用点滴
    CheckBoxList 取值 及选中相关用法
    repeater 及 gridview 中绑定短日期
    数据库中日期大小的判断
    父子不同窗口间刷新传值
    子级Repeater获取父级Repeater绑定项的值
    vs.net 2010 web 项目中使用 webservice
    web打印实现方案 Lodop6.034 使用方法总结
    用 showModalDialog 方法回传数据到父页中去
    vs.net2010中使用 Ajax Control Toolkit
  • 原文地址:https://www.cnblogs.com/lwmp/p/9809831.html
Copyright © 2011-2022 走看看