БЛОКИРОВКА ТАБЛИЦ
Синтаксис
LOCK TABLE[S]
tbl_name [[AS] alias] lock_type
[, tbl_name [[AS] alias] lock_type] ...
[WAIT n|NOWAIT]
lock_type:
READ [LOCAL]
| [LOW_PRIORITY] WRITE
| WRITE CONCURRENT
UNLOCK TABLES
Описание
lock_type может быть одним из следующих:
| Вариант | Описание |
|---|---|
| READ | Блокировка для чтения, записи запрещены |
| READ LOCAL | Блокировка для чтения, но разрешены одновременные вставки |
| WRITE | Исключительная блокировка для записи. Другие подключения не могут читать или записывать в эту таблицу |
| LOW_PRIORITY WRITE | Исключительная блокировка для записи, но разрешены новые блокировки для чтения в таблице до момента получения блокировки для записи. |
| WRITE CONCURRENT | Исключительная блокировка для записи, но разрешены блокировки READ LOCAL для таблицы. |
MariaDB позволяет клиентским сессиям явно приобретать блокировки таблиц для сотрудничества с другими сессиями при доступе к таблицам или для предотвращения модификации таблиц другими сессиями в периоды, когда сессия требует к ним исключительного доступа. Сессия может приобретать или освобождать блокировки только для себя. Одна сессия не может приобретать блокировки для другой сессии или освобождать блокировки, удерживаемые другой сессией.
Блокировки могут использоваться для эмуляции транзакций или для повышения скорости при обновлении таблиц.
LOCK TABLES явно приобретает блокировки таблиц для текущей клиентской сессии. Блокировки таблиц могут быть приобретены для базовых таблиц или представлений. Для использования LOCK TABLES, у вас должен быть LOCK TABLES привилегия, и SELECT привилегия для каждого объекта, который будет заблокирован. См. GRANT
Для блокировки представлений, LOCK TABLES добавляет все используемые базовые таблицы в представление в набор таблиц для блокировки и блокирует их автоматически. Если вы явно блокируете таблицу с помощью LOCK TABLES, все таблицы, используемые в триггерах, также блокируются неявно, как описано в Триггеры и неявные блокировки.
UNLOCK TABLES явно освобождает все блокировки таблиц, удерживаемые текущей сессией.
Ограничения
-
LOCK TABLESне работает при использовании Galera кластера. При использовании с Galera могут возникать сбои или блокировки. -
LOCK TABLESработает только с XtraDB/InnoDB таблицами, если переменная системы innodb_table_locks установлена в 1 (значение по умолчанию) и autocommit установлена в 0 (значение по умолчанию равно 1). Обратите внимание, что сообщение об ошибке при LOCK TABLES с innodb_table_locks = 0 не будет возвращено. -
LOCK TABLESнеявно подтверждает активную транзакцию, если она есть. Также, начало транзакции всегда освобождает все блокировки таблиц, приобретённые с помощью LOCK TABLES. Это означает, что нельзя одновременно иметь блокировки таблиц и активную транзакцию. Исключение составляют транзакции в режиме autocommit. Для сохранения целостности данных между транзакционными и нетранзакционными таблицами можно использовать функцию GET_LOCK(). - При использовании
LOCK TABLESнаTEMPORARYтаблице, она всегда будет заблокирована с помощьюWRITEблокировки. - Пока подключение удерживает явную блокировку для чтения таблицы, оно не может её изменить. Если вы попытаетесь, будет получена следующая ошибка:
ERROR 1099 (HY000): Table 'tab_name' was locked with a READ lock and can't be updated
- Пока подключение удерживает явную блокировку на таблице, оно не может получить доступ к незаблокированной таблице. Если вы попытаетесь, будет получена следующая ошибка:
ERROR 1100 (HY000): Table 'tab_name' was not locked with LOCK TABLES
- Пока подключение удерживает явную блокировку на таблице, оно не может выполнить следующие действия: INSERT DELAYED, CREATE TABLE, CREATE TABLE ... LIKE и DDL-операции, связанные с хранимыми процедурами и представлениями (за исключением триггеров). Если вы попытаетесь, будет получена следующая ошибка:
ERROR 1192 (HY000): Can't execute the given command because you have active locked tables or an active transaction
-
LOCK TABLESнельзя использовать в хранимых процедурах — если вы попытаетесь, будет возвращена следующая ошибка при создании:
ERROR 1314 (0A000): LOCK is not allowed in stored procedures
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/transactions-lock/