一次事務配置失敗引發的總結
環境 :
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 才會生成代理類
一次事務配置失敗引發的總結