Какой запрос вызывает Deadlock, найденный при попытке получить блокировку;попробуйте перезапустить транзакцию - PullRequest
4 голосов
/ 16 октября 2011

Я не могу понять, какой запрос вызывает Deadlock found when trying to get lock; try restarting transaction. Моя оболочка для mysql имеет следующие строки

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

где bug_log пишет в файл.

В файле журнала ошибок нет ошибок тупиковой ситуации, но /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

Как я могу отследить это?

Ответы [ 2 ]

8 голосов
/ 07 июля 2013

Обновление с предложением 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;

(Сессия 2 теперь заблокирована)

Сессия 1

UPDATE test SET a=1 WHERE a>0;

В сеансе 2 мы получаем ошибку

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

Если в предложении WHERE обновления мы используем только столбец pk, ошибка не возникает.

2 голосов
/ 16 октября 2011

Я видел, как это происходит при одном или нескольких из следующих условий:

  1. Соединение в одной и той же таблице несколько раз в запросе (SELF JOIN)
  2. При использовании транзакций, содержащих запросы, которые одновременно обрабатывают одну и ту же таблицу несколькими способами
  3. При использовании транзакций и использовании той же таблицы, что и SELF JOIN или подзапрос

Может быть трудно отследить, но ситуация в основном говорит о том, что один запрос препятствует выполнению другого, что, в свою очередь, препятствует завершению первого и т. Д. *

http://en.wikipedia.org/wiki/Deadlock

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...