问题描述
- 多线程更新多个表数据
-
更新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); } ...
解决方案
只要不多表连查就行。
用Lock显示锁,countDownLatch在这种场景下不适合,浪费性能
时间: 2025-01-07 18:52:37