阅读原文请点击:
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/
分享到:
相关推荐
MySQL是世界上最流行的关系型数据库管理系统之一,其性能监控和优化是DBA日常工作中不可或缺的部分。"MySQL status"指的是MySQL服务器的性能状态变量,通过这些变量,我们可以了解数据库的运行情况,找出潜在的问题...
学习如何配置和解读错误日志、慢查询日志和二进制日志,以及如何使用工具如pt-query-digest进行性能分析。 9. **其他功能**: MySQL 5.1还包含视图、存储过程、触发器、事件调度器等功能,手册都会一一介绍,帮助...
MySQL 8.0是一个重要的里程碑版本,它带来了一系列显著的改进和增强,旨在提供更高的性能、更好的用户体验以及更强的安全性。以下是对这些新特性的详细解读: 1. **更简便的NoSQL支持**: MySQL 8.0继续强化对...
随着2015年10月22日MySQL 5.7.9稳定版的发布,一系列重要的更新与改进也随之而来。本文将详细解读这些新特性,帮助读者更好地理解这些变化及其带来的实际意义。 #### 一、安全性增强 MySQL 5.7在安全性方面做出了...
Oracle MySQL数据库故障处理应急方案是一系列针对数据库在运行过程中可能遇到的锁等待、latchfree、cachebufferchains以及librarycachelock等高资源消耗和CPU负载问题的处理方法和步骤。该方案详细描述了上述问题的...
MySQL是世界上最受欢迎的关系型数据库管理系统之一,尤其在Web应用程序中被广泛应用。对于后端开发者来说,熟练掌握MySQL是必备技能,而面试时,面试官往往会针对MySQL提出一系列问题来评估候选人的技术水平。以下是...
MySQL提供了多种类型的锁来确保数据的一致性和完整性。 - **行锁**:锁定单个行,对并发操作的支持较好。 - **表锁**:锁定整个表,适用于读多写少的场景。 - **页锁**:锁定特定的数据页,适用于较大的范围操作。 ...
在"Greenplum内核技术优化解读"中,主要涵盖了以下几个核心知识点: 1. **内核升级与技术创新**:Greenplum 6.0的内核升级是从PostgreSQL的8.3版本逐步升级到9.4.20版本,这一过程集成了社区的大量代码改进,大约...
### MySQL Profiles 功能详解 MySQL 的 `Profiles` 功能是一个非常强大的工具,它允许数据库管理员和开发者深入了解 SQL 语句的执行过程,从而优化数据库性能。这一特性自 MySQL 5.0.37 版本引入,为用户提供了比 `...
它能够捕获关于SQL查询、锁等待、缓冲池使用情况、索引效率等一系列关键指标,这些数据对于诊断数据库性能瓶颈至关重要。myawr通过执行特定的SQL查询和系统命令,获取到MySQL服务器的运行状态,然后将其整理成易于...
此外,标签“3306全套内部”暗示这款工具可能包含了针对3306端口MySQL服务的一系列解决方案。这可能包括但不限于性能优化、安全配置、故障排查等方面。全套工具往往集成了多种实用功能,比如性能监控、日志分析、...
5. **事务和锁管理**:理解并正确使用事务和锁机制可以防止死锁,提高并发处理能力,也是SQL整形的一部分。 6. **查询执行计划**:分析查询执行计划可以帮助识别性能瓶颈,找出需要优化的部分。SQL整形可能包括学习...
- **解读**:此字符串很可能代表了某个特定版本的Crystal Reports的序列号(Serial Number),是激活软件所必需的关键信息之一。 #### 6. **OrderNumber:18842208** - **解读**:订单号(Order Number),通常...
- 锁机制,包括共享锁和独占锁,以及死锁的预防和检测。 6. **备份与恢复策略**: - 熟悉完整备份、增量备份和差异备份的原理,以及如何制定合适的备份策略。 - 了解如何利用备份进行数据恢复,包括点-in-time...
- **MySQL优化**:分享MySQL性能调优技巧,包括索引优化、查询语句改进等。 - **JVM调优**:探讨JVM内存模型、垃圾回收机制,并提供实际案例分析。 - **高并发处理**:介绍双十一技术复盘中的高并发秒杀系统设计...
25. **MySQL 数据库操作**:在 MySQL 中,创建数据库对象使用的命令是 `CREATE`,这是数据库管理系统中最基本的操作之一。 26. **HTML 定义**:HTML(HyperText Markup Language)即超文本标记语言,是用于创建网页...
使用DBSherlock时,开发者或DBA需要理解数据库的基本原理,如查询优化、锁机制、事务处理等,以便更好地解读分析结果。同时,持续学习和掌握Python编程,以及相关的数据库API,将有助于更深入地利用DBSherlock进行...