我无法弄清楚是哪个查询导致尝试获取锁时发现死锁;尝试重新启动事务
。
我的 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/