我们正在Tomcat 5.5中运行经典的spring / hibernate / mysql堆栈。偶尔,当尝试超时锁定表行时,我们会遇到死锁。抛出某种死锁异常。
异常清楚,堆栈跟踪指示出错的地方。但它没有显示持有实际锁的其他线程。除非我知道那个线程在做什么,否则它只是大海捞针。
问题:有没有办法找到另一个线程?
谢谢!
扬
答案 0 :(得分:1)
下次看到死锁时,请尝试在MySQL中使用以下命令。这应该会告诉你最后的僵局。
SHOW INNODB STATUS
通常,当您在应用程序服务器上看到死锁时,日志仅显示受害者线程(已回滚的线程)。由于其他线程已完成,因此不会抛出任何异常。您需要返回到数据库以重新创建事务。
从数据库中捕获死锁发生的位置后,您可以进一步调查。
答案 1 :(得分:0)
不确定你是否已经弄明白但是如果它是一个死锁,那么线程转储在这里会有很大的帮助。根据应用程序运行的操作系统以及访问它的权限,您可以通过多种方式生成它。
一旦获得它,分析锁定/等待线程以找到死锁。您可以手动或使用一些利用死锁检测算法的现有分析器来完成。顺便说一下,jvm有一个内置功能,它可以在线程转储中为您提供想法。
如果我能提供更多帮助,请告诉我。
祝你好运。的问候, 巴兹
答案 2 :(得分:0)
如果是代码问题,您可以尝试使用jconsole连接到正在运行的进程并检测死锁。
答案 3 :(得分:0)
如果需要查找持有锁的线程,可以通过调试视图在Eclipse中执行此操作。查看http://archive.eclipse.org/eclipse/downloads/drops/R-3.1-200506271435/eclipse-news-part2b.html并向下滚动到“调试锁定和死锁”。
线程拥有的锁以及线程正在等待的锁都可以通过切换Debug视图下拉菜单中的Show Monitors菜单项在Debug视图中内联显示。死锁中涉及的线程和锁以红色突出显示。