@Transactional失效的几种情况说明

1.非public修饰的方法

@Transactional注解只能在public修饰的方法下使用,因为spring aop实现事务时,判断了当前代理方法是否为public修饰。

@Transactional
private boolean test(){
    //do something
}

2.类内部访问

类内部非直接访问带注解标记的方法 B,而是通过类普通方法 A,然后由 A 调用 B

@Service
public class Demo {
  public void A() {
 
    this.B();
  }
  
  @Transactional
  public void B() {
     ......
  }
}

3.数据库存储引擎不支持事务

MySQL中,MyISAM存储引擎不支持事务,InnoDB支持事务

4.异常类型不匹配

@Transactional注解默认处理运行时异常,非运行时异常需要通过rollbackFor属性指定。

/**
 * 非运行异常,且没有通过 rollbackFor 指定抛出的异常,不生效
 
 * @param id
 * @return
 * @throws Exception
 */
@Transactional
public boolean testException(int id) throws Exception {
    //运行代码
    throw new Exception("参数异常");
}

5.异常捕获未抛出

方法内部的异常通过try catch捕获并处理了,未抛出

@Transactional
public void A(){
    try{
       ......
    }catch(Exception e){
       // 未抛异常
    }
}

6.Bean没有纳入Spring容器管理

7.事务方法内启动新线程进行异步操作

8.传播属性设置为不走事务

@Transactional默认的事务传播机制是:REQUIRED,若指定成了NOT_SUPPORTED、NEVER事务传播机制,则事物不生效

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值