JAVA 事务回滚方法调用非事务回滚方法

事务回滚方法调用非事务回滚方法,如果非回滚方法发生异常, 非回滚方法里执行的持久化操作会被回滚吗 ?

1. 会被混滚

2,但是指定不会滚的异常类型,就可以避免发生回滚

看代码:

@Override
    @Transactional(rollbackFor = Exception.class)
    public void test() {
        TbLog log = new TbLog();
        log.setId("3");
        log.setOperationContent("事物回滚测试:有回滚注解");
        tbLogService.create(log);
        test1();
    }

    private void test1(){
        for (int i = 1; i <3 ; i++) {
            if (i==2){
                throw new RestClientException("事物回滚测试");
            }
            TbLog log = new TbLog();
            log.setId(String.valueOf(i));
            log.setOperationContent("事物回滚测试:没注解");
            tbLogService.create(log);
        }

    }

事物回滚方法 test() 调用了不回滚方法test1() , test1()方法会抛出RestClientException异常,测试发现:抛异常后之前所有的持久化操作都发生了回滚;

在做测试:

下面在test()方法的事务里添加不会滚的异常类型RestClientException , 经测试不会发生回滚, 所以你如果想不让他回滚, 可以在事务里指定不回滚的类型, 在不想发生回滚的方法把全部会发生异常的地方,全部抛出指定类型异常就不会,如:RestClientException,就可以避免回滚; 

 @Override
    @Transactional(rollbackFor = Exception.class,noRollbackFor = RestClientException.class)
    public void test() {
        TbLog log = new TbLog();
        log.setId("3");
        log.setOperationContent("事物回滚测试:有回滚注解");
        tbLogService.create(log);
        test1();
    }

    private void test1(){
        for (int i = 1; i <3 ; i++) {
            if (i==2){
                throw new RestClientException("事物回滚测试");
            }
            TbLog log = new TbLog();
            log.setId(String.valueOf(i));
            log.setOperationContent("事物回滚测试:没注解");
            tbLogService.create(log);
        }

    }

或者你想test1()不使用事务,并且不影响test()方法, 可以在方法test1() 上配置挂起事务,(当然推荐这种方法),简单粗暴,一眼明了


    @Override
    @Transactional(rollbackFor = Exception.class)
    public void test() {
        TbLog log = new TbLog();
        log.setId("3");
        log.setOperationContent("事物回滚测试:有回滚注解");
        tbLogService.create(log);
        test1();
    }

    //挂起事务
    @Transactional(propagation = Propagation.NOT_SUPPORTED)
    private void test1(){
        for (int i = 1; i <3 ; i++) {
            if (i==2){
                throw new RestClientException("事物回滚测试");
            }
            TbLog log = new TbLog();
            log.setId(String.valueOf(i));
            log.setOperationContent("事物回滚测试:没注解");
            tbLogService.create(log);
        }
}

猜你喜欢

转载自blog.csdn.net/xuanmobaobao/article/details/84102548