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

Решил разобраться в вопросе блокировок в 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
Ads
AdBlock has stolen the banner, but banners are not teeth — they will be back

More

Comments 4

    +7
    А можно в начале чуток про режимы изоляции, для целостности?
      0
      У вас, кажется, лишний второй абзац:
      При REPEATABLE READ чтение «заносится в буфер» и все последующие обращение возвращают одинаковый результат
      При READ COMMITED и READ UNCOMMITTED каждый запрос возвращает свежий результат

      Ведь написано, что режим SERIALIZABLE.
        0
        Спасибо, поправил
        0
        SELECT… WHERE выполняется без блокировки (кроме чтений в режиме изоляции SERIALIZABLE)

        В режиме REPEATABLE READ в подзапросе такой запрос по дочерней таблице блокирует обновление родительских записей. неожиданно

        Only users with full accounts can post comments. Log in, please.