@Transactional注解怎么使用?

@Transactional注解的原理:
添加了@Transactional注解的A类在启动后,默认会生成一个B类,复制A类中的所有方法,如果是在A类上添加注解,则B类所有方法都会执行事务;如果只在A类某个方法上添加注解,则B类只会对那个方法执行事务。

@Transactional注解的使用:
1、在方法或者类上都可以添加。(如果在类上添加,则此类中的所有方法都会执行事务,不推荐,因为可能后续接手开发的小伙伴添加方法的时候根本不需要执行事务;也不建议在接口上添加);

2、推荐在注解上添加@Transactional(rollbackFor = {Exception.class}),如果不加的话,方法默认只会在抛出RuntimeException(unchecked异常)时执行回滚;

3、@Transactional注解只能应用到public修饰符上,其它修饰符不起作用,但不报错。

4、触发事务回滚有两种方式:

a. 方法抛出异常自动进行回滚;如果使用了try catch,要在catch中抛出异常;
b. 手动执行回滚:在方法中添加:TransactionAsceptSupport.currentTransactionStatus().setRollBackOnly();
    //第1种写法 
    @Transactional( rollbackFor = {Exception.class} )
    public String commonMoney(Receipt rpt,Moneyrecord mors){  
      try{
            rpt.setState(1);  
            int a=dao.insert(rpt);  
            if(a<=0) {
                return"缴费失败";  
            }
            mors.setPric(rpt.getPic());  
            mors.setExid(rpt.getPid());  
            mors.setState(1);  
            boolean tf=mrs.custom(mors);  
            if(!tf){  
                return"余额不足";  
            }  
      }catch(Exception e){
            log.error("业务异常" , e)
            throw new Exception();
        }
        return "OK";  
    }  
 
    //第2种写法 
    @Transactional( rollbackFor = {Exception.class} )
    public String commonMoney(Receipt rpt,Moneyrecord mors){  
        rpt.setState(1);  
        int a=dao.insert(rpt);  
        if(a<=0) {
            return"缴费失败";  
        }
        mors.setPric(rpt.getPic());  
        mors.setExid(rpt.getPid());  
        mors.setState(1);  
        boolean tf=mrs.custom(mors);  
        if(!tf){  
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();  
            return"余额不足";  
        }  
        return "OK";  
    }  

 

不回滚原因

​​​​​​​1,检查方法是不是public

2,检查异常是不是unchecked异常

3,如果是checked异常也想回滚的话,注解上写明异常类型即可@Transactional(rollbackFor=Exception.class)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值