java - 在spring中的事務中開啟多線程,怎麼捕捉異常回滾呢?
女神的闺蜜爱上我
女神的闺蜜爱上我 2017-06-12 09:26:37
0
1
1693

假設我在某個事務中使用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);
}
女神的闺蜜爱上我
女神的闺蜜爱上我

全部回覆(1)
世界只因有你

@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方法所在的類別。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板