环境:
Wildfly 8.1
Struts
EJB 3.1
Postgres 9面临线程死锁问题。希望能弄清楚。
代码:
bean.writeLockedUpdate(o1) 1.bean.writeLockedUpdate(o1) #2
场景:
试图修改的两个用户线程都是 o1对象。
这两个线程的线程转储片段:
Thread1:
“默认任务-56”#558 prio=5 os_prio=0 tid=0x724a4400 nid=0x1674等待条件为0x3d2ef000 java.lang.Thread.State: TIMED_WAITING (停车) 在org.jboss.as.ejb3.concurrency.EJBReadWriteLock$WriteLock.tryLock(EJBReadWriteLock.java:209) $$22.writeLockedUpdate(未知来源)
Thread2:
“默认任务-43”#530 prio=5 os_prio=0 tid=0x6bf10800 nid=0x15aa runnable 0x299c8000 java.lang.Thread.State: RUNNABLE at java.net.SocketInputStream.socketRead0(本机方法) 在org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:143) $$22.writeLockedUpdate(未知来源)
可能的解释:
我相信这就是发生了什么。
J控制台没有显示任何死锁。猜测是因为第二个被阻塞的锁位于DB级别。
Queation:
是否有办法验证上述解释?
提前谢谢。
发布于 2015-09-11 16:30:17
从Java和postgresql DB获得确认。
选择bl.pid为blocked_pid,bl.mode为blocked_mode,a.usename为blocked_user,ka.query为blocking_statement,now() - ka.query_start为blocking_duration,kl.pid为blocking_pid,kl.mode为blocking_mode,ka.usename为blocking_user,a.query为ka.usename,现在()- a.query_start as blocked_duration从pg_catalog.pg_locks bl加入pg_catalog.pg_stat_activity a on bl.pid = a.pid bl.pid kl加入pg_catalog.pg_stat_activity ka on kl.pid = ka.pid on bl.transactionid = kl.transactionid和bl.pid != kl.pid where not bl.granted
在我的例子中,上面的查询返回一行,显示更新被阻塞。
谢谢,Rakesh
https://stackoverflow.com/questions/32519947
复制相似问题