写点什么

Mysql 锁:灵魂七拷问

  • 2020-03-15
  • 本文字数:1892 字

    阅读完需:约 6 分钟

Mysql 锁:灵魂七拷问

一、缘起

假设你想给别人说明,Mysql 里面是有锁的,你会怎么做?


大多数人,都会开两个窗口,分别起两个事务,然后 update 同一条记录,在发起第二次 update 请求时,block,这样就说明这行记录被锁住了:


二、禁锢

问题来了,貌似只有显式的开启一个事务,才会有锁,如果直接执行一条 update 语句,会不会加锁呢?


比如直接执行:


update t set c = c + 1 where id = 1;
复制代码


这条语句,前面不加 begin,不显式开启事务,那么 Mysql 会不会加锁呢?


直觉告诉你,会。


但是为什么要加锁?


给你五秒钟,说出答案。



学过多线程和并发的同学,都知道下面这段代码,如果不加锁,就会有灵异事件:


i++;
复制代码


开启十个线程,执行 1000 次这段代码,最后 i 有极大可能性,会小于 1000。


这时候,用 Java 的套路,加锁:


synchornize {  i++;}
复制代码


问题解决。


同理,对于数据库,你可以理解为 i,就是数据库里的一行记录,i++ 这段代码,就是一条 update 语句,而多线程,对应的就是数据库里的多个事务。


既然对内存中 i 的操作需要加锁,保证并发安全,那么对数据库的记录进行修改,也必须加锁。


这道理很简单,但是很多人,未曾想过。

三、释然

为什么大家都喜欢用第一部分里的例子来演示 Mysql 锁?


因为开两个事务,会 block,够直观。


那么问题又来了,为什么会 block,或者说,为什么 Mysql 一定要等到 commit 了,才去释放锁?


执行完一条 update 语句,就把锁释放了,不行吗?


举个例子就知道 Mysql 为什么要这么干了:



一开始数据是:{id:1,c:1};


接着事务 A 通过 select … for update,进行当前读,查到了 c=1;


接着它继续去更新,把 c 更新成 3,假设这时候,事务 A 执行完 update 语句后,就把锁释放了;


那么就有了第 4 行,事务 B 过来更新,把 c 更新成 4;


结果到了第 5 行,事务 A 又来执行一次当前读,读到的 c,竟然是 4,明明我上一步才把 c 改成了 3…


事务 A 不由的发出怒吼:我为什么会看到了我不该看,我也不想看的东西?!


事务 B 的修改,居然让事务 A 看到了,这明目张胆的违反了事务 ACID 中的 I,Isolation,隔离性(事务提交之前,对其他事务不可见)。


所以,结论:Mysql 为了满足事务的隔离性,必须在 commit 才释放锁。

四、自私的基因

有人说,如果我是读未提交( Read Uncommited )的隔离级别,可以读到对方未提交的东西,是不是就不需要满足隔离性,是不是就可以不用等到 commit 才释放锁了?


非也。


还是举例子:



事务 A 是 Read Committed,事务 B 是 Read Uncommitted;


事务 B 执行了一条 update 语句,把 c 更新成了 3


假设事务 B 觉得自己是读未提交,就把锁释放了


那这时候事务 A 过来执行当前读,读到了 c 就是 3


事务 A 读到了别的事务没有提交的东西,而事务 A,还说自己是读已提交,真是讽刺


根因在于,事务 B 非常自私,他觉得自己是读未提交,就把锁释放了,结果让别人也被“读未提交”


显然,Mysql 不允许这么自私的行为存在。


结论:就算你是读未提交,你也要等到 commit 了再释放锁。

五、海纳百川

都知道 Mysql 的行锁,分为 X 锁和 S 锁,为什么 Mysql 要这么做呢?


这个简单吧,同样可以类比 Java 的读写锁:


It allows multiple threads to read a certain resource, but only one to write it, at a time.


允许多个线程同时读,但只允许一个线程写,既支持并发提高性能,又保证了并发安全。

六、凤凰涅磐

最后来个难点的。


假设事务 A 锁住了表 T 里的一行记录,这时候,你执行了一个 DDL 语句,想给这张表加个字段,这时候需要锁表吧?但是由于表里有一行记录被锁住了,所以这时候锁表时会 block。


那 Mysql 在锁表时,怎么判断表里有没有记录被锁住呢?


最简单暴力的,遍历整张表,遍历每行记录,遇到一个锁,就说明表里加锁了。


这样做可以,但是很傻,性能很差,高性能的 Mysql,不允许这样的做法存在。


