一般失效有這麼幾種情況
1、檢查數據庫的引擎是否是innoDB
2、啓動類上是否加入@EnableTransactionManagement註解 (其實使用 springboot 的話這個不加也可以 應爲默認是true)
3、是否在方法上加入@Transactional註解或Service的類上是否有@Transactional註解
4、方法是否爲public
5、是否是因爲拋出了Exception等checked異常
6 、該事務所在的類是否在加載的時候使用了spring的切面
但是我這裏出現了一個問題 , 當我整合 shiro的時候 發現事務失效 其原因是 因爲 Shiro 的ShiroFilterFactoryBean實現了FactoryBean接口 那麼它會提前被加載 這個時候我在使用shiro的時候 注入了 userService 所以它會提前被初始化 沒有被spring 接管注入 導致了當使用 Transactional 的時候 spring 無法使用aop 代理 無法回滾
這就是最關鍵的一個點 , sysUserServiceImpl 是由 customRealm 被注入的時候創建的 不是spring 創建的 而 customRealm 是由shiro 初始化的時候加載的
21:17:01.585 logback [main] DEBUG o.s.b.f.s.DefaultListableBeanFactory - Autowiring by type from bean name 'customRealm' via constructor to bean named 'sysUserServiceImpl'