MySQL InnoDB Deadlock

Общие вопросы по использованию фреймворка. Если не знаете как что-то сделать и это про Yii, вам сюда.
Ответить
Аватара пользователя
Uniser
Сообщения: 19
Зарегистрирован: 2015.05.22, 00:01
Откуда: Украина
Контактная информация:

MySQL InnoDB Deadlock

Сообщение Uniser »

Один поток читает из таблицы набор моделей
Затем делает длительную операцию (до 3 минут)
Затем может удалить или изменить ряд записей

Другой поток добавляет в эту таблицу новые записи и периодически выдаёт такие ошибки
SQLSTATE[HY000]: General error: 1205 Lock wait timeout exceeded; try restarting transaction. The SQL statement executed was
SQLSTATE[40001]: Serialization failure: 1213 Deadlock found when trying to get lock; try restarting transaction.
Вычитал, что для InnoDB блокируются используемые в запросе строки (в случае, если набор этих строк может быть однозначно определен значениями первичного ключа — иначе, блокируется вся таблица).
Похоже, что мой запрос блокирует таблицу, т.к. первичный ключ не использую:

Код: Выделить всё

$domains = Domain::model() //default order by dt_update ASC
    ->limit(450) // Полчаса после обновления домен не трогаем
    ->findAll('dt_update<"'.date('Y-m-d H:i:s',strtotime('-30 minutes')).'"');
$request = $source = array();
foreach($domains as $domain)
    $request[] = $domain->dm_sef;
// Освободить ресурсы
// Длительная операция
// Правки в БД (быстро)    
Вопрос в том, как в Yii1 освободить ресурсы mysql, чтобы после длительной операции, можно было продолжить работу с mysql
Аватара пользователя
Uniser
Сообщения: 19
Зарегистрирован: 2015.05.22, 00:01
Откуда: Украина
Контактная информация:

Re: MySQL InnoDB Deadlock

Сообщение Uniser »

Нашёл решение:

Код: Выделить всё

Yii::app()->db->createCommand('SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;')->execute();
Archil
Сообщения: 11
Зарегистрирован: 2012.05.30, 19:25

Re: MySQL InnoDB Deadlock

Сообщение Archil »

Uniser писал(а): 2015.08.07, 00:38 Нашёл решение:

Код: Выделить всё

Yii::app()->db->createCommand('SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;')->execute();
Куда это добавлять, перед или после запроса?
Ответить