国产成人精品亚洲777人妖,欧美日韩精品一区视频,最新亚洲国产,国产乱码精品一区二区亚洲

您的位置:首頁技術文章
文章詳情頁

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

瀏覽:122日期:2023-11-05 14:41:05

問題描述

假設我在某個事務中使用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(); }});

@Componentclass AddOperation{ @Transactional public addMethod(){ userDao.addOrg(); //拋出RuntimeException異常 cdl.countDown(); }}

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

標簽: java
主站蜘蛛池模板: 广州市| 河北省| 黎川县| 临汾市| 多伦县| 喀喇沁旗| 上林县| 淮安市| 五常市| 澄城县| 枣庄市| 秭归县| 沙坪坝区| 麻江县| 扶余县| 礼泉县| 疏附县| 保定市| 郯城县| 陆丰市| 六枝特区| 道孚县| 中西区| 乐至县| 井陉县| 满城县| 烟台市| 甘谷县| 威信县| 惠东县| 松滋市| 河间市| 石家庄市| 临沧市| 通渭县| 岐山县| 团风县| 瑞安市| 哈尔滨市| 峨眉山市| 县级市|