LegendAniu 2014-10-14 07:59 采纳率: 0%
浏览 2336

多线程更新多个表数据

更新A、B、C等多张表数据,而且这些更新需要在同一个事务里保证一致性,这些表没有关联关系。能否使用多线程的方式实现,我试试下列方法在更新数据时会出现死锁,一个表执行完update语句后另外一个线程在执行时connection就会等待,以为第一执行的线程未提交事务countDownLatch.await()也等待,这样就一直等待死锁。这种场景能使用多线程吗,有没有其它好的解决方案?

    ...
    final CountDownLatch countDownLatch = new CountDownLatch(
            moduleTableList.size());
    for (final ModuleTable moduleTable : moduleTableList) {
        Thread t = new Thread(moduleTable.getTableName()) {
            @Override
            public void run() {
                TransactionStatus transactionStatus = null;
                try {
                    transactionStatus = beginTransaction();
                    ...//更新数据
                } catch (Throwable t) {
                    orgChangeInfo.setError(true);
                    ...
                } finally {
                    countDownLatch.countDown();
                    try {
                        countDownLatch.await();
                    } catch (InterruptedException e) {
                        logger.error("InterruptedException", e);
                    }
                    if (transactionStatus != null) {
                        if (orgChangeInfo.isError()) {
                            jtaTransactionManager
                                    .rollback(transactionStatus);
                        } else {
                            jtaTransactionManager
                                    .commit(transactionStatus);
                        }
                    }
                }
            }
        };
        t.start();
    }
    try {
        countDownLatch.await();
    } catch (InterruptedException e) {
        logger.error("InterruptedException", e);
    }
    ...
  • 写回答

1条回答 默认 最新

  • -天宇 2014-10-16 11:29
    关注

    只要不多表连查就行。

    用Lock显示锁,countDownLatch在这种场景下不适合,浪费性能

    评论

报告相同问题?

悬赏问题

  • ¥15 Excel发现不可读取的内容
  • ¥15 UE5#if WITH_EDITOR导致打包的功能不可用
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面
  • ¥15 算法题:数的划分,用记忆化DFS做WA求调
  • ¥15 chatglm-6b应用到django项目中,模型加载失败
  • ¥15 CreateBitmapFromWicBitmap内存释放问题。