在action层某个方法内使用线程池并发处理业务,造成数据库死锁
死锁如下:
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.
我非常不理解, 为什么同一事务和数据源并发查询会造成数据库死锁? (也许是我搞错了? 还有别的原因会死锁?)
有人对此有研究么?