0

0

一起聊聊MySQL全局锁

WBOY

WBOY

发布时间:2022-06-17 13:53:43

|

2128人浏览过

|

来源于CSDN

转载

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于全局锁的相关问题,全局锁就是对整个数据库加锁。当我们对数据库加了读锁之后,其他任何的请求都不能对数据库加写锁了,下面一起来看一下,希望对大家有帮助。

一起聊聊MySQL全局锁

推荐学习:mysql视频教程

数据库设计的初衷是处理并发问题的,作为多用户共享的资源,当出现并发访问时,数据库需要合理地控制资源的访问规则。而锁就是用来实现这个访问规则的重要数据结构。

我们先来贴一个锁的大概分类的图

 根据加锁的范围,MySQL 里面的锁大致可以分为全局锁、表锁、行锁。我们主要先来学习这几种锁,这篇我们学习全局锁。

全局锁

全局锁就是对整个数据库加锁。当我们对数据库加了读锁之后,其他任何的请求都不能对数据库加写锁了,当我们对数据库加了写锁之后,后续其他任何的请求都不能对数据库加读锁和写锁了。

FTWRL

MySQL 提供了一个加全局读锁的方法,Flush tables with read lock (FTWRL)。当我们需要让整个库处于只读状态时,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。

全局锁的使用场景

全局锁的使用场景:做全库的逻辑备份。逻辑备份也就是把整个库的每个表都 select 出来存成文本。也就是全局锁只有在进行主从备份数据或者导入导出数据的时候才会使用到。

那么为什么需要全局锁呢?

因为我们在做数据备份或者导入导出数据的时候,如果在这个期间还可以同时进行数据的增删改,那么就会出现数据不一致的问题。

以前有一种做法是通过上面提到的 FTWRL 确保在备份的时候不会有其他线程对数据库做更新,注意:这里备份过程中整个库都是完全处于只读状态。

因为全局锁是面向这个数据库的,所以加全局锁听起来很危险:

  • 如果我们在主库上备份,在备份期间都不能执行更新,也就是基本上全部业务暂停。
  • 如果我们在从库上备份,在备份期间主库同步过来的 binlog 从库都不能执行,也就是会导致主从延迟,数据不一致。

如何避免加锁

既然加全局锁影响这么大,我们能不能避免加锁呢?

MDWechat微信主题模块
MDWechat微信主题模块

