MySQL - 表' my_table'没有使用锁定表锁定

时间:2016-04-07 05:19:36

标签: mysql

我尝试通过MySQL加载表并得到以下错误?

  

MySQL说:表' cms'没有锁定LOCK TABLES

为什么桌子需要锁定?我以前没见过这个?有没有办法解锁?你甚至想要吗?

7 个答案:

答案 0 :(得分:17)

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节“锁定”中所述   表格和触发器“。

     

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

答案 1 :(得分:14)

我的解决方案是解锁桌子。他们被先前的查询锁定,这些查询在到达unlock tables语句之前失败了。

UNLOCK TABLES
SELECT ...

答案 2 :(得分:12)

如果在一个会话中锁定了一个表但又要从另一个表中选择,则必须锁定该表或解锁所有表。

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 :(得分:5)

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

答案 4 :(得分:1)

我遇到了这个问题:

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

阅读documentation后,我将锁码修改为:

LOCK TABLE <table_a> WRITE, <table_b> WRITE

这解决了我的问题。

  

lock type

     

READ读锁定,不允许写入

     

WRITE独占写锁定。没有其他连接可以读取或写入此表

答案 5 :(得分:1)

在我看来,问题是别名。

来自docs

如果您的语句通过别名引用表,则您必须使用相同的别名锁定表。如果不指定别名,则无法锁定表。

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

错误:

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;

答案 6 :(得分:0)

在我的情况下,发生此错误是因为我试图将数据从Windows导入到Linux:Windows不区分大小写,并且具有所有小写的表名,但是Linux区分大小写,并且具有相同的表名,但大写字母。一旦更改了源表名称的大小写以使其与目标表名称匹配,此错误就不再发生。以下SO帖子解释了Windows和Linux之间关于mysql的区分大小写问题:Are table names in MySQL case sensitive?