我尝试通过MySQL加载表并获得以下错误?
MySQL说:表'cms'没有锁定LOCK TABLES
为什么桌子需要锁定?我以前没见过这个?有没有办法解锁?你甚至想要吗?
Yu *_*aao 24
或者在一个会话中,您锁定了一个表但想要从另一个表中选择,您必须将其锁定或解锁所有表.
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
Run Code Online (Sandbox Code Playgroud)
Nar*_*uto 20
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和触发器"描述.
UNLOCK TABLES显式释放当前会话持有的任何表锁.在获取新锁之前,LOCK TABLES隐式释放当前会话持有的任何表锁.
对于UNLOCK TABLES的另一个用途是释放与读锁语句,它使您可以锁定所有数据库中的所有表FLUSH TABLES收购了全球读锁.请参见第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
Run Code Online (Sandbox Code Playgroud)
例如:-
LOCK TABLE t WRITE, t AS t1 READ;
Run Code Online (Sandbox Code Playgroud)
解锁表格
UNLOCK TABLES
Run Code Online (Sandbox Code Playgroud)
sas*_*alm 17
我的解决方案是解锁表格.他们被之前的查询锁定,这些查询在到达unlock tables声明之前就失败了.
UNLOCK TABLES
SELECT ...
Run Code Online (Sandbox Code Playgroud)
MySQL文档中与“表'my_table'没有被LOCK TABLES锁定”消息相关的最重要的一行之一如下:
“虽然这样得到的持有锁,会话可以访问只锁定表” https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html
这意味着,如果您在锁定LOCK的情况下尝试访问数据库中的任何其他表,则会收到错误消息“表'my_table'没有被LOCK TABLES锁定”
解决方法是将锁定应用于您希望在锁定期间访问的所有表。“锁定表table_1写,table_2写”
table_1是您真正要锁定的表,但您也想在同一过程中访问table_2。
这很令人困惑,因为我只锁定了table_1,但错误消息告诉我表'table_2'没有被LOCK TABLES锁定
花了我一段时间才弄清楚为什么table_2甚至参与其中。我希望这可以帮助其他遇到相同问题的人。
就我而言,问题在于别名。
来自文档:
如果您的语句通过别名引用表,则必须使用相同的别名锁定该表。在不指定别名的情况下锁定表是不起作用的。
相反,如果使用别名锁定表,则必须在语句中使用该别名引用它。
错误的:
LOCK TABLE my_table READ;
SELECT * FROM my_table t;
#ERROR 1100: Table 't' was not locked with LOCK TABLES
Run Code Online (Sandbox Code Playgroud)
正确的:
LOCK TABLE my_table t READ;
SELECT * FROM my_table t;
Run Code Online (Sandbox Code Playgroud)