MySQL - таблица "my_table" не была заблокирована с помощью столов Lock

Я пытаюсь загрузить таблицы через MySQL и получить следующую ошибку:

MySQL сказал: Таблица "cms" не была заблокирована с помощью LOCK TABLES

Почему таблица должна быть заблокирована? Я этого раньше не видел? есть ли способ разблокировать? вы даже хотите?

Ответ 1

http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html

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

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

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

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

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

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

Синтаксис для LOCK и UNLOCK

 LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [, tbl_name [[AS] alias] lock_type] ...

lock_type:
    READ [LOCAL]
  | [LOW_PRIORITY] WRITE

Например: -

LOCK TABLE t WRITE, t AS t1 READ;

Разблокировать таблицы

 UNLOCK TABLES

Ответ 2

Если в одном сеансе вы заблокировали одну таблицу, но хотите выбрать другую, вы должны либо заблокировать эту таблицу, либо разблокировать все таблицы.

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

Ответ 3

Решение для меня заключалось в том, чтобы разблокировать таблицы. Они были заблокированы предыдущими запросами, которые не были выполнены до достижения инструкции unlock tables.

UNLOCK TABLES
SELECT ...

Ответ 4

Одна из наиболее важных строк в документации MySQL, относящаяся к сообщению "Таблица my_table" не была заблокирована сообщением LOCK TABLES ", выглядит следующим образом:

"Пока получаемые блокировки удерживаются, сеанс может получить доступ только к заблокированным таблицам" https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html

Это означает, что если вы пытаетесь получить доступ к любой другой таблице в базе данных, пока LOCK установлен, вы получите сообщение об ошибке "Таблица" my_table "не была заблокирована с помощью LOCK TABLES"

Исправление состоит в том, чтобы применить блокировку ко всем таблицам, к которым вы хотите иметь доступ во время блокировки, как это. "LOCK TABLES table_1 WRITE, table_2 WRITE"

Где table_1 - это тот, который вы действительно хотите заблокировать, но вы также хотите получить доступ к table_2 во время того же процесса.

Это сбивало с толку, потому что я блокировал только table_1, но в сообщении об ошибке говорилось, что таблица 'table_2' не заблокирована с помощью LOCK TABLES

Мне потребовалось некоторое время, чтобы понять, почему table_2 был даже вовлечен. Я надеюсь, что это поможет кому-то еще с той же проблемой.

Ответ 5

Я столкнулся с этой проблемой:

LOCK TABLE <table_a> READ;
LOCK TABLE <table_b> READ;
LOCK TABLE <table_a> WRITE;
LOCK TABLE <table_b> WRITE;

после чего я читаю, это вызывает Table 'table_a' was not locked with Lock Tables.

После чтения документации, я исправлю код блокировки:

LOCK TABLE <table_a> WRITE, <table_b> WRITE

Это решит проблему для меня.

тип блокировки

READ Read lock, не разрешено запись

WRITE Эксклюзивная блокировка записи. Никакие другие соединения не могут читать или записывать в эту таблицу

Ответ 6

В моем случае эта ошибка произошла из-за того, что я пытался импортировать данные из Windows в Linux: Windows нечувствительна к регистру и имела все имена таблиц в нижнем регистре, но Linux чувствительна к регистру и имела те же имена таблиц, но с заглавными буквами. Как только я изменил регистр имен исходных таблиц, чтобы они соответствовали именам таблиц назначения, эта ошибка больше не возникала. Следующий пост SO объясняет проблему чувствительности к регистру между Windows и Linux в отношении mysql: Чувствительны ли имена таблиц в MySQL к регистру?