spring 事务传播行为

传播行为:有七大传播行为,也是在TransactionDefinition接口中定义。

  1. PROPAGATION_REQUIRED:支持当前事务,如当前没有事务,则新建一个。
  2. PROPAGATION_SUPPORTS:支持当前事务,如当前没有事务,则已非事务性执行。
  3. PROPAGATION_MANDATORY:支持当前事务,如当前没有事务,则抛出异常(强制一定要在一个已经存在的事务中执行,业务方法不可独自发起自己的事务)。
  4. PROPAGATION_REQUIRES_NEW:始终新建一个事务,如当前原来有事务,则把原事务挂起。
  5. PROPAGATION_NOT_SUPPORTED:不支持当前事务,始终已非事务性方式执行,如当前事务存在,挂起该事务。
  6. PROPAGATION_NEVER:不支持当前事务;如果当前事务存在,则引发异常。
  7. PROPAGATION_NESTED:如果当前事务存在,则在嵌套事务中执行,如果当前没有事务,则执行与 PROPAGATION_REQUIRED 类似的操作

PROPAGATION_REQUIRED:(外面影响里面,里面影响外面) 
若addUser的方法没有事务,则创建一个新事务,若有事务,则加入当前事务。 
如果addUser的方法抛出异常,则addUser,addWallet的方法都会回滚, 


    @Transactional(propagation = Propagation.REQUIRED)
    public void addUser() {
       TbUser tbUser = new TbUser();
       tbUser.setId(1);
       tbUser.setAge(20);
       tbUser.setName("tzhl");
       tbUserMapper.insert(tbUser);
       walletServcie.addWallet(tbUser.getId());
       int n = 1/0;
    }
    
 @Transactional(propagation = Propagation.REQUIRED)
    public void addWallet(Integer userId) {
        Wallet wallet = new Wallet();
        wallet.setId(1);
        wallet.setUserId(userId);
        wallet.setWallet(new BigDecimal(0));
        walletMapper.insert(wallet);
       // int n = 1/0;
    }

都回滚


如果addWallet的方法抛出异常,则看addUser有没有捕获,没有捕获的话,addUser会回滚

 @Transactional(propagation = Propagation.REQUIRED)
    public void addUser() {
       TbUser tbUser = new TbUser();
       tbUser.setId(1);
       tbUser.setAge(20);
       tbUser.setName("tzhl");
       tbUserMapper.insert(tbUser);
       walletServcie.addWallet(tbUser.getId());
       //int n = 1/0;
    }

 @Transactional(propagation = Propagation.REQUIRED)
    public void addWallet(Integer userId) {
        Wallet wallet = new Wallet();
        wallet.setId(1);
        wallet.setUserId(userId);
        wallet.setWallet(new BigDecimal(0));
        walletMapper.insert(wallet);
        int n = 1/0;
    }

捕获了的话,则addUser方法会抛出新的异常Transaction rolled back because it has been marked as rollback-only 都会回滚

@Transactional(propagation = Propagation.REQUIRED)
    public void addUser() {
       TbUser tbUser = new TbUser();
       tbUser.setId(1);
       tbUser.setAge(20);
       tbUser.setName("tzhl");
       tbUserMapper.insert(tbUser);
       try {
           walletServcie.addWallet(tbUser.getId());
       }catch (Exception e){
           e.getStackTrace();
       }
       //int n = 1/0;
    }

@Transactional(propagation = Propagation.REQUIRED)
    public void addWallet(Integer userId) {
        Wallet wallet = new Wallet();
        wallet.setId(1);
        wallet.setUserId(userId);
        wallet.setWallet(new BigDecimal(0));
        walletMapper.insert(wallet);
        int n = 1/0;
    }

捕获了的话,加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

则addUser不会抛出异常,都会回滚

 @Transactional(propagation = Propagation.REQUIRED)
    public void addUser() {
       TbUser tbUser = new TbUser();
       tbUser.setId(1);
       tbUser.setAge(20);
       tbUser.setName("tzhl");
       tbUserMapper.insert(tbUser);
       try {
           walletServcie.addWallet(tbUser.getId());
       }catch (Exception e){
           e.getStackTrace();
           TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
       }
       //int n = 1/0;
    }
    
   @Transactional(propagation = Propagation.REQUIRED)
    public void addWallet(Integer userId) {
        Wallet wallet = new Wallet();
        wallet.setId(1);
        wallet.setUserId(userId);
        wallet.setWallet(new BigDecimal(0));
        walletMapper.insert(wallet);
        int n = 1/0;
    }

