Решил разобраться в вопросе блокировок в 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
При REPEATABLE READ чтение «заносится в буфер» и все последующие обращение возвращают одинаковый результат
При READ COMMITED и READ UNCOMMITTED каждый запрос возвращает свежий результат
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
Автор: zim32