MDWechat是一款xposed插件,能够使使微信Material Design化。功能实现的功能有:1.主界面 TabLayout Material 化,支持自定义图标2.主界面 4 个页面背景修改3.全局 ActionBar 和 状态栏 颜色修改,支持主界面和聊天页面的沉浸主题(4.0新增)4.自动识别微信深色模式以调整MDwechat配色方案(3.6新增)5.主界面添加悬浮按钮(Float

下载

通过上面的介绍,我们知道加锁是为了解决数据不一致问题。那么是不是只要我们能解决数据不一致的问题,就可以不用加全局锁了。有这样一个思路:如果我们在开始进行数据备份的时候,记录一个操作日志,备份过程中不加锁允许对数据库的增删改查,而在备份过程中,增删改查的操作记录都记到一个日志文件里,等我们备份完成后,再把这段时间日志文件里的操作都执行一遍。这样就能保证备份前后数据的一致性了。

总结,不加锁的话,备份得到数据和主数据不是一个逻辑时间点,这个视图是逻辑不一致的。如果保证逻辑时间点一致即逻辑视图一致就能保证数据一致,由此我们就想到了我们之前学过的事务隔离级别,可重复复读的隔离级别下开启一个事务就是一个一致性视图。

在 MySQL 的默认引擎 InnoDB 里有一个机制可以保证数据一致性。InnoDB 引擎中有数据快照版本的功能,这个功能叫 MVCC,因为 MVCC 保留了历史版本的快照,每个快照都对应一个事务版本号,而在我们备份数据的时候会申请一个事务版本号,在读取数据的时候,只需要读取比自己事务版本号小的数据即可。

–single-transaction 命令加锁

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

--single-transaction 参数的作用,设置事务的隔离级别为可重复读,即 REPEATABLE READ,这样能保证在一个事务中所有相同的查询读取到同样的数据,也就大概保证了在 dump 期间,如果其他 InnoDB 引擎的线程修改了表的数据并提交,对该 dump 线程的数据并无影响。

并且设置 WITH CONSISTENT SNAPSHOT 为快照级别。设想一下,如果只是可重复读,那么在事务开始时还没 dump 数据时,这时其他线程修改并提交了数据,那么这时第一次查询得到的结果是其他线程提交后的结果,而 WITH CONSISTENT SNAPSHOT 能够保证在事务开启的时候,第一次查询的结果就是事务开始时的数据 A,即使这时其他线程将其数据修改为 B,查的结果依然是 A。

single-transaction方法只适用于所有的表使用事务引擎的库。在 mysqldump 过程中,加了--single-transaction 就能保证 InnoDB 的数据是完全一致的,对于MyISAM这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时候就还是需要全局锁的,所以我们就还是需要使用 FTWRL 命令的。

只读设置

我们可能还会有这样一个疑问,既然要全库只读,我们为什么不适用 set global readonly = true 的方式呢?

确实 readonly 方式也可以让全库进入只读状态,但还是会建议用 FTWRL 方式,主要有两个原因:

  • 在有些系统,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库。因此,修改global变量的方式影响面更大。
  • 在异常处理机制上有差异。如果执行 FTWRL 命令之后由于客户端发生异常断开,那么 MySQL 会自动释放这个全局锁,整个库回到可以正常更新的状态。

而将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 readonly 状态,这样会导致整个库长时间处于不可写状态,风险较高。

推荐学习:mysql视频教程

相关专题

更多
Java编译相关教程合集
Java编译相关教程合集

本专题整合了Java编译相关教程,阅读专题下面的文章了解更多详细内容。

11

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

4

2026.01.21

无人机驾驶证报考 uom民用无人机综合管理平台官网
无人机驾驶证报考 uom民用无人机综合管理平台官网

无人机驾驶证(CAAC执照)报考需年满16周岁,初中以上学历,身体健康(矫正视力1.0以上,无严重疾病),且无犯罪记录。个人需通过民航局授权的训练机构报名,经理论(法规、原理)、模拟飞行、实操(GPS/姿态模式)及地面站训练后考试合格,通常15-25天拿证。

16

2026.01.21

Python多线程合集
Python多线程合集

本专题整合了Python多线程相关教程,阅读专题下面的文章了解更多详细内容。

1

2026.01.21

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

4

2026.01.21

windows激活码分享 windows一键激活教程指南
windows激活码分享 windows一键激活教程指南

Windows 10/11一键激活可以通过PowerShell脚本或KMS工具实现永久或长期激活。最推荐的简便方法是打开PowerShell(管理员),运行 irm https://get.activated.win | iex 脚本,按提示选择数字激活(选项1)。其他方法包括使用HEU KMS Activator工具进行智能激活。

2

2026.01.21

excel表格操作技巧大全 表格制作excel教程
excel表格操作技巧大全 表格制作excel教程

Excel表格操作的核心技巧在于 熟练使用快捷键、数据处理函数及视图工具,如Ctrl+C/V(复制粘贴)、Alt+=(自动求和)、条件格式、数据验证及数据透视表。掌握这些可大幅提升数据分析与办公效率,实现快速录入、查找、筛选和汇总。

6

2026.01.21

毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm
毒蘑菇显卡测试网站入口 毒蘑菇测试官网volumeshader_bm

毒蘑菇VOLUMESHADER_BM测试网站网址为https://toolwa.com/vsbm/,该平台基于WebGL技术通过渲染高复杂度三维分形图形评估设备图形处理能力,用户可通过拖动彩色物体观察画面流畅度判断GPU与CPU协同性能;测试兼容多种设备,但中低端手机易卡顿或崩溃,高端机型可能因发热降频影响表现,桌面端需启用独立显卡并使用支持WebGL的主流浏览器以确保准确结果

25

2026.01.21

github中文官网入口 github中文版官网网页进入
github中文官网入口 github中文版官网网页进入

github中文官网入口https://docs.github.com/zh/get-started,GitHub 是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。 通过将代码存储在GitHub 上的“存储库”中,你可以: “展示或共享”你的工作。 持续“跟踪和管理”对代码的更改。

7

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 805人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号