如何找到死锁的两个线程?

时间:2010-09-13 20:29:14

标签: java hibernate spring tomcat deadlock

我们正在Tomcat 5.5中运行经典的spring / hibernate / mysql堆栈。偶尔,当尝试超时锁定表行时,我们会遇到死锁。抛出某种死锁异常。

异常清楚,堆栈跟踪指示出错的地方。但它没有显示持有实际锁的其他线程。除非我知道那个线程在做什么,否则它只是大海捞针。

问题:有没有办法找到另一个线程?

谢谢!

4 个答案:

答案 0 :(得分:1)

下次看到死锁时,请尝试在MySQL中使用以下命令。这应该会告诉你最后的僵局。

SHOW INNODB STATUS

通常,当您在应用程序服务器上看到死锁时,日志仅显示受害者线程(已回滚的线程)。由于其他线程已完成,因此不会抛出任何异常。您需要返回到数据库以重新创建事务。

从数据库中捕获死锁发生的位置后,您可以进一步调查。

答案 1 :(得分:0)

不确定你是否已经弄明白但是如果它是一个死锁,那么线程转储在这里会有很大的帮助。根据应用程序运行的操作系统以及访问它的权限,您可以通过多种方式生成它。

  • on * nix向进程发送QUIT信号('kill -3 pid')将完成工作
  • 使用jconsole / jvisualvm可以选择获取它
  • 使用标准的jdk jstack(考虑-F -l选项)就可以了解
  • 如果你有幸参加solaris pstack会有很多帮助

一旦获得它,分析锁定/等待线程以找到死锁。您可以手动或使用一些利用死锁检测算法的现有分析器来完成。顺便说一下,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视图中内联显示。死锁中涉及的线程和锁以红色突出显示。

     

alt text