java - 在spring中的事務(wù)中開(kāi)啟多線程,怎么捕捉異常回滾呢?
問(wèn)題描述
假設(shè)我在某個(gè)事務(wù)中使用2個(gè)線程來(lái)加快處理速度,那么如果userDao.addOrg()方法拋出了RuntimeException異常,那么事務(wù)不會(huì)回滾,也捕獲不到錯(cuò)誤,那應(yīng)該怎么做才對(duì)呢?
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);}
問(wèn)題解答
回答1:@Transactional只能控制單線程事務(wù),所以子線程是不受add方法上的事務(wù)控制的。你可以在子線程調(diào)用的方法上開(kāi)啟新事務(wù),進(jìn)行回滾。
開(kāi)啟子線程調(diào)用受事務(wù)控制的方法:
executorService.submit(new Runnable() {public void run() { addOperation.addMethod(); }});
@Componentclass AddOperation{ @Transactional public addMethod(){ userDao.addOrg(); //拋出RuntimeException異常 cdl.countDown(); }}
注意,@Transactional是通過(guò)proxy實(shí)現(xiàn)的,所以addMethod要置于新類(lèi)AddOperation中,不能放到add方法所在的類(lèi)。
