Как стать автором
Обновить

Блокировки в InnoDB (шпаргалка)

Время на прочтение2 мин
Количество просмотров18K
Решил разобраться в вопросе блокировок в InnoDB. Получилась такая вот краткая шпаргалка. Может кому пригодится. Буду благодарен сообществу за найденные неточности

И так, в пределах одной транзакции, после…

UPDATE… WHERE

SELECT… WHERE выполняется без блокировки (кроме чтений в режиме изоляции SERIALIZABLE)
SELECT… LOCK IN SHARE MODE ждет освобождение блокировки
SELECT… FOR UPDATE ждет освобождение блокировки
UPDATE и DELETE ждет освобождение блокировки

Если UPDATE… WHERE выполнился в режиме изоляции REPEATABLE READ или SERIALIZABLE и строки выбирались не по уникальному ключу, то блокируются также INSERT в этот ключ (так называемый NEXT-KEY LOCK), но при READ COMMITTED и READ UNCOMMITTED такой блокировки не происходит

DELETE FROM… WHERE

Так же как и для UPDATE… WHERE

SELECT… WHERE

Во всех режимах изоляции кроме SERIALIZABLE

Остальные потоки могут читать и писать/удалять
INSERT блокируется так же как и в UPDATE… WHERE

При REPEATABLE READ чтение «заносится в буфер» и все последующие обращение возвращают одинаковый результат
При READ COMMITED и READ UNCOMMITTED каждый запрос возвращает свежий результат (после завершения транзакции другим потоком)

В режиме изоляции SERIALIZABLE

Остальные потоки могут только читать (кроме чтений SELECT… FOR UPDATE)
UPDATE и DELETE ждет освобождение блокировки
INSERT блокируется так же как и в UPDATE… WHERE

SELECT… LOCK IN SHARE MODE

Остальные потоки могут только читать
UPDATE и DELETE ждет освобождение блокировки
INSERT блокируется так же как и в UPDATE… WHERE

SELECT… FOR UPDATE

SELECT… WHERE могут читать (кроме чтений в режиме изоляции SERIALIZABLE)
SELECT… LOCK IN SHARE MODE и SELECT… FOR UPDATE ждут освобождения блокировки
UPDATE и DELETE ждет освобождение блокировки
INSERT блокируется так же как и в UPDATE… WHERE
Теги:
Хабы:
Всего голосов 64: ↑55 и ↓9+46
Комментарии4

Публикации

Истории

Ближайшие события