首页 > 解决方案 > 当我执行“锁定表 [table_name] 写入”时发生了“元数据锁”

问题描述

我做了如下

-- connection 1
START TRANSACTION;
LOCK TABLES [table_name] WRITE;

-- connection 2
START TRANSACTION;
SELECT * FROM [table_name]; -- waiting for table metadata lock

我不明白上面的情况。
我认为 WRITE LOCK 不会阻止 SELECT 查询。

当我喜欢下面的时候,

-- connection 1
START TRANSACTION;
UPDATE [table_name] SET [column = value] WHERE id = 1;

-- connection 2
START TRANSACTION;
SELECT * FROM [table_name] WHERE id = 1; -- doesn't wait

SELECT 不会像你看到的那样等待。
而且我认为 WRITE LOCK 也可以像 UPDATE 子句一样工作。
不过好像没有。。

现在我知道有什么不对了吗?

标签: mysqltransactionslockingmariadb

解决方案


写锁不像行级锁那样工作。

https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html说:

WRITE锁:

  • 只有持有锁的会话才能访问该表。在释放锁之前,没有其他会话可以访问它。

在这种情况下,“访问”意味着读取或写入。


推荐阅读