Блокировки в MySQL

Блокировки (locks).

Механизм блокировок (locks) используется в базах данных для того, чтобы обеспечить последовательный доступ к изменению одинаковых данных различным клиентам. Другими словами с помощью блокировок обеспечивается, чтобы в конкретный момент времени только одна транзакция могла изменять указанные данные. Без какого-либо механизма блокировок в базе данных был бы невозможен многопользовательский режим. Иначе как, к примеру, предотвратить одновременное изменений одной и той же строки разными пользователями. Способы реализации механизма блокировок в СУБД различных производителей могут существенно отличаться.

Явные блокировки.

В InnoDB в MySQL поддерживается два типа блокировок строк.

  • LOCK IN SHARE MODE – блокировка в режиме совместного использования. Это значит, что никакая другая транзакция не сможет изменить или удалить соответствующие данные, либо установить эксклюзивную блокировку. Для чтения никаких ограничений нет. Кроме того, может быть установлена такая же блокировка совместного использования.
  • FOR UPDATE – эксклюзивная блокировка каждой из выбранных строк. Гарантирует, что никакая другая транзакция не сможет изменить или удалить соответствующие данные, установка блокировки совместного использования будет также ждать освобождения данной блокировки. На операции чтения ограничений нет.

Эти блокировки могут быть добавлены в команду SELECT. Например:

SELECT * FROM country WHERE name = ‘JAPAN’ LOCK IN SHARE MODE;

SELECT last_num INTO @@mycounter FROM mytable FOR UPDATE;
UPDATE mytable SET last_num=@@mycounter+1;

Если включен режим изоляции транзакций SERIALIZABLE, InnoDB неявно добавляет в команды SELECT, в которых нет явного указания блокировки, “LOCK IN SHARE MODE”.

Неявные блокировки.

MySQL сервер может накладывать неявные блокировки в зависимости от выполняемых команд и “движка” (storage engines). Рассмотрим для примера разницу между InnoDB и MyISAM.

Операция InnoDB MyISAM
SELECT Нет блокировок* Table-level shared lock
UPDATE/DELETE Row-level exclusive lock Table-level exclusive lock
ALTER TABLE Table-level shared lock Table-level shared lock

* – нет блокировок за исключением режима уровня изоляции транзакций SERIALIZABLE (см. выше).

Leave a Reply

Your email address will not be published. Required fields are marked *