一般失效有这么几种情况
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'