在action层某个方法内使用线程池并发处理业务,造成数据库死锁

zwei2012 2014-09-25 06:25:20
死锁如下:

ERROR 2014-09-24 10:50:59 [org.hibernate.util.JDBCExceptionReporter.logExceptions(72)] ORA-00060: deadlock detected while waiting for resource

ERROR 2014-09-24 10:50:59 [org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(300)] Could not synchronize database state with session
org.hibernate.exception.LockAcquisitionException: Could not execute JDBC batch update

下面的堆栈指向我的一个池线程提供的业务处理:
at com.tongtech.gtp.monitorcenter.view.bean.task.ThreadSendTaskStateTest.run(ThreadSendTaskStateTest.java:37)
at com.tongtech.gtp.monitorcenter.thread.threadPool.ThreadPool$PooledThread.run(ThreadPool.java:158)

这个业务内部, 设置了不超过50的线程池, 唯一的共享资源是通过spring注入action的同一个service实现类----当然最终会共享同一个数据源和事务, 我没有给使用到的service方法加锁, 因为我觉的这个方法只是做查询... 如果加锁,就没有并发的意义了.

但为什么它会报出一个JDBC batch update? 程序里根本没使用过批量batch update.

我非常不理解, 为什么同一事务和数据源并发查询会造成数据库死锁? (也许是我搞错了? 还有别的原因会死锁?)

有人对此有研究么?



...全文
154 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
zwei2012 2014-09-26
  • 打赏
  • 举报
回复
没有人知道吗?
zwei2012 2014-09-25
  • 打赏
  • 举报
回复
线程共享的资源就是一个taskService, 只有第一个查询方法对数据库进行查询操作...... 后一个方法调了另外的JMS接口..压根跟数据库没关系了... 实在是不理解...只是并发的查询怎么就数据库死锁了?
zwei2012 2014-09-25
  • 打赏
  • 举报
回复
线程处理代码如下: public void run() { try{ //查数据库任务列表 List<TaskInfo> taskInfoList = taskService.findTaskInfoByNodeId(node.getNodeid()); //从客户端获取任务列表 List<GTPTaskInfo> list = taskService.getAllTaskInfoList(null, node.getIp(), node.getPort()); if(taskInfoList!=null){ for(TaskInfo taskInfo:taskInfoList){ for(GTPTaskInfo task:list){ if(task.getTaskName().equals(taskInfo.getTask_name())){ //填充返回页面列表中任务状态字段 buildTraceResult(taskInfo,getStatus(task)); break; } } } } }catch (Exception e) { e.printStackTrace(); } }

81,114

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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