Spring事物的传播属性

事物:
是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;
这些操作作为一个整体一起向系统提交,要么都执行,要么都不执行,事物时一组不可再分割的操作集合(工作逻辑单元)
在这里插入图片描述
在这里插入图片描述

Transactional

没有开启事物之前,运行代码,如果代码中出现异常,异常前进行的数据库操作会保存到
数据库中,异常后进行的数据库操作不会保存到数据库中

Propagation属性:

REQUIRED:
使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的;
如果当前存在事务,则加入这个事务,成为一个整体。


// 父类service方法
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 父类方法中添加 事物注解,子类方法中出现异常整体都会回滚
   // 父类service方法
    @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.REQUIRED)
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 子类方法添加事物注解,当前子类方法回滚,父类方法没有事物注解代码不会回滚
  // 父类service方法
   @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.REQUIRED)
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 父类方法添加事物注解,当前父类方法回滚,子类方法也有事物注解同样回滚

SUPPORTS:
如果当前有事务,则使用事务;如果当前没有事务,则不使用事务。
主要使用查询

 // 父类service方法
    @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.SUPPORTS)
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 父类方法无事物,父类方法不回滚,子类方式使用SUPPORTS,异常前方法不回滚
// 父类service方法
    @Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.SUPPORTS)
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 父类方法使用REQUIRED,父类方法回滚,子类方式使用SUPPORTS,方法回滚

MANDATORY:
该传播属性强制必须存在一个事务,如果不存在,则抛出异常

 
    @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.MANDATORY)
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 父类方法无事物,子类方式使用MANDATORY,直接抛出无事物异常

  @Transactional(propagation = Propagation.REQUIRED)
  @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.MANDATORY)
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 父类方法有事物,子类方式使用MANDATORY,直接抛出无事物异常

REQUIRES_NEW:
如果当前有事务,则挂起该事务,并且自己创建一个新的事务给自己使用;
如果当前没有事务,则同 REQUIRED

  @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 父类方法无事物,子类方式使用REQUIRES_NEW,saveParent()保存到数据库 saveChildren() 回滚
  @Transactional(propagation = Propagation.REQUIRED)
  @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
    // 父类方法有自己事物,子类方式使用REQUIRES_NEW新建事物,两个事物saveParent()回滚 saveChildren() 回滚
 @Transactional(propagation = Propagation.REQUIRED)
  @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       int a = 1 / 0;
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.REQUIRES_NEW)
     public void saveChildren() {
        saveChild1();
        
        saveChild2();
    }
    // 父类方法有自己事物,子类方式使用REQUIRES_NEW新建事物,两个事物saveParent()回滚 saveChildren()保存到数据库
 @Transactional(propagation = Propagation.REQUIRED)
  @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
       int a = 1 / 0;
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.REQUIRED)
     public void saveChildren() {
        saveChild1();
        
        saveChild2();
    }
    // 父类方法有自己事物,子类方式使用REQUIRES 公用一个事物 saveParent()回滚 saveChildren()回滚 都不能保存到数据库

NOT_SUPPORTED:
如果当前有事务,则把事务挂起,自己不使用事务去运行数据库操作

  @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
    
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.NOT_SUPPORTED)
     public void saveChildren() {
        saveChild1();
           int a = 1 / 0;
        saveChild2();
    }
    // 父类方法无事物,子类方式使用NOT_SUPPORTED 相当于无事物   saveParent()不回滚 saveChild1()不回滚异常前保存到数据库

@Transactional(propagation = Propagation.REQUIRED)
 @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
    
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.NOT_SUPPORTED)
     public void saveChildren() {
        saveChild1();
           int a = 1 / 0;
        saveChild2();
    }
    // 父类方法有事物,子类方式使用NOT_SUPPORTED 相当于无事物   saveParent()回滚 saveChild1()不回滚,saveChild1()保存到数据库

NEVER:
如果当前有事务存在,则抛出异常

@Transactional(propagation = Propagation.REQUIRED)
 @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
    
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.NEVER)
     public void saveChildren() {
        saveChild1();
           int a = 1 / 0;
        saveChild2();
    }
    // 父类方法有事物,子类方式使用NEVER 报发现事物异常,不允许使用事物,不会保存到数据库
 @Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.NEVER)
     public void saveChildren() {
        saveChild1();
           int a = 1 / 0;
        saveChild2();
    }
    // 父类方法无事物,子类方式使用NEVER 报除数为0异常,异常前代码数据保存到数据库,无回滚

NESTED:
如果当前有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或者回滚;
如果当前没有事务,则同 REQUIRED。
但是如果主事务提交,则会携带子事务一起提交。
如果主事务回滚,则子事务会一起回滚。相反,子事务异常,则父事务可以回滚或不回滚。

@Transactional(propagation = Propagation.REQUIRED)
@Override
    public void testPropagationTrans() {
         stuService.saveParent();
         stuService.saveChildren();
           int a = 1 / 0;
    }

// 子类service方法
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
     @Transactional(propagation = Propagation.NESTED)
     public void saveChildren() {
        saveChild1();
        saveChild2();
    }
    // 父类方法有事物,子类方式使用NESTED ,报除数为0异常,事物回滚,数据没保存到数据库
@Transactional(propagation = Propagation.REQUIRED)
    @Override
    public void testPropagationTrans() {
        stuService.saveParent();

        try {
            // save point
            stuService.saveChildren();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     public void saveParent() {
        Stu stu = new Stu();
        stu.setName("parent");
        stu.setAge(19);
        stuMapper.insert(stu);
    }
    @Transactional(propagation = Propagation.NESTED)
    public void saveChildren() {
        saveChild1();
        int a = 1 / 0;
        saveChild2();
    }
        // 父类方法有事物,子类方式使用NESTED ,父方法catch住异常,子事物回滚,父事物可以不回滚
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值