MySQL - 实战(5) - 全局锁和表锁
锁的分类 - 根据加锁范围
全局锁
表锁
行锁
1 全局锁
1.1 定义
对整个数据库的实例加锁
1.2 实现方式
MySQL加全局锁的方式:
Flush tables with read lock (FTWRL)
解锁方式:
unlock tables
flush tables with read lock命令行窗口退出后,则数据库会恢复为执行该命令之前的状态
1.3 作用
加全局锁以后,整个数据库将处于只读状态,其他的线程的以下语句将会被阻塞:
数据更新语句(数据的增删改)
数据定义语句(包括建表、修改表结构等)
更新类事务的提交语句
1.4 使用场景
全库逻辑备份:
把整库每个表都 select 出来存成文本
FTWRL 确保没有其他线程对数据库更新,然后对整个库做备份
1.5 整库只读的问题
主库备份,备份期间不能执更新,业务停摆
从库备份,备份期间从库不能执行主库同步过来的 binlog,导致主从延迟
1.6 不加锁的问题
1.6.1 引发的问题
不同表之间的执行顺序不同进而备份的时间不同
某个表在时间差中进行了更新并且成功被备份,其关联表已备份完毕无法更新
数据不一致
视图逻辑不一致
1.6.2 针对视图逻辑的解决方法
在可重复读隔离级别下开启事务可以得到一致性视图