文章目录
- 1.全局锁的概念
- 2.使用全局锁的语法结构
- 3.全局锁的基本使用
1.全局锁的概念
全局锁是对整个数据库实例添加一个锁,全局锁是面向整个数据库实例的,而不是单个数据库,添加锁之后这个实例就会处于只读状态,此时所有的数据库只能进行读的操作,对于更新、删除的操作将被阻塞。
全局锁的典型应用场景就是对全库进行逻辑上的备份,要求业务表之间关联的数据要保证一致性和完整性,此时就可以通过全局锁将所有的数据库锁住,避免备份过程中有数据产生,导致数据不一致。
我们一起来思考一个问题,为什么在全库逻辑的备份中,要加锁呢,备份是花时间的,对于用户不友好。
首先我们清楚一点,我们不是备份数据库,而是要在备份数据库的基础上,将业务表之间的逻辑依赖也都要进行备份,保证数据上的一致性。
首先来看一下不使用全局锁,业务表在备份中会出现的问题。
如下图所示,库中有三张业务表,备份时是一张表一张表进行备份的,先备份完tb_stock表,此时tb_order表有数据产生了,这两张表之间有业务关联,此时就会导致数据的不完整性。
当我们给数据库添加一个全局锁之后,此时数据库中的数据只能读,不能写,用户根本不可能再产生数据了,此时数据备份就能保证业务逻辑的一致性。
全局锁的缺点
- 如果数据库是主从集群,那么加了全局锁之后,程序就是摆停状态。
- 加了全局锁,在备份期间,从库不能执行主库同步过来的binlog,导致主从延迟。
全局锁数据备份,应用的很少,一般都是普通备份,mysqldump命令的–single-transaction参数可以解决不加锁的数据一致性备份。
2.使用全局锁的语法结构
为数据库实例添加一个全局锁。
flush tables with read lock
释放全局锁锁。
unlock tables
3.全局锁的基本使用
开启全局锁。
flush tables with read lock;
此时数据库只能读不能写。
mysql> select * from db_1.xscjb;
+----+--------+------+------+------+
| xh | xm | ywcj | sxcj | yycj |
+----+--------+------+------+------+
| 1 | 小明 | 45 | 75 | 93 |
| 2 | 小红 | 47 | 56 | 25 |
| 3 | 小兰 | 82 | 91 | 89 |
| 5 | 小李 | 88 | 77 | 66 |
| 6 | 小赵 | 88 | 77 | 66 |
| 7 | 小王 | 88 | 77 | 66 |
| 8 | 小黑 | 100 | 77 | 66 |
| 9 | 小江 | 88 | 77 | 66 |
+----+--------+------+------+------+
8 rows in set (0.00 sec)
mysql> update db_1.xscjb set ywcj = '100' where xh = 9 ;
ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock
释放全局锁。
mysql> unlock tables;