Skip to content

Latest commit

 

History

History
28 lines (17 loc) · 5.71 KB

locking-modes.md

File metadata and controls

28 lines (17 loc) · 5.71 KB

Режимы работы блокировок

InnoDB реализует блокировки строк в двух режимах: чтения (shared (S) lock) и записи (exclusive (X) lock).

Блокировка в режиме чтения позволяет транзакции, получившей эту блокировку читать строку. Блокировка в режиме записи позволяет транзакции не только читать, но и обновлять и удалять строку.

Если транзакция T1 обладает блокировкой чтения на строку r, то запрос от второй транзакции T2 на блокировку той же строки r обрабатывается следующим образом:

  1. запрос на блокировку чтения может быть выдан сразу же, т.е. в результате обе транзакции T1 и T2 будут обладать блокировками чтения на строку r
  2. запрос на блокировку записи не может быть выдан до тех пор, пока транзакция T1 не освободит блокировку чтения на строку r

Если транзакция T1 обладает блокировкой записи на строку r, то запрос от второй транзакции T2 на блокировку любого режима будет приостановлен до тех пор пока транзакция T1 не освободит блокировку записи на строку r.

Для поддежки различной гранулярности блокировки данных, в InnoDB существуют так называемые целевые блокировки (intention locks), которые работают не на уровне строк, а на уровне таблиц. Целевые блокировки предназначены для того чтобы обозначить намерение транзакции получить в будующем блокировки чтения или записи на некоторые строки в данной таблице. Если транзакция собирается получить в таблице только блокировки чтения, то это целевая блокировка чтения (intention shared (IS) lock). Если транзакция намерена получить блокировки записи, то это целевая блокировка записи (intention exclusive (IX) lock). Например, выражение SELECT ... LOCK IN SHARE MODE установит на таблицу целевую блокировку чтения (IS lock), а выражение SELECT ... FOR UPDATE установит целевую блокировку записи (IX lock).

Перед тем как установить блокировку чтения (S lock) на строку в таблице, транзакция должна сначала установить целевую блокировку чтения (IS lock) или блокировку уровнем строже на эту таблицу. Перед тем как получить блокировку записи (X lock) на строку в таблице, транзакция должна сначала установить целевую блокировку записи (IX lock) на эту таблицу. Совместимость блокировок представлена в таблице ниже:

| X | IX | S | IS -------- | --------- | ----------- | ----------- | ----------- X | Конфликт | Конфликт | Конфликт | Конфликт IX | Конфликт | Совместимо | Конфликт | Совместимо S | Конфликт | Конфликт | Совместимо | Совместимо IS | Конфликт | Совместимо | Совместимо | Совместимо

Если транзакция пытается установить блокировку которая конфликтует с существующей, то она будет остановлена до момента пока существующая блокировка не будет снята. В случаях когда транзакция пытается установить конфликтующую блокировку, которая приведет к так называемой взаимной блокировке (deadlock), InnoDB выбросит ошибку (error).

Целевые блокировки блокируют только запросы на всю таблицу, например LOCK TABLES ... WRITE. Основное предназначение целевых блокировок - это обозначить что транзакция уже блокирует или собирается заблокировать строки в таблице.