全局锁顾名思义,全局锁就是对整个数据库实例加锁

如何手动使用全局锁?

MySQL 提供了一个加全局读锁的方法,命令是 Flush tables with read lock (FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:

数据更新语句(数据的增删改)、
数据定义语句(包括建表、修改表结构等)
更新类事务的提交语句。

全局锁的用途?

全局锁的典型使用场景是,做全库逻辑备份。也就是把整库每个表都 select 出来存成文本。

FTWRL加锁的缺点?

以前有一种做法,是通过 FTWRL 确保不会有其他线程对数据库做更新,然后对整个库做备份。注意,在备份过程中整个库完全处于只读状态

但是让整库都只读,听上去就很危险:

如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆;
如果你在从库上备份,那么备份期间从库不能执行主库同步过来的 binlog,会导致主从延迟。

看来加全局锁不太好。但是细想一下,

备份为什么要加锁呢?

我们来看一下不加锁会有什么问题。

假设你现在要维护“极客时间”的购买系统,关注的是用户账户余额表用户课程表。现在发起一个逻辑备份。假设备份期间,有一个用户,他购买了一门课程,业务逻辑里就要扣掉他的余额,然后往已购课程里面加上一门课。如果时间顺序上是先备份账户余额表 (u_account),然后用户购买,然后备份用户课程表 (u_course),会怎么样呢?你可以看一下这个图:

可以看到,这个备份结果里,用户 A 的数据状态是“账户余额没扣,但是用户课程表里面已经多了一门课”。如果后面用这个备份来恢复数据的话,用户 A 就发现,自己赚了。

作为用户可别觉得这样可真好啊,你可以试想一下:如果备份表的顺序反过来,先备份用户课程表再备份账户余额表,又可能会出现什么结果?也就是说,不加锁的话,备份系统备份的得到的库不是一个逻辑时间点,这个视图是逻辑不一致的

说到视图你肯定想起来了,我们在前面讲事务隔离的时候,其实是有一个方法能够拿到一致性视图的,对吧?是的,就是在可重复读隔离级别下开启一个事务。

备注:如果你对事务隔离级别的概念不是很清晰的话,可以再回顾一下第 3 篇文章《事务隔离:为什么你改了我还看不见?》中的相关内容。

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

你一定在疑惑,有了这个功能,为什么还需要 FTWRL 呢?一致性读是好,但前提是引擎要支持这个隔离级别。比如,对于 MyISAM 这种不支持事务的引擎,如果备份过程中有更新,总是只能取到最新的数据,那么就破坏了备份的一致性。这时,我们就需要使用 FTWRL 命令了。

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

为什么不用set global readonly=true设置全库只读?

你也许会问,既然要全库只读,为什么不使用 set global readonly=true 的方式呢?确实 readonly 方式也可以让全库进入只读状态,但我还是会建议你用 FTWRL 方式,主要有两个原因:

一是,在有些系统中,readonly 的值会被用来做其他逻辑,比如用来判断一个库是主库还是备库。因此,修改 global 变量的方式影响面更大,我不建议你使用。

二是,在异常处理机制上有差异。如果执行 FTWRL 命令之后由于客户端发生异常断开,那么 MySQL 会自动释放这个全局锁,整个库回到可以正常更新的状态。而将整个库设置为 readonly 之后,如果客户端发生异常,则数据库就会一直保持 read,这样会导致整个库长时间处于不可写状态,风险较高。

总结

  • 全局锁不能改表结构,加字段之类
  • 备份时需要上全句锁
  • 备份可以用官方工具mysqldump

Mysql 全局锁入门相关推荐

  1. MySQL - 全局锁、表级锁、行级锁、元数据锁、自增锁、意向锁、共享锁、独占锁、记录锁、间隙锁、临键锁、死锁

    # 前言 本篇只介绍 MySQL 锁的基本知识. 我的 MySQL 版本是 MySQL 5.7.34, 建议使用 MySQL 5.6 及之后的版本. ## 先上一个图 ## 为什么要使用锁? 个人理解 ...

  2. mysql 全局锁_Mysql全局锁和表级锁

    以前对Mysql的锁的认识,只了解表锁和行锁,其实Mysql的锁的种类还是不少的,有全局锁,表级锁,行级锁,还有元数据锁,间隙锁,临界锁. 一 全局锁 Mysql的全局锁是对整个实例加锁,加锁之后,数 ...

  3. MySQL全局锁、表级锁、行级锁介绍演示(详细)

    目录 介绍 分类 1.全局锁 1.1介绍 1.2场景 1.3语法 1.4演示 2.表级锁 2.1介绍 2.2分类 2.3语法 2.4演示 3.行级锁 3.1介绍 3.2分类 3.3场景 介绍 锁是计算 ...

  4. MySQL全局锁、表锁、行锁、间隙锁

    1.全局锁 学习丁奇(林晓斌)老师MySQL实战45讲课程后提炼的笔记!!! 根据加锁的范围,MySQL里面的锁大致可以分成全局锁.表级锁和行锁三类. 全局锁就是对整个数据库实例加锁.Flush ta ...

  5. MySQL 全局锁和表锁

    日常读书笔记 全局锁 含义和命令行 典型使用场景 注意点 问题:备份一定要加锁吗? 问题:既然备份不一定要加锁,那全局锁存在的意义是什么? 表级锁 表锁 命令行 所释放时机 锁时的具体细节 元数据锁 ...

  6. mysql 全局权限入门

    为了便于说明,我先创建一个用户: create user 'ua'@'%' identified by 'pa'; 这条语句的逻辑是创建一个用户'ua'@'%',密码是 pa. 注意,在 MySQL ...

  7. Mysql 行锁入门

    MySQL 的行锁是在引擎层由各个引擎自己实现的.但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁.不支持行锁意味着并发控制只能使用表锁,对于这种引擎的表,同一张表上任何时刻只能有一 ...

  8. mysql 写锁需要等待读锁释放吗_Mysql实战45讲笔记:5、全局锁和表锁

    全局锁: 对整个数据库实例加锁. MySQL提供加全局读锁的方法:Flush tables with read lock(FTWRL) 这个命令可以使整个库处于只读状态.使用该命令之后,数据更新语句. ...

  9. mysql怎么加全局锁_MySQL锁机制/管理(并发锁,行锁,表锁,预加锁,全局锁等等)

    MySQL实验室 1.?MySQL 中并发和隔离控制机制 Meta-data元数据锁:在table cache缓存里实现的,为DDL(Data Definition Language)提供隔离操作.一 ...

最新文章

  1. 目标检测算法基础概念:边框回归和NMS
  2. 百练OJ:2764:数根
  3. machit r语言_机器学习应该准备哪些数学预备知识?
  4. 第四范式重磅发布企业级AI操作系统Sage AIOS
  5. 带有Prometheus的弹簧靴和千分尺第5部分:旋转Prometheus
  6. Excel中PMT计算月供函数的java实现
  7. WCF创建WebService正确操作步骤详解
  8. 基于S函数的BP神经网络PID控制器及simulink仿真
  9. 计算机安全性分析建模,计算机网络安全性分析建模研究
  10. 程序员如何切入区块链去中心化应用开发 1
  11. Introduction to Computer Networking学习笔记(九):error detection 错误探查 Checksum、CRC、MAC
  12. unix系列系统镜像下载
  13. 【数据结构与算法】车辆路径问题(Vehicle Routing Problem,VRP)
  14. python 改变图片像素值
  15. 合宙Luat | 嘿~合宙刚办了一场「大型网友见面会」
  16. CINTA:陪集与拉格朗日定理
  17. 《windows 程序设计》读书笔记 三
  18. 跟我学AngularJs:Directive指令用法解读(上)
  19. Docker Jar项目启动慢
  20. 7-6 最热门的职业

热门文章

  1. 磁盘阵列(RAID)-很详细的介绍
  2. linux on android 项目,好累,终于完成了 Android-on-Yeeloong 项目的搭建
  3. matlab如何判断两个矩阵的元素是否相同_蚁群算法及其MATLAB实现
  4. linux mysql cpu 查看工具_Linux监控工具-Nmon命令行:Linux系统性能的监测利器
  5. java 计时器_【java内存】内存结构
  6. 去除程序名称 去除程序属性详细信息中的程序名称 创建时间等信息
  7. Failed to find Build Tools revision 28.0.3
  8. Android Studio实现简单的QQ应用
  9. 项目后台运行关闭_iOS到底有没有必要上滑强制关闭APP?
  10. echarts y轴只显示5个刻度_ECharts 解决双Y轴刻度不一致问题