Задавайте вопросы, мы ответим
Вы не зашли.
Запрос типа UPDATE `tab` SET `A`=5 WHERE `id`=1 OR `id`=2. Если запустят одновременно двое... Deadlock не выйдет? 1ый заблокирует id=1 а второй перекинется на 2 (т.к. 1ый заблокировал) и потом ситуёвина взаимоблокировки. Тип таблиц InnoDB..
Вообще такое возможно?
Неактивен
Да, возможно.
Неактивен
Или же 1-юзер сразу заблокирует обе записи для себя?.. вот бы более досканальное руководство по блокировкам где то найти.
Короче надо наверняка найти пособие как происходит блокировка у UPDATE, DELETE, SELECT, когда блокируется вся таблица. Слышал что блокировка по записям проходит при указании конкретного значения первичного ключа (тобишь ID).. а если указано WHERE и несколько ID'и, по очереди блокируются или все сразу... не понятно ващее
Отредактированно Nick Cookie (12.09.2010 13:11:08)
Неактивен
Сразу вся таблица блокируется, если выполнить LOCK TABLES tablename WRITE.
Блокируется так же, как в MyISAM — на уровне MySQL, поэтому в этом случае
deadlock невозможны.
Когда таблица целиком не блокируется, она блокируется по мере прохождения
запросом индекса. При этом блокировки ставятся на найденные строки (и в случае
ставки и удаления — на пространство перед изменяемой строкой). Если запрос
при изменении использует вторичный индекс — блокировки ставятся как на
вторичный индекс, так и на PRIMARY (т.к. он кластерный, и для поиска строк он
используется тоже).
Собственно, всё. Одновременности тут нет. Шанс, что два одинаковых запроса
Вашего вида заблокируются, скорее всего, нулевой: они оба сначала попробуют
заблокировать первый id, а потом второй (и, соответственно, один из запросов
просто будет ждать), но это, скорее, следствие конкретного ПО, и, вообще говоря,
может измениться вдальнейшем, поэтому полагаться на это не нужно. А полагаться
нужно на то, что если произошел deadlock, нужно повторить откатившуюся тран-
закцию — ровно то, что написано в тексте ошибки.
Неактивен