MySQL - 表'my_table'未锁定锁表

Kie*_*ley 31 mysql

我尝试通过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)

  • 这是对问题的解释,应该是可接受的答案! (5认同)
  • 很好的答案。谢谢。我试图从 db1 锁定表并从 db2 插入数据。在查询 INSERT INTO db1.table SELECT * FROM db2.table 后,我收到了关于 NOT LOCKED db2.table 的错误。我真的不明白为什么我会得到那个错误。您解释了在一个会话中锁定多个表 - 谢谢! (2认同)

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)


Cos*_*h66 8

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甚至参与其中。我希望这可以帮助其他遇到相同问题的人。


Sta*_*nko 8

就我而言,问题在于别名。

来自文档

如果您的语句通过别名引用表,则必须使用相同的别名锁定该表。在不指定别名的情况下锁定表是不起作用的。

相反,如果使用别名锁定表,则必须在语句中使用该别名引用它。

错误的:

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)