14

我知道在 Innodb 中使用事务时不可避免地会发生死锁,并且如果应用程序代码正确处理它们是无害的 - 正如手册所说,“再试一次”。

所以我想知道 - 你如何检测死锁?死锁是否会发出一些特殊的 mysql 错误号?如果这很重要,我正在使用 PHP 的 mysqli 扩展。

谢谢你。

编辑:找到解决方案,见评论

4

7 回答 7

19

MySQL 命令行客户端(不是查询浏览器)中的“SHOW ENGINE INNODB STATUS”将为您提供有关死锁的信息。

死锁也可能是由未提交的事务(通常是程序错误)引起的,运行未提交事务的人不会看到问题,因为他们会正常工作(因为他们的数据不会被提交)。

于 2011-01-17T22:35:02.070 回答
14

http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html

第1213章

事务死锁。您应该重新运行事务。

于 2009-03-13T15:04:54.670 回答
7

试试MaatKit。它有一个死锁记录器。

于 2009-03-13T15:04:17.497 回答
5

尝试使用MONyog。启用 MONyog 的“死锁监控”选项来跟踪 INNODB STATUS 报告的死锁。当发生新的死锁时,MONyog 将向用户发送警报。 在此处输入图像描述

于 2012-07-25T08:51:47.463 回答
2

如果你在 Mac 上:

$ brew install percona-toolkit

$ pt-deadlock-logger -uroot --ask-pass localhost

于 2015-05-18T16:43:50.590 回答
1

试试innotop,会为你检测死锁。

于 2009-07-06T01:58:35.743 回答
1

我最近创建了一个非常简单的死锁检查,用于实施 Web 应用程序的冒烟测试。代码可以改进很多,但它现在正在工作。有关下面使用的查询的输出的更多信息,请参阅https://dev.mysql.com/doc/refman/8.0/en/innodb-standard-monitor.html

$status = DB::select("SHOW ENGINE INNODB STATUS")["Status"]??null;

if(strpos($status,"LATEST DETECTED DEADLOCK") !== false)
{
  trigger_error("LATEST DETECTED DEADLOCK section present in output of SHOW ENGINE INNODB STATUS");
}

if(strpos($status,"LATEST FOREIGN KEY ERROR") !== false)
{
  trigger_error("LATEST FOREIGN KEY ERROR section present in output of SHOW ENGINE INNODB STATUS");
}
于 2019-03-28T13:51:54.430 回答