mysql - 当我执行“锁定表 [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 子句一样工作。
不过好像没有。。
现在我知道有什么不对了吗?
解决方案
写锁不像行级锁那样工作。
https://dev.mysql.com/doc/refman/8.0/en/lock-tables.html说:
WRITE
锁:
- 只有持有锁的会话才能访问该表。在释放锁之前,没有其他会话可以访问它。
在这种情况下,“访问”意味着读取或写入。
推荐阅读
- python - 根据字符串列表过滤 pyspark 数据帧
- python - 关于while循环和变量索引的问题
- graphql - 如何在 GatsbyJS 的 React 组件中使用来自 GraphQL 的数据
- sql - 使用 * 和列名的不同查询结果
- java - 我想将 JSONObject 放入 JSONArray 内 for 循环
- javascript - nodejs中的并行流大行分隔的json文件
- google-chrome-extension - Chrome 扩展 - 在全局变量和本机消息传递端口方面迁移到 V3
- python - 如何在不使用数组的情况下以替代方式合并单个序列中的两个序列?
- android - ConstraintLayout 是否仍然优于 Jetpack Compose 中的嵌套列和行?
- python - Pygame退出全屏模式将窗口设置在屏幕外