Spec-Zone .ru
спецификации, руководства, описания, API

13.3.5. LOCK TABLES и UNLOCKTABLES Синтаксис

13.3.5.1. Взаимодействие Табличной Блокировки и Транзакций
13.3.5.2. LOCK TABLES и Триггеры
13.3.5.3. Блокирующие таблицу Ограничения и Условия
LOCK TABLES    tbl_name [[AS] alias] lock_type    [, tbl_name [[AS] alias] lock_type] ...lock_type:    READ [LOCAL]  | [LOW_PRIORITY] WRITEUNLOCK TABLES

MySQL позволяет клиентским сеансам получить блокировки таблицы явно с целью сотрудничества с другими сеансами для доступа к таблицам, или препятствовать тому, чтобы другие сеансы изменили таблицы в течение периодов, когда сеанс требует эксклюзивного доступа к ним. Сеанс может получить или выпустить блокировки только для себя. Один сеанс не может получить блокировки для другого сеанса или выпустить блокировки, сохраненные другим сеансом.

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

LOCK TABLES явно получает блокировки таблицы для текущего клиентского сеанса. Блокировки таблицы могут быть получены за базовые таблицы или представления. Вы должны иметь LOCK TABLES полномочие, и SELECT полномочие для каждого объекта, который будет заблокирован.

Для блокировки представления, LOCK TABLES добавляют все базовые таблицы, привыкшие в представлении к набору таблиц, которые будут заблокированы, и блокируют их автоматически. Если Вы блокируете таблицу явно с LOCK TABLES, любые таблицы, используемые в триггерах, также блокируются неявно, как описано в Разделе 13.3.5.2,"LOCK TABLES и Триггеры".

UNLOCK TABLES явно выпуски любые блокировки таблицы сохранены текущим сеансом. LOCK TABLES неявно выпуски любые блокировки таблицы, сохраненные текущим сеансом прежде, чем получить новые блокировки.

Другое использование для UNLOCK TABLES должен выпустить глобальную блокировку чтения, полученную с FLUSH TABLES WITH READ LOCK оператор, который позволяет Вам заблокировать все таблицы во всех базах данных. См. Раздел 13.7.6.3,"FLUSH Синтаксис". (Это - очень удобный способ получить резервные копии, если у Вас есть файловая система, такая как Veritas, который может взять снимки вовремя.)

Блокировка таблицы защищает только от несоответствующих чтений или записей другими сеансами. Сеанс, содержащий блокировку, даже блокировка чтения, может выполнить операции на уровне таблицы такой как DROP TABLE. Усеченные операции не безопасны от транзакции, таким образом, ошибка происходит, если сеанс пытается один во время активной транзакции или содержа блокировку таблицы.

Следующее обсуждение применяется только к не -TEMPORARY таблицы. LOCK TABLES разрешается (но игнорируется) для a TEMPORARY таблица. К таблице может получить доступ свободно сеанс, в пределах которого она создавалась, независимо от того, чем другая блокировка может быть в действительности. Никакая блокировка не необходима, потому что никакой другой сеанс не может видеть таблицу.

Для получения информации о других условиях на использовании LOCK TABLES и операторы, которые не могут использоваться в то время как LOCK TABLES в действительности, см. Раздел 13.3.5.3, "Блокирующие таблицу Ограничения и Условия"

Правила для Сбора Блокировки

Чтобы получить блокировки таблицы в пределах текущего сеанса, используйте LOCK TABLES оператор. Следующие типы блокировки доступны:

READ [LOCAL] блокировка:

[LOW_PRIORITY] WRITE блокировка:

Если LOCK TABLES оператор должен ожидать из-за блокировок, сохраненных другими сеансами на любой из таблиц, он блокирует, пока все блокировки не могут быть получены.

Сеанс, который требует блокировок, должен получить все блокировки, в которых требуется в сингле LOCK TABLES оператор. В то время как блокировки, таким образом полученные, сохранены, сеанс может получить доступ только к заблокированным таблицам. Например, в следующей последовательности операторов, ошибка происходит для попытки получить доступ t2 потому что это не было привязано LOCK TABLES оператор:

mysql> LOCK TABLES t1 READ;mysql> SELECT COUNT(*) FROM t1;+----------+| COUNT(*) |+----------+|        3 |+----------+mysql> SELECT COUNT(*) FROM t2;ERROR 1100 (HY000): Table 't2' was not locked with LOCK TABLES

