# 全局锁
# 语法
# 加全局锁
Flush tables with read lock;
# 释放全局锁
unlock tables;
# 使用场景
- 做逻辑备库
使用全局锁备份时, 整个库处于只读状态, 是比较危险的.(使用mysqldump官方工具做备份, 可以实现不影响正常业务的读写, 依靠MVCC获取一致性视图实现.)
需要注意两个问题:
选择主库备份, 整个业务会处于停摆状态
选择从库备份, 会导致主从延迟.
# 表级锁
表级锁分两种, 一种是表锁, 一种是元数据锁(meta data lock - MDL)
# 表锁
# 语法
# 加表锁
lock tables ... read;
lock tables ... write;
# 释放锁, 客户端断开时会自动释放锁.
unlock tables;
# 使用注意事项
使用lock tables要注意, 此语法除了会限制其他线程读写, 也会限制当前线程读写.
如果线程A执行了lock tables t1 read, t2 write, 其他线程对t1写, t2读写都会发生阻塞, 而线程A只能读t1和读写t2, 连其他表都不能访问.
# MDL
DML(meta data lock)不需要显示使用, 在访问表的时候会自动加上, 用于保证读写的正确性.
对表进行任何操作都会加MDL读锁
修改表结构时会加MDL写锁
# 读写锁规则
- 多个读锁可以同时使用
- 读/写锁, 写锁之间会互斥