没有合适的资源?快使用搜索试试~ 我知道了~
MySQL加锁处理分析@何登成1
需积分: 0 2 下载量 66 浏览量
2022-08-08
22:49:16
上传
评论
收藏 956KB DOCX 举报
温馨提示
试读
17页
MySQL加锁处理分析@何登成1
资源详情
资源评论
资源推荐
1 背景 1
1.1 MVCC:Snapshot Read vs Current Read 2
1.2 Cluster Index:聚簇索引 3
1.3 2PL:Two-Phase Locking 3
1.4 Isolation Level 4
2 一条简单 SQL 的加锁实现分析 5
2.1 组合一:id 主键+RC 6
2.2 组合二:id 唯一索引+RC 6
2.3 组合三:id 非唯一索引+RC 7
2.4 组合四:id 无索引+RC 8
2.5 组合五:id 主键+RR 9
2.6 组合六:id 唯一索引+RR 9
2.7 组合七:id 非唯一索引+RR 9
2.8 组合八:id 无索引+RR 11
2.9 组合九:Serializable 12
3 一条复杂的 SQL 12
4 死锁原理与分析 14
5 总结 16
1. 背景
MySQL/InnoDB 的加锁分析,一直是一个比较困难的话题。我在工作过程中,经常会有同事
咨询这方面的问题。同时,微博上也经常会收到 MySQL 锁相关的私信,让我帮助解决一些
死锁的问题。本文,准备就 MySQL/InnoDB 的加锁问题,展开较为深入的分析与讨论,主要
是介绍一种思路,运用此思路,拿到任何一条 SQL 语句,都能完整的分析出这条语句会加
什么锁?会有什么样的使用风险?甚至是分析线上的一个死锁场景,了解死锁产生的原因。
注:MySQL 是一个支持插件式存储引擎的数据库系统。本文下面的所有介绍,都是基于
InnoDB 存储引擎,其他引擎的表现,会有较大的区别。
1. MVCC:Snapshot Read vs Current Read
MySQL InnoDB 存储引擎,实现的是基于多版本的并发控制协议——MVCC (Multi-Version
Concurrency Control) (注:与 MVCC 相对的,是基于锁的并发控制,Lock-Based Concurrency
Control)。MVCC 最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多写少的 OLTP
应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能,这也是为什么现阶段,
几乎所有的 RDBMS,都支持了 MVCC。
在 MVCC 并发控制中,读操作可以分成两类:快照读 (snapshot read)与当前读 (current
read)。快照读,读取的是记录的可见版本 (有可能是历史版本),不用加锁。当前读,读取
的是记录的最新版本,并且,当前读返回的记录,都会加上锁,保证其他事务不会再并发修
改这条记录。
在一个支持 MVCC 并发控制的系统中,哪些读操作是快照读?哪些操作又是当前读呢?以
MySQL InnoDB 为例:
� 快照读:简单的 select 操作,属于快照读,不加锁。(当然,也有例外,下面会分析)
o select * from table where ?;
� 当前读:特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。
o select * from table where ? lock in share mode;
o select * from table where ? for update;
o insert into table values (…);
o update table set ? where ?;
o delete from table where ?;
所有以上的语句,都属于当前读,读取记录的最新版本。并且,读取之后,还需要保证其他
并发事务不能修改当前记录,对读取记录加锁。其中,除了第一条语句,对读取记录加 S 锁
(共享锁)外,其他的操作,都加的是 X 锁 (排它锁)。
为什么将 插入/更新/删除 操作,都归为当前读?可以看看下面这个 更新 操作,在数据库
中的执行流程:
从图中,可以看到,一个 Update 操作的具体流程。当 Update SQL 被发给 MySQL 后,MySQL
Server 会根据 where 条件,读取第一条满足条件的记录,然后 InnoDB 引擎会将第一条记录
返回,并加锁 (current read)。待 MySQL Server 收到这条加锁的记录之后,会再发起一个
Update 请求,更新这条记录。一条记录操作完成,再读取下一条记录,直至没有满足条件
的记录为止。因此,Update 操作内部,就包含了一个当前读。同理,Delete 操作也一样。Insert
操作会稍微有些不同,简单来说,就是 Insert 操作可能会触发 Unique Key 的冲突检查,也会
进行一个当前读。
注:根据上图的交互,针对一条当前读的 SQL 语句,InnoDB 与 MySQL Server 的交互,是一
条一条进行的,因此,加锁也是一条一条进行的。先对一条满足条件的记录加锁,返回给
MySQL Server,做一些 DML 操作;然后在读取下一条加锁,直至读取完毕。
1. Cluster Index:聚簇索引
InnoDB 存储引擎的数据组织方式,是聚簇索引表:完整的记录,存储在主键索引中,通过
主键索引,就可以获取记录所有的列。关于聚簇索引表的组织方式,可以参考 MySQL 的官
方文档:Clustered and Secondary Indexes 。本文假设读者对这个,已经有了一定的认识,就
不再做具体的介绍。接下来的部分,主键索引/聚簇索引 两个名称,会有一些混用,望读者
知晓。
1. 2PL:Two-Phase Locking
传统 RDBMS 加锁的一个原则,就是 2PL (二阶段锁):Two-Phase Locking。相对而言,2PL 比
较容易理解,说的是锁操作分为两个阶段:加锁阶段与解锁阶段,并且保证加锁阶段与解锁
阶段不相交。下面,仍旧以 MySQL 为例,来简单看看 2PL 在 MySQL 中的实现。
从上图可以看出,2PL 就是将加锁/解锁分为两个完全不相交的阶段。加锁阶段:只加锁,
不放锁。解锁阶段:只放锁,不加锁。
1. Isolation Level
隔离级别:Isolation Level,也是 RDBMS 的一个关键特性。相信对数据库有所了解的朋友,
对于 4 种隔离级别:Read Uncommited,Read Committed,Repeatable Read,Serializable,都
有了深入的认识。本文不打算讨论数据库理论中,是如何定义这 4 种隔离级别的含义的,而
是跟大家介绍一下 MySQL/InnoDB 是如何定义这 4 种隔离级别的。
MySQL/InnoDB 定义的 4 种隔离级别:
� Read Uncommited
可以读取未提交记录。此隔离级别,不会使用,忽略。
� Read Committed (RC)
快照读忽略,本文不考虑。
针对当前读,RC 隔离级别保证对读取到的记录加锁 (记录锁),存在幻读现象。
� Repeatable Read (RR)
快照读忽略,本文不考虑。
针对当前读,RR 隔离级别保证对读取到的记录加锁 (记录锁),同时保证对读取的范围加锁,
新的满足查询条件的记录不能够插入 (间隙锁),不存在幻读现象。
� Serializable
从 MVCC 并发控制退化为基于锁的并发控制。不区别快照读与当前读,所有的读操作均为当
前读,读加读锁 (S 锁),写加写锁 (X 锁)。
Serializable 隔离级别下,读写冲突,因此并发度急剧下降,在 MySQL/InnoDB 下不建议使用。
1. 一条简单 SQL 的加锁实现分析
在介绍完一些背景知识之后,本文接下来将选择几个有代表性的例子,来详细分析 MySQL
的加锁处理。当然,还是从最简单的例子说起。经常有朋友发给我一个 SQL,然后问我,这
个 SQL 加什么锁?就如同下面两条简单的 SQL,他们加什么锁?
� SQL1:select * from t1 where id = 10;
� SQL2:delete from t1 where id = 10;
针对这个问题,该怎么回答?我能想象到的一个答案是:
� SQL1:不加锁。因为 MySQL 是使用多版本并发控制的,读不加锁。
� SQL2:对 id = 10 的记录加写锁 (走主键索引)。
这个答案对吗?说不上来。即可能是正确的,也有可能是错误的,已知条件不足,这个问题
没有答案。如果让我来回答这个问题,我必须还要知道以下的一些前提,前提不同,我能给
出的答案也就不同。要回答这个问题,还缺少哪些前提条件?
� 前提一:id 列是不是主键?
� 前提二:当前系统的隔离级别是什么?
剩余16页未读,继续阅读
白小俗
- 粉丝: 30
- 资源: 303
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- SSCMS登录模块需要的JS文件
- JSP网络购物中心毕业设计(源代码+论文).rar
- 白盒测试报告.docx
- 基于LM5117芯片评估开发板硬件参考设计(原理图+PCB)+中英文数据手册资料.zip
- 照片批量重命名软件(文件批量修改图片文件名)
- app.apk
- 人工智能(AI)是计算机科学的一个分支,旨在开发和应用能够模拟、延伸和扩展人类智能的理论、方法和技术,包括机器人、语言识别、图像
- 嵌入式与物联网开发是当今信息技术领域的两大重要分支,它们相互交织,共同推动着智能化时代的进步 嵌入式开发主要关注在嵌入式操作
- 网络安全,这一看似高深莫测的领域,实则与我们每个人的生活息息相关
- 毕业设计基于深度学习的视觉问答系统源码+文档说明+答辩PPT.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0