1. 程式人生 > >JAVA 事務回滾方法呼叫非事務回滾方法

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);
        }
}