java - 在spring中的事务中开启多线程,怎么捕捉异常回滚呢?
女神的闺蜜爱上我
女神的闺蜜爱上我 2017-06-12 09:26:37
[Java讨论组]

假设我在某个事务中使用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方法所在的类。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号