Spring事物失效与事务回滚

一、事务失效

  • 1、发生this调用; 这个 this 对象不是代理类,在SpringIoC容器中返回的调用的对象是代理对象而不是真实的对象 只有被动态代理直接调用的才会产生事务。

解决方案:XXXService proxy =(XXXService) AopContext.currentProxy(); 通过代理方式proxy对象进行调用;

  • 2、方法修饰符不是 public  
  • 3、 发生了错误的异常  事务只会对 Error 与 RuntimeException 及其子类这些异常做出回滚, 因为默认回滚的是:RuntimeException。如果是其他异常想要回滚,需要在 @Transactional 注解上加 rollbackFor 属性。
  • 4、数据库不支持事务

    毕竟 Spring 事务用的是数据库的事务,如果数据库不支持事务,那 Spring 事务肯定是无法生效滴。

二、事务回滚 

在Spring中进行事务回滚,

①:通过Aop切面事务回滚

TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

②:通过RuntimeException

 throw new RuntimeException();   

传播行为一:事务方法A调用非事务方法B,AB都具有事务。 出现异常数据同时回滚。

    //方法A 开启事务
    @Transactional
    public int A(PartFamily record) {
        Style style=new Style("55566",8);
        partFamilyMapper.save(record);
        B(style);
        return 5;
    }
    //方法B 
    public int B(Style record) {
        int id=styleMapper.save(record).getId();
        int i=1/0;
        return id;
    }

 传播行为二:非事务方法A调用事务方法B。出现异常都不会回滚

    public int A(PartFamily record) {
        Style style=new Style("55566",8);
        partFamilyMapper.save(record);
        B(style);
        return 5;
    }
    @Transactional
    public int B(Style record) {
        int id=styleMapper.save(record).getId();
        int i=1/0;
        return id;
    }

传播行为三:事务方法A调用事务方法B。同时具有事务,异常时同时回滚。

    @Transactional
    public int A(PartFamily record) {
        Style style=new Style("55566",8);
        partFamilyMapper.save(record);
        B(style);
        return 5;
    }
    @Transactional
    public int B(Style record) {
        int id=styleMapper.save(record).getId();
        int i=1/0;
        return id;
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值