①数据库引擎不支持事务
数据库本身不支持事务,那么就算使用@Transactional也没用。
②服务类没有被 Spring 管理
服务类必须交由spring管理,否则就不会产生代理对象,从而执行事务逻辑。
③方法不是 public
spring解析注解属性时会判断是否是public,如果不是,则注解属性为null,则注解无法生效
④异常被捕获
spring源码在执行方法时如果有异常会执行回滚事务,由于我们自行处理异常,那么就不会再执行回滚流程。
⑤异常类型不匹配
spring源码会判断异常是否是超过默认的异常或者指定异常。如果超过不会执行rollback流程。
⑥方法被final修饰
由于Spring使用JDK动态代理或CGLIB代理来实现事务管理,如果方法被final修饰,代理对象无法覆盖这些方法,导致事务注解失效。
⑦自调用问题
当一个类中的事务方法直接调用本类中另一个事务方法时,由于没有经过代理对象,事务注解可能不会生效。
⑧没有开启事务管理
需要在Spring的配置类上添加@EnableTransactionManagement注解来启用事务管理功能。
⑨事务传播行为配置错误
若事务方法的传播行为设置不当,如设置为Propagation.NOT_SUPPORTED、Propagation.NEVER或Propagation.SUPPORTS,可能会导致事务不生效或不期望的行为。