Таблицы в INFORMATION_SCHEMA база данных является исключением. К ним можно получить доступ, не будучи заблокированным явно даже, в то время как сеанс содержит блокировки таблицы, полученные с LOCK TABLES.

Невозможно обратиться к заблокированной таблице многократно в единственном запросе, используя то же самое имя. Используйте псевдонимы вместо этого, и получите отдельную блокировку для таблицы и каждого псевдонима:

mysql> LOCK TABLE t WRITE, t AS t1
        READ;mysql> INSERT INTO t SELECT * FROM t;ERROR 1100: Table 't' was not locked with LOCK TABLESmysql> INSERT INTO t SELECT * FROM t AS t1;

Ошибка происходит для первого INSERT потому что есть две ссылки на то же самое имя для заблокированной таблицы. Второе INSERT успешно выполняется, потому что ссылки на таблицу используют различные имена.

Если Ваши операторы обращаются к таблице посредством псевдонима, следует заблокировать таблицу, используя тот же самый псевдоним. Это не работает, чтобы заблокировать таблицу, не определяя псевдоним:

mysql> LOCK TABLE t
        READ;mysql> SELECT * FROM t AS myalias;ERROR 1100: Table 'myalias' was not locked with LOCK TABLES

Наоборот, если Вы блокируете таблицу, используя псевдоним, следует обратиться к этому в Ваших операторах, используя тот псевдоним:

mysql> LOCK TABLE t AS myalias READ;mysql> SELECT * FROM t;ERROR 1100: Table 't' was not locked with LOCK TABLESmysql> SELECT * FROM t AS myalias;

WRITE у блокировок обычно есть более высокий приоритет чем READ блокировки, чтобы гарантировать, что обновления обрабатываются как можно скорее. Это означает это, если один сеанс получает a READ блокировка и затем другой сеанс запрашивают a WRITE блокировка, последующая READ запросы блокировки ожидают до сеанса, который запрашивал WRITE блокировка получила блокировку и выпустила ее.

LOCK TABLES получает блокировки следующим образом:

  1. Вид все таблицы, которые будут заблокированы во внутренне определенном порядке. С пользовательской точки зрения этот порядок неопределен.

  2. Если таблица должна быть заблокирована с чтением и блокировкой записи, поместите запрос блокировки записи перед запросом блокировки чтения.

  3. Заблокируйте одну таблицу за один раз, пока сеанс не получает все блокировки.

Эта политика гарантирует, что табличная блокировка является свободной мертвой блокировкой.

Отметить

LOCK TABLES или UNLOCK TABLES, когда применено к разделенная таблица, всегда блокирует или разблокировала всю таблицу; эти операторы не поддерживают сокращение блокировки раздела. См. Раздел 17.6.4, "Деля и Блокируя".

Правила для Выпуска Блокировки

Когда блокировки таблицы, сохраненные сеансом, выпускаются, они все выпускаются одновременно. Сеанс может выпустить свои блокировки явно, или блокировки могут быть выпущены неявно при определенных условиях.

Если соединение для клиентского сеанса завершается, или обычно или неправильно, сервер неявно выпускает все блокировки таблицы, сохраненные сеансом (транзакционный и нетранзакционный). Если клиент повторно соединится, то блокировки больше не будут в действительности. Кроме того, если у клиента была активная транзакция, сервер откатывает транзакцию на разъединение, и если повторно соединяются, происходит, новый сеанс начинается с включенной автоматической фиксации. Поэтому клиенты могут хотеть отключить, % автоповторно соединяются. С % автоповторно соединяются в действительности, клиент не уведомляется, если повторно соединяются, происходит, но любые блокировки таблицы, или текущая транзакция будет потеряна. С % автоповторно соединяются отключенный, если соединение отбрасывает, ошибка происходит для следующего сделанного заявления. Клиент может обнаружить ошибку и принять соответствующие меры, такие как переполучение блокировок или восстановления транзакция. См. Раздел 21.8.16, "Управляя Автоматическим Поведением Пересоединения".

Отметить

Если Вы используете ALTER TABLE на заблокированной таблице это может стать разблокированным. Например, если Вы делаете попытку секунды ALTER TABLE работа, результатом может быть ошибка Table 'tbl_name' was not locked with LOCK TABLES. Чтобы обработать это, заблокируйте таблицу снова до второго изменения. См. также Раздел C.5.7.1, "Проблемы с ALTER TABLE".