若addUser方法有事务,addWallet方法没有事务,addWalle方法抛出异常,addUser方法捕获,

加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();都会回滚

 @Transactional(propagation = Propagation.REQUIRED)
    public void addUser() {
       TbUser tbUser = new TbUser();
       tbUser.setId(1);
       tbUser.setAge(20);
       tbUser.setName("tzhl");
       tbUserMapper.insert(tbUser);
       try {
           walletServcie.addWallet(tbUser.getId());
       }catch (Exception e){
           e.getStackTrace();
           TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
       }
       //int n = 1/0;
    }
  //@Transactional(propagation = Propagation.SUPPORTS)
    public void addWallet(Integer userId) {
        Wallet wallet = new Wallet();
        wallet.setId(1);
        wallet.setUserId(userId);
        wallet.setWallet(new BigDecimal(0));
        walletMapper.insert(wallet);
        int n = 1/0;
    }

PROPAGATION_SUPPORTS:(外面的影响里面的,里面的影响外面的) 
如果addUser没有事务,则addWallet以非事务的方式运行,如果addUser有事务,则使用当前事务; 
如果addUser没有事务,则addUser和addWallet的运行出现异常都不会回滚 
如果addUser有事务, 
addUser的方法抛出异常,都会回滚。 
addWallet的方法抛出异常,addUser未捕获,都会回滚。

addWallet的方法抛出异常,addUser捕获了,则addUser方法会抛出新的异常Transaction rolled back because it has been marked as rollback-only,都会回滚。

addUser捕获了的话,加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

则addUser不会抛出异常,都会回滚

PROPAGATION_MANDATORY:(外面的影响里面的,里面的影响外面的) 
如果addUser没有事务,就抛出异常,如果addUser有事务,就使用当前事务。 

如果addUser没有事务就抛出异常,No existing transaction found for transaction marked with propagation 'mandatory

addWallet的运行出现异常,addUser不会回滚,addWallet会回滚

如果addUser有事务 
如果addUser的方法抛出异常,则addUser和addWallet都会回滚 

addWallet的方法抛出异常,addUser捕获了,则addUser方法会抛出新的异常Transaction rolled back because it has been marked as rollback-only,都会回滚。

addUser捕获了的话,加上TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();

则addUser不会抛出异常,都会回滚

PROPAGATION_REQUIRES_NEW:(外面不影响里面,里面(不)影响外面) 
若addUser的方法没有事务,则新建一个事务,若有事务,就创建一个新事务。 
若addUser的方法有事务, 
如果addUser的方法抛出异常,则addUser的事务回滚,addWallet的事务不受影响 
如果addWallet的方法抛出异常,addWallet回滚,addUser不捕获则回滚,捕获则不受影响,不回滚

PROPAGATION_NOT_SUPPORTED: 不支持事务
如果addUser没有事务,就以非事务方式执行,如果有,就将当前事务挂起。

若addUser的方法有事务, 
如果addUser的方法抛出异常,则addUser的事务回滚,addWallet的事务不受影响 
如果addWallet的方法抛出异常,addWallet不会回滚,addUser不捕获则回滚,捕获则不受影响,不回滚

PROPAGATION_NEVER: 
如果A没有事务,就以非事务方式执行。如果有,就抛出异常。Existing transaction found for transaction marked with propagation 'never'"都回滚

PROPAGATION_NESTED :(外面的影响里面的,里面的(不)影响外面的) 
若addUser的方法没有事务,则新建一个事务,若有事务,则在里面嵌套一个事务。 
若addUser的方法没有事务, 
如果addWallet的方法抛出异常,则addWallet回滚,addUser不回滚; 
如果addUser的方法抛出异常,则都不回滚 
若addUser的方法有事务: 
如果addWallet的方法抛出异常,则addWallet回滚 
如果addUser的方法不捕获异常,则回滚,捕获则不回滚 
如果addUser的方法抛出异常,则都回滚


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值