1. 程式人生 > >一次事務配置失敗引發的總結

一次事務配置失敗引發的總結

第一個 過程 service logs 代理 生成 bsp time log

環境 :

  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 才會生成代理類

一次事務配置失敗引發的總結