springboot 事务 @Transactional 失效

一般失效有这么几种情况

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'

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章