Spring事务分析

一、事务分析

1.1 情形一

    /**
     * 第一种情况: 外层方法,内层方法都没事务,外层方法抛出异常;
     * 结果: 外层方法插入成功,报错以后,内层方法不执行,未插入成功;
     */
    public void outerTransaction() {
        savePerson("outer");
        arithmeticException();
        innerTransaction();
    }
    
    public void innerTransaction() {
        savePerson("inner");
    }

1.2 情形二

    /**
     * 第二种情况: 外层方法,加事务,内层方法未加事务注解,外层方法抛出异常;
     * 结果: 外层方法回滚,报错以后,内层方法不执行,内外层都未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        arithmeticException();
        innerTransaction();
    }

    public void innerTransaction() {
        savePerson("inner");
    }

1.3 情形三

    /**
     * 第三种情况: 外层方法,内层方法都未加Transaction,内层方法抛异常;
     * 结果: outer和inner都插入成功;
     */
    public void outerTransaction() {
        savePerson("outer");
        innerTransaction();
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.4 情形四

    /**
     * 第四种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常;
     * 结果: outer和inner都未插入成功,事务回滚;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        innerTransaction();
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.5 情形五

    /**
     * 第五种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常, 外层方法对内层方法try catch;
     * 结果: 事务失效,outer和inner都插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.6 情形六

    /**
     * 第六种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常, 外层方法对内层方法try catch,但是把异常抛了出来;
     * 结果: 事务回滚,outer和inner都未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.7 情形七

    /**
     * 第七种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常, 外层方法对内层方法try catch, 但是手动开启rollBack;
     * 结果: 事务回滚,outer和inner都未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
    }

1.8 情形八

    /**
     * 第八种情况: 外层方法加Transaction,内层方法未加注解,内层方法抛异常, 外层方法对内层方法try catch,并对内层方法自己注入自己;
     * 结果: 事务未回滚,outer和inner插入成功,inner1报错之后,未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
        savePerson("inner1");
    }

1.9 情形九

    /**
     * 第九种情况: 内外层方法加Transaction,内层方法抛异常, 外层方法对内层方法try catch,并对内层方法自己注入自己;
     * 结果: 事务回滚,inner,inner1,outer都未插入成功;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Transactional
    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
        savePerson("inner1");
    }

1.10 情形十

    /**
     * 第十种情况: 内外层方法加Transaction,外层方法对内层方法try catch,并对内层方法自己注入自己,try里抛出异常;
     * 结果: 事务未回滚,异常被catch事务失效;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
            arithmeticException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Transactional
    public void innerTransaction() {
        savePerson("inner");
        savePerson("inner1");
    }

1.11 情形十一

    /**
     * 第十一种情况: 内外层方法加Transaction,内层也抛异常,外层方法对内层方法try catch,并对内层方法自己注入自己,try里抛出异常;
     * 结果: 事务回滚,被重新标记为rollback;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
            arithmeticException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Transactional
    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
        savePerson("inner1");
    }

1.12 情形十二

    /**
     * 第十二种情况: 外层方法加Transaction,内层方法加requere_new, 内层也抛异常,外层方法对内层方法try catch,并对内层方法自己注入自己,try里抛出异常;
     * 结果: 内层事务回滚,外层事务失效;
     */
    @Transactional
    public void outerTransaction() {
        savePerson("outer");
        try {
            saveService.innerTransaction();
            arithmeticException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void innerTransaction() {
        savePerson("inner");
        arithmeticException();
        savePerson("inner1");
    }

源码

猜你喜欢

转载自blog.csdn.net/qq_38826019/article/details/113601093