我知道在 Innodb 中使用事务时不可避免地会发生死锁,并且如果应用程序代码正确处理它们是无害的 - 正如手册所说,“再试一次”。
所以我想知道 - 你如何检测死锁?死锁是否会发出一些特殊的 mysql 错误号?如果这很重要,我正在使用 PHP 的 mysqli 扩展。
谢谢你。
编辑:找到解决方案,见评论
我知道在 Innodb 中使用事务时不可避免地会发生死锁,并且如果应用程序代码正确处理它们是无害的 - 正如手册所说,“再试一次”。
所以我想知道 - 你如何检测死锁?死锁是否会发出一些特殊的 mysql 错误号?如果这很重要,我正在使用 PHP 的 mysqli 扩展。
谢谢你。
编辑:找到解决方案,见评论
MySQL 命令行客户端(不是查询浏览器)中的“SHOW ENGINE INNODB STATUS”将为您提供有关死锁的信息。
死锁也可能是由未提交的事务(通常是程序错误)引起的,运行未提交事务的人不会看到问题,因为他们会正常工作(因为他们的数据不会被提交)。
http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html
第1213章
事务死锁。您应该重新运行事务。
试试MaatKit。它有一个死锁记录器。
尝试使用MONyog。启用 MONyog 的“死锁监控”选项来跟踪 INNODB STATUS 报告的死锁。当发生新的死锁时,MONyog 将向用户发送警报。
如果你在 Mac 上:
$ brew install percona-toolkit
$ pt-deadlock-logger -uroot --ask-pass localhost
试试innotop,会为你检测死锁。
我最近创建了一个非常简单的死锁检查,用于实施 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");
}