用实例带你了解 MySQL 全局锁

数据库 MySQL
当数据库处于全局锁的状态时,其他线程的一下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(建表、索引变更、修改表结构等)和更新类事务的提交语句。

 [[404004]]

本文转载自微信公众号「架构精进之路」,作者架构精进之路。转载本文请联系架构精进之路公众号。

MySQL全局锁会申请一个全局的读锁,对整个库加锁。

全局锁的一般使用场景是:全局逻辑备份。

全局锁的实现方式有两种:

  1. //第一种方法 
  2. Flush tables with read lock(FTWRL) 
  3. //第二种方法 
  4. set global readonly=true 

当数据库处于全局锁的状态时,其他线程的一下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(建表、索引变更、修改表结构等)和更新类事务的提交语句。

释放全局锁

  1. unlock tables; 

来个示例吧~

创建数据库 `test`

  1. CREATE TABLE `test` ( 
  2.   `namevarchar(32) NOT NULL DEFAULT ''
  3.   `bid` int(10) unsigned NOT NULL DEFAULT '0' 
  4. ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试'

插入数据

  1. insert into test values('A', 1), ('B',2),('C',3); 

查看表数据

  1. select * from test; 
  2. +------+-----+ 
  3. name | bid | 
  4. +------+-----+ 
  5. | A    |   1 | 
  6. | B    |   2 | 
  7. | C    |   3 | 
  8. +------+-----+ 

加锁

  1. flush tables with read lock; 

新增数据

  1. insert into test values('D', 4); 

执行 insert 操作后,直接返回错误结果:

  1. ERROR 1223 (HY000): Can't execute the query because you have a conflicting read lock 

执行查询操作,可以正常返回结果:

  1. select * from test; 
  2.  
  3. #返回结果: 
  4. +------+-----+ 
  5. name | bid | 
  6. +------+-----+ 
  7. | A | 1 | 
  8. | B | 2 | 
  9. | C | 3 | 
  10. +------+-----+ 

可以看到,当我们加上全局锁的时候,数据及表更新操作都没办法执行,但表查询不受影响。这样会给我们的业务造成很大的影响(无法修改数据),索性 Innodb 引擎的可重复读隔离级别可以让我们不阻塞数据变更的同时导出数据。

官方自带的逻辑备份工具是 mysqldump。当 mysqldump 使用参数–single-transaction 的时候,导数据之前就会启动一个事务,来确保拿到一致性视图。而由于 MVCC 的支持,这个过程中数据是可以正常更新的。

你一定在疑惑,有了这个功能,为什么还需要 FTWRL 呢?

一致性读是好,但前提是引擎要支持这个隔离级别。

比如,对于 MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。

single-transaction 方法只适用于所有的表使用事务引擎的库。

如果有的表使用了不支持事务的引擎,那么备份就只能通过 FTWRL 方法。这往往是 DBA 要求业务开发人员使用 InnoDB 替代 MyISAM 的原因之一。

用 FTWRL 而不用 set global readonly = true

  • 在有些系统中,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库。因此,修改 global 变量的方式影响面更大,我不建议你使用。
  • 在异常处理机制上有差异。如果执行 FTWRL 命令之后由于客户端发生异常断开,那么 MySQL 会自动释放这个全局锁,整个库回到可以正常更新的状态。而将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险较高。

 

责任编辑:武晓燕 来源: 架构精进之路
相关推荐

2020-02-06 10:02:45

MySQL数据库全局锁

2018-03-20 12:48:58

数据库MySQL变量配置

2018-09-04 16:20:46

MySQ索引数据结构

2022-10-24 00:33:59

MySQL全局锁行级锁

2021-05-25 05:25:24

MySQL数据库

2022-10-24 08:02:14

MySQL索引类型

2018-09-17 16:30:24

数据库MySQL小技巧

2022-07-20 08:06:57

MySQL表锁Innodb

2020-08-31 10:48:11

MySQL数据库数据库技巧

2021-11-26 08:07:16

MySQL SQL 语句数据库

2022-09-26 11:30:40

MQTT协议客户端协议

2019-09-27 09:40:06

ElvishShellLinux

2010-07-05 16:20:32

NetBEUI协议

2021-02-03 16:22:43

新基建SAP

2020-12-31 12:16:49

SAP云计算SAP产品

2018-10-23 10:15:03

MySQL数据库技巧

2018-10-24 15:55:19

MySQL数据库技巧

2017-11-15 08:50:59

数据库MySQL

2021-05-31 14:22:56

物联网物联网安全

2010-09-02 16:59:35

资源预留协议
点赞
收藏

51CTO技术栈公众号