我知道发生死锁不可避免地InnoDB和在使用事务时,他们是无害的,如果他们是由应用程序代码妥善处理 - “只是再试一次”,因为手册说

所以我想知道 - 你怎么检测死锁?是否死锁发出一些特殊的MySQL错误号码是多少?我使用PHP的mysqli扩展,如果该事项。

感谢您。

编辑:溶液中发现的,见注释

有帮助吗?

解决方案

http://dev.mysql.com/ DOC / refman / 5.0 / EN / innodb的误差-codes.html

  

1213(ER_LOCK_DEADLOCK)

     

交易死锁。你应该重新运行   该事务。

其他提示

“SHOW ENGINE INNODB STATUS”从MySQL命令行客户端(而不是查询浏览器)会给你死锁的信息。

死锁也可以通过未提交的事务(通常是程序错误),谁运行未提交的事务不会看到,因为他们将是工作的罚款问题的人(通过他们的数据将不被确认)引起

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

尝试使用 MONyog 。启用MONyog的“死锁监控”选项,以跟踪INNODB STATUS报告的死锁。 MONyog将在一个新的死锁发生警报发送给用户。 “在这里输入的图像描述”

尝试innotop,将检测到死锁你。

如果你在Mac:

$酿造安装的Percona的工具包

$ PT-死锁记录器-uroot --ask通本地主机

我最近创建了死锁的web applciation的冒烟测试的执行非常简单的检查。代码可以是提高了很多,但它的工作现在。请参见 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");
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top