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

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

    最新下载
    更多>
    网站特效
    网站源码
    网站素材
    前端模板
    关于我们 免责声明 Sitemap
    PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!