搜尋

首頁  >  問答  >  主體

java - 在spring中的事務中開啟多線程,怎麼捕捉異常回滾呢?

假設我在某個事務中使用2個執行緒來加快處理速度,那麼如果userDao.addOrg()方法拋出了RuntimeException異常,那麼事務不會回滾,也捕獲不到錯誤,那應該怎麼做才對呢?

ExecutorService executorService = Executors.newCachedThreadPool();
        
@Transactional(rollbackFor=Throwable.class)
public void add(){
        
        CountDownLatch cdl = new CountDownLatch(2);
        executorService.submit(new Runnable() {
            
            public void run() {    
                userDao.addOrg(); //抛出RuntimeException异常
                cdl.countDown();
            }
        });
        
        executorService.submit(new Runnable() {
            
            public void run() {    
                userDao.addSystem();    
                cdl.countDown();
            }
        });
        
        cdl.wait(10,TimeUnit.SECONDS);
}
女神的闺蜜爱上我女神的闺蜜爱上我2755 天前1689

全部回覆(1)我來回復

  • 世界只因有你

    世界只因有你2017-06-12 09:28:37

    @Transactional只能控制單執行緒事務,所以子執行緒是不受add方法上的事務控制的。你可以在子執行緒呼叫的方法上開啟新事務,進行回滾。

    開啟子執行緒呼叫受事務控制的方法:

    executorService.submit(new Runnable() {
                
                public void run() {    
                    addOperation.addMethod();
                }
            });
    @Component
    class AddOperation{
        @Transactional
        public addMethod(){
           userDao.addOrg(); //抛出RuntimeException异常
           cdl.countDown();
        }
    }

    注意,@Transactional是透過proxy實現的,所以addMethod要置於新類別AddOperation中,不能放到add方法所在的類別。

    回覆
    0
  • 取消回覆