Skip to main content

全局锁

David LiuAbout 2 min

全局锁

对整个数据库实例加锁,加锁以后整个实例处于只读状态,后续的 DML 写操作、DDL 语句,以及更新操作的事物提交语句都将被阻塞。

典型使用场景:全库的逻辑备份,对所有表进行锁定,从而获取一致性视图,保证数据的完整性。

语法

加全局锁语句:

flush tables with read lock;

释放锁:

unlock tables;

数据库备份

mysqldump -uroot -p1234 itcast > itcast.sql

特点

数据库中加全局锁,是一个比较重的操作,存在以下问题:

  1. 如果再主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆。
  2. 如果在从库上备份,那么在备份期间从库不能执行主库同步过来的二进制日志(binlog),会导致主从延迟。

解决方案

在 InnoDB 引擎中,可以在备份时加上参数--single-transaction 来完成不加锁的一致性备份,通过快照读实现的。

InnoDB 引擎支持的事务支持可重复读的隔离级别,那么在备份数据库之前先开启事务,会先创建 Read View,然后整个事务执行期间都在用这个 Read View,而且由于 MVCC 的支持,备份期间业务依然可以对数据进行更新操作。

因为在可重复读的隔离级别下,即使其他事务更新了表的数据,也不会影响备份数据库时的 Read View,这就是事务四大特性中的隔离性,这样备份期间备份的数据一直是在开启事务时的数据。

备份数据库的工具是 mysqldump,在使用 mysqldump 时加上 –single-transaction 参数的时候,就会在备份数据库之前先开启事务。这种方法只适用于支持「可重复读隔离级别的事务」的存储引擎。

InnoDB 存储引擎默认的事务隔离级别正是可重复读,因此可以采用这种方式来备份数据库。

但是,对于 MyISAM 这种不支持事务的引擎,在备份数据库时就要使用全局锁的方法。