事务注解@Transactional不起作用

@Transactional 注解在哪几种情况下不起作用


1.@Transactional 应用在非 public 修饰的方法上

       如果Transactional注解应用在非public修饰的方法上,Transactional将会失效。

2. 同一个类中方法调用,导致@Transactional失效

      1》在主方法上,不加@Transactional注解,在子方法上加@Transactional注解,主方法调用子方法,这种情况将会时效

      2》在主方法上,加@Transactional注解,子方法上有事务操作,这时候是起作用的。

      3》在类上加@Transactional注解,在方法上也加@Transactional注解,方法上的会覆盖类上面的。

3. try catch 导致@Transactional失效

     在业务方法中一般不需要catch异常,如果非要catch一定要抛出throw new RuntimeException(),或者注解中指定抛异常类型  @Transactional(rollbackFor=Exception.class),否则会导致事务失效,数据commit造成数据不一致,所以有些时候try catch反倒会画蛇添足。

4. @Transactional 注解属性 rollbackFor 设置错误

    Spring默认抛出了未检查unchecked异常(继承自 RuntimeException 的异常)或者 Error才回滚事务;其他异常不会触发回滚事务。如果在事务中抛出其他类型的异常,但却期望 Spring 能够回滚事务,就需要指定 rollbackFor属性。

5.@Transactional 注解属性 propagation 设置错误

     配置错误导致的,这种情况一般不太会出现

     如果出现配置的下面的三种 propagation,事务将不会发生回滚。

    ransactionDefinition.PROPAGATION_SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。

    TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事务方式运行,如果当前存在事务,则把当前事务挂起。

    TransactionDefinition.PROPAGATION_NEVER:以非事务方式运行,如果当前存在事务,则抛出异常。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。