久久r热视频,国产午夜精品一区二区三区视频,亚洲精品自拍偷拍,欧美日韩精品二区

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

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

瀏覽:117日期: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
主站蜘蛛池模板: 巴彦淖尔市| 综艺| 张家界市| 交口县| 当雄县| 洞头县| 工布江达县| 乐山市| 咸阳市| 冀州市| 湘西| 新民市| 麦盖提县| 桑日县| 黄陵县| 东兴市| 郯城县| 博野县| 竹山县| 石楼县| 龙口市| SHOW| 堆龙德庆县| 工布江达县| 铁岭县| 开江县| 河北区| 东海县| 华容县| 永仁县| 赞皇县| 汝南县| 裕民县| 连山| 维西| 游戏| 江达县| 浦北县| 太仓市| 柯坪县| 岚皋县|