我试图通过MySQL加载表格,但是出现以下错误:
MySQL 说:表 'cms' 没有使用 LOCK TABLES 锁定
为什么需要锁定表格?我以前从未见过这种情况。是否有任何方法可以解锁?你是否真的需要解锁?
我试图通过MySQL加载表格,但是出现以下错误:
MySQL 说:表 'cms' 没有使用 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
对我来说最好的解决方案是解锁这些表格。它们被前一个查询锁定,但在达到unlock tables
语句之前失败了。
UNLOCK TABLES
SELECT ...
http://dev.mysql.com/doc/refman/5.7/en/lock-tables.html
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
MySQL文档中与"Table 'my_table' was not locked with LOCK TABLES"消息相关的最重要的一行是:
"在持有这些锁的同时,会话只能访问已锁定的表格而不能访问其它表格" https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
这意味着如果您在LOCK处于激活状态时尝试访问数据库中的任何其他表格,您将收到错误消息"Table 'my_table' was not locked with LOCK TABLES"
解决方法是将锁应用于在LOCK期间想要访问的所有表格,如下所示。"LOCK TABLES table_1 WRITE, table_2 WRITE"
其中table_1是您真正想要锁定的表格,但您还想在同一过程中访问table_2。
这很令人困惑,因为我只锁定了table_1,但错误消息却告诉我Table 'table_2' was not locked with LOCK TABLES
花费了我一段时间才弄清楚table_2为什么会涉及到。希望这可以帮助遇到同样问题的其他人。
错误的写法:如果您的语句通过别名引用表格,则必须使用相同的别名锁定该表格。没有指定别名无法锁定表格。
反之,如果您使用别名锁定表格,则必须在语句中使用该别名引用它。
LOCK TABLE my_table READ;
SELECT * FROM my_table t;
#ERROR 1100: Table 't' was not locked with LOCK TABLES
正确:
LOCK TABLE my_table t READ;
SELECT * FROM my_table t;
LOCK TABLE
语句时,将解除之前已经锁定的表(如果有)。 - fool4jesus我在存储过程中遇到了一个似乎是分叉的进程。这导致了以下错误:
#ERROR 1100: Table 'cached_sales_data' was not locked with LOCK TABLES
关于以下SQL语句:
LOCK TABLES cached_sales_data WRITE, v_sales_data_2 READ;
call refresh_sales_data_now ();
UNLOCK TABLES;
实际上,这是由于refresh_sales_data_now()存储过程中的where子查询引起的。
...
where
orderdatetime > (select max(orderdatetime)
from
cached_sales_data)
...
where
orderdatetime > (select max(orderdatetime)
from
csd)