Режимы блокировок InnoDB
Транзакции получают блокировки, чтобы предотвратить одновременное изменение или даже чтение некоторых строк или диапазонов строк другими транзакциями. Это делается для того, чтобы убедиться, что одновременные операции записи никогда не сталкиваются.
InnoDB поддерживает ряд режимов блокировок.
Общие и эксклюзивные блокировки
Два стандартных типа блокировок на уровне строк — это общие блокировки (S) и эксклюзивные блокировки (X).
Общая блокировка приобретается для чтения строки и позволяет другим транзакциям читать заблокированную строку, но не записывать в неё. Другие транзакции также могут получить свои общие блокировки.
Эксклюзивная блокировка приобретается для записи в строку и предотвращает блокирование той же строки другими транзакциями. Её конкретное поведение зависит от уровня изоляции; по умолчанию (REPEATABLE READ) другие транзакции могут читать из строки, заблокированной эксклюзивно.
Блокировки намерения
InnoDB также допускает блокировку таблиц, и для того, чтобы блокировки на уровне таблиц и строк сосуществовали, существуют блокировки намерения.
Общая блокировка намерения (IS) указывает, что транзакция намеревается установить общую блокировку.
Эксклюзивная блокировка намерения (IX) указывает, что транзакция намеревается установить эксклюзивную блокировку.
Приобретение блокировки можно обобщить следующим образом:
- Блокировка X не предоставляется, если удерживается любая другая блокировка (X, S, IX, IS).
- Блокировка S не предоставляется, если удерживается блокировка X или IX. Она предоставляется, если удерживается блокировка S или IS.
- Блокировка IX не предоставляется, если удерживается блокировка X или S. Она предоставляется, если удерживается блокировка IX или IS.
- Блокировка IS не предоставляется, если удерживается блокировка X. Она предоставляется, если удерживается блокировка S, IX или IS.
Блокировки AUTO_INCREMENT
Блокировки также необходимы для автоинкремента — см. обработку AUTO_INCREMENT в InnoDB.
Блокировки пробелов
При использовании по умолчанию уровня изоляции, REPEATABLE READ, и, до MariaDB 10.4, по умолчанию innodb_locks_unsafe_for_binlog переменной используется метод блокировки пробелов. Когда InnoDB устанавливает общую или эксклюзивную блокировку на запись, она фактически устанавливается на записи индекса. Записи имеют внутренний индекс InnoDB даже в том случае, если у них не определен уникальный индекс. В то же время, блокировка удерживается на промежутке перед записью индекса, чтобы другая транзакция не могла вставить новую запись индекса в промежуток между записью и предыдущей записью.
Пробел может быть одной записью индекса, несколькими записями индекса или вообще не существовать в зависимости от содержимого индекса.
Если оператор использует все столбцы уникального индекса для поиска уникальной строки, блокировка пробелов не используется.
Подобно общим и эксклюзивным блокировкам намерения, описанным выше, может быть несколько типов блокировок пробелов. К ним относятся общая блокировка пробела, эксклюзивная блокировка пробела, общая блокировка пробела намерения и эксклюзивная блокировка пробела намерения.
Блокировки пробелов отключены, если переменная системы innodb_locks_unsafe_for_binlog установлена (до MariaDB 10.4) или уровень изоляции установлен на READ COMMITTED.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/innodb-lock-modes/