Обработка тупика innoDB - PullRequest
7 голосов
/ 15 марта 2011

Я получаю ошибку Deadlock found when trying to get lock; try restarting transaction в моих таблицах InnoDB. Вот запрос:

UPDATE views 
SET visit_cnt = visit_cnt + 1 
WHERE visit_day = DATE(NOW()) 
AND article_id = '4838'

Этот запрос также вызывает это через триггер ON UPDATE:

UPDATE articles 
SET views = views + 1 
WHERE id = NEW.article.id

Вот как я пытался это исправить:

$attempts_left = 5;
do
{
    mysql_query ($query);

    // if we found a deadlock, we will try this query 4 more times   
    if (mysql_errno () == 1213) { // 1213 - deadlock error
        $deadlocked = true;
        $attempts_left --;
    }
    else{
        $deadlocked = false;
    }
}
while($deadlocked && $attempts_left > 0);

Мой вопрос: это единственный способ справиться с тупиком? Я имею в виду, что это довольно уродливо, и время от времени случаются тупики. Есть ли какой-нибудь рекомендуемый способ исправить тупики?

Ответы [ 3 ]

2 голосов
/ 15 марта 2011

Возможно, вам придется поиграть в некоторые игры с функциями изоляции транзакций / MVCC

Вариант 1) Возможно, вы захотите заключить запрос в блок начала фиксации

BEGIN;

UPDATE views
SET visit_cnt = visit_cnt + 1
WHERE visit_day = DATE(NOW())
AND article_id = '4838';

< Any actions in the trigger would be part of the transaction >

COMMIT;

Вариант 2)Возможно, вы захотите отключить автокоммит для вашего сеанса

SET autocommit = 0;

Вариант 3) Изменить изоляцию транзакции перед запуском запроса для выставления грязных чтений

Это растяжение !!!

SET tx_isolation = READ_COMMITTED;

или

SET tx_isolation = READ_UNCOMMITTED;

Попробуйте и дайте нам всем знать !!!

2 голосов
/ 15 марта 2011

Это правильный путь, как говорится в документации:

Обычно вы должны писать свои приложения так, чтобы они всегда были готовы к повторной выдаче транзакции, если она откатывается из-за тупика.

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

2 голосов
/ 15 марта 2011

Вот хорошая документация по обработке InnoDB взаимоблокировок .

PS: Мне больше нечего было добавить, поэтому просто дал вам ссылку.

...