REQUIRES_NEW 与NESTED事物传播特性说明

                             REQUIRES_NEW vs NESTED

REQUIRES_NEW,始终启动一个新事物

  • 两个事物没有关联

NESTED,在原事物内启动一个内嵌事物

  • 两个事物有关联
  • 外部事物回滚,内嵌事物也会回滚

Talk is cheap,show me the code.

   /**
     * 内部方法B
     * @param user
     * @throws RollbackException
     */
    @Override
    @Transactional(rollbackFor = RollbackException.class,propagation = Propagation.REQUIRES_NEW)
    public void bInsert(User user) throws RollbackException {
            userMapper.insert(userB);
            throw new RollbackException();
    }

    /**
     * 外部方法A
     * @param user
     */
    @Transactional(rollbackFor = RuntimeException.class)
    public void aInsert(User user)  {
        userMapper.insert(userA);
        try {
            this.userService.bInsert(userB);
        } catch (RollbackException e) {
           log.error("RollbackException",e);
        }
        throw new RuntimeException();
    }

测试:

  1. 直接执行,全部回滚,没有入库数据
  2. A.REQUIRES_NEW:注掉内部方法的throw new RollbackException();执行程序,内部方法回滚,外部回滚失败,userb入库
    B.NESTED:注掉内部方法的throw new RollbackException();执行程序,内部方法回滚,外部回滚
  3. A.REQUIRES_NEW:注掉外部方法的throw new RuntimeException();执行程序,内部方法回滚,外部回滚失败usera入库
    B.NESTED:注掉内部方法的throw new RollbackException();执行程序,内部方法回滚,外部回滚失败,usera入库

 

你可能感兴趣的:(java,SpringBoot)