假設我在某個事務中使用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);
}
世界只因有你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方法所在的類別。