阅读原文请点击:
http://click.aliyun.com/m/22563/
摘要: 背景 锁是MySQL里面最难理解的知识,但是又无处不在。 一开始接触锁的时候,感觉被各种锁类型和名词弄得晕头转向,就别说其他了。 本文是通过DBA的视角(非InnoDB内核开发)来分析和窥探锁的奥秘,并解决实际工作当中遇到的问题 锁的种类&概念 想要啃掉这块最难的大骨头,必须先画一个框架,先了解
背景
锁是MySQL里面最难理解的知识,但是又无处不在。
一开始接触锁的时候,感觉被各种锁类型和名词弄得晕头转向,就别说其他了。
本文是通过DBA的视角(非InnoDB内核开发)来分析和窥探锁的奥秘,并解决实际工作当中遇到的问题
锁的种类&概念
想要啃掉这块最难的大骨头,必须先画一个框架,先了解其全貌,才能逐个击破
Shared and Exclusive Locks
* Shared lock: 共享锁,官方描述:permits the transaction that holds the lock to read a row
eg:select * from xx where a=1 lock in share mode
* Exclusive Locks:排他锁: permits the transaction that holds the lock to update or delete a row
eg: select * from xx where a=1 for update
Intention Locks
1. 这个锁是加在table上的,表示要对下一个层级(记录)进行加锁
2. Intention shared (IS):Transaction T intends to set S locks on individual rows in table t
3. Intention exclusive (IX): Transaction T intends to set X locks on those rows
4. 在数据库层看到的结果是这样的:
TABLE LOCK table `lc_3`.`a` trx id 133588125 lock mode IX
Record Locks
1. 在数据库层看到的结果是这样的:
RECORD LOCKS space id 281 page no 3 n bits 72 index PRIMARY of table `lc_3`.`a` trx id 133588125 lock_mode X locks rec but not gap
2. 该锁是加在索引上的(从上面的index PRIMARY of table `lc_3`.`a` 就能看出来)
3. 记录锁可以有两种类型:lock_mode X locks rec but not gap && lock_mode S locks rec but not gap
Gap Locks
1. 在数据库层看到的结果是这样的:
RECORD LOCKS space id 281 page no 5 n bits 72 index idx_c of table `lc_3`.`a` trx id 133588125 lock_mode X locks gap before rec
2. Gap锁是用来防止insert的
3. Gap锁,中文名间隙锁,锁住的不是记录,而是范围,比如:(negative infinity, 10),(10, 11)区间,这里都是开区间哦
Next-Key Locks
1. 在数据库层看到的结果是这样的:
RECORD LOCKS space id 281 page no 5 n bits 72 index idx_c of table `lc_3`.`a` trx id 133588125 lock_mode X
2. Next-Key Locks = Gap Locks + Record Locks 的结合, 不仅仅锁住记录,还会锁住间隙,比如: (negative infinity, 10】,(10, 11】区间,这些右边都是闭区间哦
Insert Intention Locks
1. 在数据库层看到的结果是这样的:
RECORD LOCKS space id 279 page no 3 n bits 72 index PRIMARY of table `lc_3`.`t1` trx id 133587907 lock_mode X insert intention waiting
2. Insert Intention Locks 可以理解为特殊的Gap锁的一种,用以提升并发写入的性能
AUTO-INC Locks
1. 在数据库层看到的结果是这样的:
TABLE LOCK table xx trx id 7498948 lock mode AUTO-INC waiting
2. 属于表级别的锁
3. 自增锁的详细情况可以之前的一篇文章:
http://keithlan.github.io/2017/03/03/auto_increment_lock/
显示锁 vs 隐示锁
* 显示锁(explicit lock)
显示的加锁,在show engine innoDB status 中能够看到 ,会在内存中产生对象,占用内存
eg: select ... for update , select ... lock in share mode
* 隐示锁(implicit lock)
implicit lock 是在索引中对记录逻辑的加锁,但是实际上不产生锁对象,不占用内存空间
* 哪些语句会产生implicit lock 呢?
eg: insert into xx values(xx)
eg: update xx set t=t+1 where id = 1 ; 会对辅助索引加implicit lock
* implicit lock 在什么情况下会转换成 explicit lock
eg: 只有implicit lock 产生冲突的时候,会自动转换成explicit lock,这样做的好处就是降低锁的开销
eg: 比如:我插入了一条记录10,本身这个记录加上implicit lock,如果这时候有人再去更新这条10的记录,那么就会自动转换成explicit lock
* 数据库怎么知道implicit lock的存在呢?如何实现锁的转化呢?
1. 对于聚集索引上面的记录,有db_trx_id,如果该事务id在活跃事务列表中,那么说明还没有提交,那么implicit则存在
2. 对于非聚集索引:由于上面没有事务id,那么可以通过上面的主键id,再通过主键id上面的事务id来判断,不过算法要非常复杂,这里不做介绍
metadata lock
1. 这是Server 层实现的锁,跟引擎层无关
2. 当你执行select的时候,如果这时候有ddl语句,那么ddl会被阻塞,因为select语句拥有metadata lock,防止元数据被改掉
锁迁移
1. 锁迁移,又名锁继承
2. 什么是锁迁移呢?
a) 满足的场景条件:
b)我锁住的记录是一条已经被标记为删除的记录,但是还没有被puge
c) 然后这条被标记为删除的记录,被purge掉了
d) 那么上面的锁自然而然就继承给了下一条记录,我们称之为锁迁移
锁升级
锁升级指的是:一条全表更新的语句,那么数据库就会对所有记录进行加锁,那么可能造成锁开销非常大,可能升级为页锁,或者表锁。
MySQL 没有锁升级
锁分裂
1. InnoDB的实现加锁,其实是在页上面做的,没有办法直接对记录加锁
2. 一个页被读取到内存,然后会产生锁对象,锁对象里面会有位图信息来表示哪些heapno被锁住,heapno表示的就是堆的序列号,可以认为就是定位到某一条记录
3. 大家又知道,由于B+tree的存在,当insert的时候,会产生页的分裂动作
4. 如果页分裂了,那么原来对页上面的加锁位图信息也就变了,为了保持这种变化和锁信息,锁对象也会分裂,由于继续维护分裂后页的锁信息
锁合并
锁的合并,和锁的分裂,其实原理是一样的,参考上面即可。
至于锁合并和锁分裂的算法,比较复杂,这里就不介绍了
latch vs lock
* latch
mutex
rw-lock
临界资源用完释放
不支持死锁检测
以上是应用程序中的锁,不是数据库的锁
* lock
当事务结束后,释放
支持死锁检测
数据库中的锁
锁的兼容矩阵
X vs S
兼容性 X S
X N N
S N Y
IS,IX,S,X
兼容性 IS IX S X
IS Y Y Y N
IX Y Y N N
S Y N Y N
X N N N N
AI,IS,IX,S,X
兼容性 AI IS IX S X
AI N Y Y N N
IS Y Y Y Y N
IX Y Y Y N N
S N Y N Y N
X N N N N N
参考资料
1. https://dev.mysql.com/doc/refman/5.7/en/innodb-locking.html
2. MySQL技术内幕:InnoDB 存储引擎
3. MySQL内核:InnoDB 存储引擎
用云栖社区APP,舒服~
【云栖快讯】快速解决数据库难题,云数据库经典案例及最佳实践直播专场!阿里云数据库专家团队成员倾囊相授!赶紧报名。 详情请点击
评论文章 (0) (0) (0) 分享到:
上一篇:omega监控系列之connection下一篇:MySQL锁系列(二)之 锁解读
相关文章
Java线程之锁研究 Java线程之锁研究 Oracle官方并发教程之锁对象 Oracle官方并发教程之锁对象 【转】Innodb中的事务隔离级别和锁的关系 java锁的种类以及辨析(一):自旋锁 java锁的种类以及辨析(一):自旋锁 Java锁的种类以及辨析(二):自旋锁的其他种类 Java锁的种类以及辨析(二):自旋锁的其他种类 Java锁的种类以及辨析(三):阻塞锁
网友评论
登录后可评论,请 登录 或 注册
评论
关注
兰春 专家认证
安居客数据库负责人,专注于MySQL领域的运维...
34篇文章|40关注
文中提到的云产品
云数据库RDS
RDS是一种稳定可靠、可弹性伸缩的在线数据库服务。支持MySQL、SQL Server、PostgreSQL、高...
了解更多
对象存储OSS
提供海量、安全和高可靠的云存储服务。RESTful API的平台无关性,容量和处理能力的弹性扩展,按实际容量付费...
了解更多
大数据计算服务(MaxCompute)
快速、完全托管的TB/PB级数据仓库解决方案,向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更...
了解更多
云服务器ECS
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
了解更多
目录收起
1背景
2锁的种类&概念
3锁的兼容矩阵
4参考资料
博主其他文章更多>
MySQL锁系列(二)之 锁解读
omega监控系列之connection
MySQL5.6:一个神奇的执行计划
自增锁引发的悲剧
MySQL5.7 GTID 运维实战
device is busy
MySQL运维之神奇的参数
使用sysbench对MySQL进行测试
InnoDB 个性化备份
相关话题更多>
玩转大数据,顺利渡过34岁裁退危机!
这个黑客横行的时代,你竟然还敢让服务器裸奔 ?
NSA “永恒之蓝” 勒索蠕虫全球爆发,已波及 99 个国家,程序猿你怎么防范?
DockerCon 2017,那些Docker的新技术你们怎么看?
听说API大赛有神奇作品出现?
2017云栖大会·上海峰会火热报名中
2017云栖大会·上海峰会火热报名中
版权声明
阅读原文请点击:
http://click.aliyun.com/m/22563/
分享到:
相关推荐
基于Php语言设计并实现了微信小程序的社区门诊管理系统。该小程序基于B/S即所谓浏览器/服务器模式,选择MySQL作为后台数据库去开发并实现一个以微信小程序的社区门诊为核心的系统以及对系统的简易介绍。 用户注册,在用户注册页面通过填写账号、密码、确认密码、姓名、性别、手机、等信息进行注册操作; 用户登录,用户通过登录页面输入账号和密码,并点击登录进行小程序登录操作。 用户登陆微信端后,可以对首页、门诊信息、我的等功能进行详细操作 门诊信息,在门诊信息页面可以查看科室名称、科室类型、医生编号、医生姓名、 职称、坐诊时间、科室图片、点击次数、科室介绍等信息进行预约挂号操作 检查信息,在检查信息页面可以查看检查项目、检查地点、检查时间、检查费用、账号、姓名、医生编号、医生姓名、是否支付、审核回复、审核状态等信息进行支付操作
白色大气风格的设计师作品模板下载.zip
工程经济学自考必备软件下载
UML课程设计报告.doc
白色大气风格响应式彩绘精品水果网站模板.zip
白色简洁风格的别墅整站网站模板.zip
白色简洁风格的APP展示动态源码下载.zip
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于计算机科学与技术等相关专业,更为适合;
白色大气风格的雪山旅游景区CSS3网站模板.zip
介绍 基于python开发的大模型调用基础框架(源码) 使用说明 修改配置文件 cd config vim __init__.py # 在配置文件中添加大模型调用地址,模型名称,API_KEY等配置 启动应用 应用启动分为两种模式,命令行模式和web模式 命令行模式 python main.py cli web模式 python main.py api
基于JavaWeb的小区物业管理系统源代码+数据库 负责数据库的设计和界面的设计和实现; 界面使用 BootStrap 框架,页面自适应效果,修改页面后实现各个功能模块的布局; 负责实现用户登录注册,查看小区活动公告、水电费查询、车费查询信息; 采用的技术:采用 MVC 架构,数据库用 MySql;
白色简单风格的商务企业网站模板下载.zip
1. 平台在家电和电子产品方面的营运情况如何? 2. 哪些品牌和类别销量最高? 3. 用户消费规律 4. 哪些是我们的重点用户? 5. 平台有哪些优势和不足,需要如何改进?
全平台数据库管理工具, 支持 ClickHouse, Presto, Trino, MySQL, PostgreSQL, Apache Druid, ElasticSearch...
白色大气风格的旅游整站网站模板.zip
1、嵌入式物联网单片机项目开发例程,简单、方便、好用,节省开发时间。 2、代码使用KEIL 标准库开发,当前在STM32F030C8T6运行,如果是STM32F030其他型号芯片,依然适用,请自行更改KEIL芯片型号以及FLASH容量即可。 3、软件下载时,请注意keil选择项是jlink还是stlink。 4、有偿指导v:wulianjishu666; 5、如果接入其他传感器,请查看账号发布的其他资料。 6、单片机与模块的接线,在代码当中均有定义,请自行对照。 7、若硬件有差异,请根据自身情况调整代码,程序仅供参考学习。 8、代码有注释说明,请耐心阅读。 9、编译时请注意提示,请选择合适的编译器版本。
Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作
白色大气风格的红唇少女女性类网站模板.zip
白色简洁风格的UIDesign设计公司企业网站模板.rar
Linux期末考试试题.doc