全局锁

对整个数据库实例加锁,

当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。

flush tables with read lock

表级锁

表锁

显式

lock table 。。。 read/write

unlock tables

隐式

ALTER TABLE users ADD COLUMN age INT; -- 自动加表级X锁

元数据锁(meta data lock,MDL)

MDL是为了保证在查询表中的数据的时候,同时在做修改表结构操作时的数据一致性。

-- 会话A
BEGIN;
SELECT * FROM users; -- 获取MDL读锁

-- 会话B(被阻塞)
ALTER TABLE users ADD COLUMN email VARCHAR(255);

image.png

行锁

共享锁 S / 独占锁 X

兼容性 x s
x 不兼容 不兼容
s 不兼容 兼容

只有共享锁是兼容的