SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 12.09.2010 10:01:53

Nick Cookie
Участник
Зарегистрирован: 12.09.2010
Сообщений: 2

Взаимоблокировка возможна в простых запросах?

Запрос типа UPDATE `tab` SET `A`=5 WHERE `id`=1 OR `id`=2. Если запустят одновременно двое... Deadlock не выйдет? 1ый заблокирует id=1 а второй перекинется на 2 (т.к. 1ый заблокировал) и потом ситуёвина взаимоблокировки. Тип таблиц InnoDB..

Вообще такое возможно?

Неактивен

 

#2 12.09.2010 11:13:35

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Взаимоблокировка возможна в простых запросах?

Да, возможно.

Неактивен

 

#3 12.09.2010 12:35:49

Nick Cookie
Участник
Зарегистрирован: 12.09.2010
Сообщений: 2

Re: Взаимоблокировка возможна в простых запросах?

Или же 1-юзер сразу заблокирует обе записи для себя?.. вот бы более досканальное руководство по блокировкам где то найти.

Короче надо наверняка найти пособие как происходит блокировка у UPDATE, DELETE, SELECT, когда блокируется вся таблица. Слышал что блокировка по записям проходит при указании конкретного значения первичного ключа (тобишь ID).. а если указано WHERE и несколько ID'и, по очереди блокируются или все сразу... не понятно ващее

Отредактированно Nick Cookie (12.09.2010 13:11:08)

Неактивен

 

#4 12.09.2010 18:08:13

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Взаимоблокировка возможна в простых запросах?

Сразу вся таблица блокируется, если выполнить LOCK TABLES tablename WRITE.
Блокируется так же, как в MyISAM — на уровне MySQL, поэтому в этом случае
deadlock невозможны.

Когда таблица целиком не блокируется, она блокируется по мере прохождения
запросом индекса. При этом блокировки ставятся на найденные строки (и в случае
ставки и удаления — на пространство перед изменяемой строкой). Если запрос
при изменении использует вторичный индекс — блокировки ставятся как на
вторичный индекс, так и на PRIMARY (т.к. он кластерный, и для поиска строк он
используется тоже).

Собственно, всё. Одновременности тут нет. Шанс, что два одинаковых запроса
Вашего вида заблокируются, скорее всего, нулевой: они оба сначала попробуют
заблокировать первый id, а потом второй (и, соответственно, один из запросов
просто будет ждать), но это, скорее, следствие конкретного ПО, и, вообще говоря,
может измениться вдальнейшем, поэтому полагаться на это не нужно. А полагаться
нужно на то, что если произошел deadlock, нужно повторить откатившуюся тран-
закцию — ровно то, что написано в тексте ошибки.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson