背景:业务高峰期,在线操作ddl,比如订单表增加字段
担心:锁表,造成业务阻塞
期望:寻求一种解决方案,ddl不影响dml
调研:搜索 :mysql 增加字段如何不锁表
https://www.zhihu.com/question/26457943-》https://c4ys.com/archives/1943-》https://dev.mysql.com/doc/refman/5.7/en/innodb-online-ddl-operations.html
搜索:MDLS 是什么-》https://segmentfault.com/a/1190000021212804
搜索:mysql ddl 不锁表 算法含义 -》http://georgema.xyz/2020/11/18/online-ddl/
MDL 锁是在 Server 层加的之外,其它三种都是在 InnoDB 层加的。具体的加锁逻辑不在此进行展开,但是需要明确一点:所有的操作(不管是 DDL 还是 DML 还是查询语句)都需要先拿 Server 层的 MDL 锁,然后再去拿 InnoDB 层的某个需要的锁。一个 DDL 的基本过程是这样的:
- 首选,在开始进行 DDL 时,需要拿到对应表的 MDL X 锁,然后进行一系列的准备工作;(需要等待慢查询和写事务)
- 然后将 MDL X 锁降级为 MDL S 锁,进行真正的 DDL 操作;(阻塞写事务作)
- 最后再次将 MDL S 锁升级为 MDL X 锁,完成 DDL 操作,释放 MDL 锁;(阻塞所有事务)
所以在真正执行 DDL 操作期间,确实是不会“锁表”的,但是如果在第一阶段拿 MDL X 锁时无法正常获取,那就可能真的会“锁表了”。