php - 尝试获取锁时发现哪个查询导致死锁;尝试重启交易

标签 php mysql deadlock

我无法弄清楚是哪个查询导致尝试获取锁时发现死锁;尝试重新启动事务。 我的 mysql 包装器有以下几行

if (mysql_errno($this->conn) == 1213) {
  $this->bug_log(0,"Deadlock. SQL:".$this->sql);
}

bug_log 写入文件的位置。

bug日志文件没有Deadlock错误,但是/var/log/mysqld.log有多条记录:

111016  3:00:02 [ERROR] /usr/libexec/mysqld: Deadlock found when trying to get lock; try restarting transaction
111016  3:00:02 [ERROR] /usr/libexec/mysqld: Sort aborted
111016  3:00:02 [ERROR] /usr/libexec/mysqld: Deadlock found when trying to get lock; try restarting transaction
111016  3:00:02 [ERROR] /usr/libexec/mysqld: Sort aborted
111016  3:00:02 [ERROR] /usr/libexec/mysqld: Deadlock found when trying to get lock; try restarting transaction
111016  3:00:02 [ERROR] /usr/libexec/mysqld: Sort aborted

我怎样才能追踪到它?

最佳答案

如果另一个事务等待当前事务完成,则使用非唯一列的 WHERE 子句更新将导致死锁。这是一个快速测试:

CREATE TABLE test (pk int PRIMARY KEY, a int);
INSERT INTO test VALUES (0, 0);
INSERT INTO test VALUES (1, 0);

第 1 节

BEGIN;
SELECT a FROM test WHERE pk=0 FOR UPDATE;

第 2 节

BEGIN;
SELECT a FROM test WHERE pk=0 FOR UPDATE;

( session 2 现在被阻止)

第 1 节

UPDATE test SET a=1 WHERE a>0;

在 session 2 中我们收到一个错误

ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction

如果在更新的 WHERE 子句中我们只使用 pk 列,则不会发生错误。

关于php - 尝试获取锁时发现哪个查询导致死锁;尝试重启交易,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7782120/

相关文章:

c++ - 为什么 fclose 会挂起/死锁? ( Windows )

php - 从 mysql 查询中删除最后一个逗号

mysql - Innobackupex 从 SSH 恢复

php laravel 返回 foreach 中的所有数据

mysql事务死锁

php - 多个进程更新相同的行会导致mysql死锁?

php - 使用php将关联数组插入mysql

php - 用于遍历日期的 MySQL SELECT

php - 数据库设计;或使用 json 数据进行条件选择

php - 忽略 MySQL 查询中的空 "$_POST"值