对整个数据库实例加锁,
当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。
flush tables with read lock
显式
lock table 。。。 read/write
unlock tables
隐式
ALTER TABLE users ADD COLUMN age INT; -- 自动加表级X锁
MDL是为了保证在查询表中的数据的时候,同时在做修改表结构操作时的数据一致性。
-- 会话A
BEGIN;
SELECT * FROM users; -- 获取MDL读锁
-- 会话B(被阻塞)
ALTER TABLE users ADD COLUMN email VARCHAR(255);

| 兼容性 | x | s |
|---|---|---|
| x | 不兼容 | 不兼容 |
| s | 不兼容 | 兼容 |
只有共享锁是兼容的