JAVA 事務回滾方法呼叫非事務回滾方法
阿新 • • 發佈:2018-11-15
事務回滾方法呼叫非事務回滾方法,如果非回滾方法發生異常, 非回滾方法裡執行的持久化操作會被回滾嗎 ?
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); } }