我知道在使用Innodb中的事务时,死锁是不可避免的,如果应用程序代码正确处理,它们是无害的 - 正如手册所说,“再试一次”。
那么我想知道 - 如何检测死锁?死锁会发出特殊的MySQL错误号码吗?如果有必要的话,我正在使用PHP的mysqli扩展。
谢谢。
编辑:解决方案已找到,请参见评论部分。
我知道在使用Innodb中的事务时,死锁是不可避免的,如果应用程序代码正确处理,它们是无害的 - 正如手册所说,“再试一次”。
那么我想知道 - 如何检测死锁?死锁会发出特殊的MySQL错误号码吗?如果有必要的话,我正在使用PHP的mysqli扩展。
谢谢。
编辑:解决方案已找到,请参见评论部分。
"SHOW ENGINE INNODB STATUS" 命令可在 MySQL 命令行客户端(而非查询浏览器)中提供有关死锁的信息。
死锁也可能由未提交的事务引起(通常是程序错误),运行未提交事务的人将看不到问题,因为他们将正常工作(尽管他们的数据尚未被提交)。
http://dev.mysql.com/doc/refman/5.0/en/innodb-error-codes.html
1213 (ER_LOCK_DEADLOCK)
事务死锁。您应该重新运行事务。
$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");
}
尝试使用innotop,它会为您检测死锁。