springboot 事务注解 @Transactional 不生效

文章目录


  • 在业务层手工捕捉并处理了异常(try…catch)等于把异常“吃”掉了;这是最常见的情况,在boot未流行时就经常遇到这个问题,手动 捕获异常 Spring自然不知道这里有错,更不会主动去回滚数据。推荐做法是在业务层统一抛出异常,然后在控制层统一处理。

  • Spring的默认的事务规则是遇到运行异常(RuntimeException)和程序错误(Error)才会回滚,而异常是继承自 Exception 也会导致失效。如果想针对非检测异常进行事务回滚,可以在@Transactional 注解里使用rollbackFor 属性明确指定异常。

    • 使用 rollbackFor 后依然无效:检查是否在类和 方法上都加了 @Transactional 和 rollbackFor ,方法上的 @Transactional 会使得 类上的无效,去掉方法上的 @Transactional 注解;
    • 在接口上使用 @Transactional ,这种方式,在设置了基于接口的代理时它才生效,基于类的代理不生效,因为注解是 不能继承 的;而spring 基于类和基于接口的代理是混用的,所有有时候就会不生效
  • @Transactional 注解应该只被应用到 public 修饰的方法上。 如果你在 protected、private 、 default 的方法上使用 @Transactional 注解,它也不会报错, 但是这个被注解的方法将不会展示已配置的事务设置。

    • 引申的另一个问题: 在 protected、private 、 default 修饰的方法使用 @Controller 注解也会导致调用接口时 404,然后会找老半天,才会发现是修饰符的问题。

版权声明:本文为wwq921220原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。