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 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?