多线程更新多个表数据

LegendAniu 2014-10-14 04:13:08
更新A、B、C等多张表数据,而且这些更新需要在同一个事务里保证一致性,这些表没有关联关系。能否使用多线程的方式实现,我尝试每个线程都为一个事务,这些事务会一起提交或者回滚,通过CountDownLatch来等待其它线程执行完成,会有一个参数表示是否有异常,有异常时所有线程事务都回滚,无异常则都提交。但是发现更新数据时会出现死锁,一个表执行完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();
}
...


名称: TEST
状态:WAITING 在 java.util.concurrent.CountDownLatch$Sync@18fee1a 上
阻塞总数:3 等待总数: 1

堆栈追踪:
sun.misc.Unsafe.park(Native Method)
java.util.concurrent.locks.LockSupport.park(Unknown Source)
java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(Unknown Source)
java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(Unknown Source)
java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(Unknown Source)
java.util.concurrent.CountDownLatch.await(Unknown Source)
com.tianque.plugin.orgchange.service.OrgChangeHandlerServiceImpl$1.run(OrgChangeHandlerServiceImpl.java:280)

名称: TESTTABLE
状态: RUNNABLE
阻塞总数:5 等待总数: 0

堆栈追踪:
java.net.SocketInputStream.socketRead0(Native Method)
java.net.SocketInputStream.read(Unknown Source)
oracle.net.ns.Packet.receive(Unknown Source)
oracle.net.ns.DataPacket.receive(Unknown Source)
oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)
oracle.net.ns.NetInputStream.read(Unknown Source)
oracle.net.ns.NetInputStream.read(Unknown Source)
oracle.net.ns.NetInputStream.read(Unknown Source)
oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1104)
oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:1075)
oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:480)
oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:216)
oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:966)
oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1170)
oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3339)
oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:3445)
- 已锁定 oracle.jdbc.driver.T4CPreparedStatement@14c7b84
- 已锁定 oracle.jdbc.driver.T4CConnection@9fd14a
com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.execute(NewProxyPreparedStatement.java:989)
com.ibatis.sqlmap.engine.execution.DefaultSqlExecutor.executeUpdate(DefaultSqlExecutor.java:77)
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteUpdate(MappedStatement.java:216)
com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeUpdate(MappedStatement.java:94)
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:468)
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90)
org.springframework.orm.ibatis.SqlMapClientTemplate$10.doInSqlMapClient(SqlMapClientTemplate.java:413)
org.springframework.orm.ibatis.SqlMapClientTemplate.execute(SqlMapClientTemplate.java:209)
org.springframework.orm.ibatis.SqlMapClientTemplate.update(SqlMapClientTemplate.java:411)
com.tianque.plugin.orgchange.dao.CommonHandlerDAO$Impl.updateData(Unknown Source)
com.tianque.plugin.orgchange.handler.AbstractOrgChangeHandler.execute(AbstractOrgChangeHandler.java:123)
com.tianque.plugin.orgchange.handler.AbstractOrgChangeHandler.transfer(AbstractOrgChangeHandler.java:64)
com.tianque.plugin.orgchange.service.OrgChangeHandlerServiceImpl.moduleChange(OrgChangeHandlerServiceImpl.java:342)
com.tianque.plugin.orgchange.service.OrgChangeHandlerServiceImpl.access$3(OrgChangeHandlerServiceImpl.java:307)
com.tianque.plugin.orgchange.service.OrgChangeHandlerServiceImpl$1.run(OrgChangeHandlerServiceImpl.java:272)
...全文
182 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,549

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