Блокировки (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 (см. выше).