Mysql 会怎么做呢?


行锁是行级别的,粒度比较小,好,那我要你在拿行锁之前,必须先拿一个假的表锁,表示你想去锁住表里的某一行或者多行记录。


这样,Mysql 在判断表里有没有记录被锁定,就不需要遍历整张表了,它只需要看看,有没有人拿了这个假的表锁。


这个假的表锁,就是我们常说的,意向锁。


Intention locks are table-level locks that indicate which type of lock (shared or exclusive) a transaction requires later for a row in a table


很多人知道意向锁是什么,但是却不知道为什么需要一个粒度比较大的锁,不知道它为何而来,不知道 Mysql 为何要设计个意向锁出来。


知其然,知其所以然。

七、参考文献


2020-03-15 20:19749

评论

发布
暂无评论
发现更多内容

win版Artweaver Plus(绘画软件) v7.0.17.15576 特别版

iMac小白

win版Adobe Photoshop 2024 (PS2024) v25.9.1直装版

iMac小白

Leangoo一站式敏捷研发协同平台,助力敏捷企业高效协同

顿顿顿

敏捷开发 敏捷工具 scrum工具

迁移方案详解 | 使用YMP从异构数据库迁移到YashanDB

Geek_2d6073

win版PDF-XChange Editor Plus(PDF工具合集包) v10.3.1.387特别版

iMac小白

【解决方案】Java 互联网项目中消息通知系统的设计与实现

EquatorCoco

Java 数据库 消息通知

如何使用JavaScript实现在线Excel附件的上传与下载?

不在线第一只蜗牛

JavaScript Excel

电竞体育直播APP源码开发费用,以及搭建所需的各种资料和服务

软件开发-梦幻运营部

win版Cyber​​Link PhotoDirector2024(相片大师) v15.5.1730.极致版

iMac小白

win版Allavsoft Video Downloader Converter(视频下载和格式转换) v3.27.2.8935 特别版

iMac小白

Allavsoft for Mac(视频下载工具) v3.27.2.8935版

Mac相关知识分享

Mac软件 mac下载 视频下载软件 多媒体下载软件

win版NetSetMan Pro(电脑ip切换软件) v5.3.2 特别版

iMac小白

2024青岛国际软件及信息技术博览会(CICE电博会)

AIOTE智博会

软件博览会 软件展会 软件展 软件展览会

FabFilter Total Bundle 2024 for Mac(音频插件合集)

Mac相关知识分享

音频插件 mac插件下载 音乐插件

一文读懂Lumoz节点的潜力与收益,加密收益新范式

大瞿科技

小程序与小组件技术和场景介绍解析

Onegun

小程序 finclip 小程序组件

Royal TSX for Mac(强大的远程管理软件)

Mac相关知识分享

服务器管理 mac软件下载 远程管理

win版ApowerREC( 傲软屏幕录屏工具) v1.7.0.6.0 便携版

iMac小白

win版Adobe Acrobat Pro DC 2024(PDF编辑软件) v2024绿色便携版

iMac小白

win版Radiant Photo(照片编辑美化软件) v1.3.1.455 (x64)特别版

iMac小白

Microsoft Remote Desktop for Mac(微软远程连接软件)

Mac相关知识分享

远程软件 Mac软件 远程桌面 mac下载

MES系统适用于哪些行业?MES系统具体功能有哪些?

万界星空科技

mes 万界星空科技 离散型制造业 流程型制造业

软件测试学习笔记丨redis的穿透、击穿、雪崩有什么不同点?

测试人

redis 软件测试 测试开发

win版轻闪PDF(傲软PDF编辑软件) v2.14.6中文特别版

iMac小白

《SelectDB 新一代日志存储分析平台解决方案》白皮书重磅发布|立即下载

SelectDB

大数据 数据分析 实时数仓 解决方案 日志处理

淘宝商品详情API接口:商品属性与评论数据综合获取,助力市场研究

技术冰糖葫芦

API 安全 API 开发 API 策略 pinduoduo API

京东商品详情API:解锁电商数据的金钥匙

Noah

一文读懂Lumoz节点的潜力与收益,加密收益新范式

加密眼界

Artstudio Pro for mac(绘图和编辑工具)

Mac相关知识分享

Mac软件 照片编辑软件 数字绘画软件 mac下载

AI 克隆声音,只需 3 分钟(附最全教程)

阿里巴巴云原生

阿里云 AI 云原生 函数计算

Mysql 锁:灵魂七拷问_文化 & 方法_柳树_InfoQ精选文章