小编bre*_*0ck的帖子

当包装在事务中时,Mysql DDL 查询陷入等待表元数据锁状态

这是一种随机行为(重新启动 mysql 会话后不会再次发生),当我将 DDL 查询包装在事务 T1 中,同时我使用select同一个表上的查询启动另一个事务 T2 时,DDL 查询卡在等待表中预期的元数据锁定,任何其他选择查询都会等待 DDL 查询完成。但是提交 T2 后,DDL 应该获得元数据锁并完成,但它仍然等待表元数据锁状态。

连接1查询​​:

mysql> begin;                            
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE merchants ADD COLUMN temp6 varchar(255);
Run Code Online (Sandbox Code Playgroud)

连接2查询:

mysql> begin;                            
Query OK, 0 rows affected (0.00 sec)

mysql> select * from merchants where account_id=null;
Empty set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

查询的顺序是:

  1. 连接1:开始;
  2. 连接2:开始;
  3. 连接2:从account_id=null的商户中选择*;
  4. 连接 1:ALTER TABLE 商家 ADD COLUMN temp6 varchar(255);
  5. 连接2:提交;
Server version: …
Run Code Online (Sandbox Code Playgroud)

mysql sql database ddl alter-table

5
推荐指数
1
解决办法
5216
查看次数

标签 统计

alter-table ×1

database ×1

ddl ×1

mysql ×1

sql ×1