全局锁、表级锁、行级锁
全局锁
对整个数据库实例加锁,MySQL提供加全局读锁的方法:Flush tables with read lock(FTWRL) 会使整个库处理只读状态
使用场景 :全库逻辑备份
风险:主库备份期间业务停摆
从库备份备份期间不能执行主库同步的binlog,导致主从延迟
常用命令 当mysqldump使用参数--single-transaction的时候,会启动一个事务
表级锁
表锁的语法 lock tables ... read/write unlock tables 主动释放锁而innodb这种支持行锁的引擎一般不使用表锁影响面大
MDL(metadata lock) 不需要显式使用,在访问一个表的时候会被自动加上
MDL的作用:保证读写的正确性
对表做增删改查操作的时候,加MDL读锁,对表做结构变更操作的时候,加MDL写锁
读锁之间不互斥,写锁之间是互斥的MDL 会直到事务提交才会释放,
在做表结构变更的时候,一定要小心不要导致锁住线上查询和更新
我们可以看到 session A 先启动,这时候会对表 t 加一个 MDL 读锁。
由于 session B 需要的也是 MDL 读锁,因此可以正常执行。
之后 session C 会被 blocked,是因为 session A 的 MDL 读锁还没有释放,而 session C 需要 MDL 写锁,因此只能被阻塞。
如果只有 session C 自己被阻塞还没什么关系,但是之后所有要在表 t 上新申请 MDL 读锁的请求也会被 session C 阻塞。
前面我们说了,所有对表的增删改查操作都需要先申请 MDL 读锁,就都被锁住,等于这个表现在完全不可读写了。