阅读原文请点击:
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
当事务结束后,释放
支持死锁检测
数据库中的锁
锁的兼容矩阵
阅读原文请点击:
http://click.aliyun.com/m/22563/
分享到:
相关推荐
在深入探讨MySQL事务和锁的原理之前,我们首先需要对“事务”的概念有一个基本的理解。事务是一组操作的集合,这些操作要么全部完成,要么全部不做,确保数据库从一种一致性状态转换到另一种一致性状态,而不会留下...
MySQL是世界上最受欢迎的开源关系型数据库管理系统之一,其5.5.40版本是一个重要的里程碑,在这个版本中,MySQL提供了一系列增强的特性和性能优化。MySQL 5.5系列是MySQL发展的一个关键阶段,它引入了许多针对企业级...
前言 前一章提到了解决幻读的问题是加锁的方式,那就聊一聊MySQL锁相关的知识点。锁在面试中问的概率不是很大,了解...一、MySQL锁的分类 原创文章 5获赞 12访问量 2823 关注 私信 展开阅读全文 作者:零尘_oo
- **关系型数据库**:一种基于关系模型的数据库,其中数据被组织成一系列表格,通过定义明确的关系(如主键和外键)来链接这些表格。 - **NoSQL数据库**:非关系型数据库的总称,包括文档存储、键值存储、图形数据库...
MySQL是一种广泛使用的开源关系...总的来说,MySQL技术参考手册提供了全面的MySQL使用指南,包括基础概念、语法特点、数据库设计、并发控制策略以及高级特性,对于数据库管理员、开发者和学习者来说是一份宝贵的资源。
【MySQL数据库开发】期末复习试题涉及了MySQL的基础概念、语法及使用方法,涵盖了数据库设计、数据类型、SQL语句、存储程序、事务处理、锁机制、数据库引擎等多个方面。以下是根据题目内容提炼出的关键知识点: 1. ...
- 提供了一系列减少锁竞争的策略。 **第14章 优化MySQL Server** - **14.1 查看MySQL server当前参数** - 指导如何使用`SHOW VARIABLES`等命令来查看当前配置状态。 - **14.2 影响MySQL性能的重要参数** - **...
本文档是网易技术部针对MySQL使用过程中积累的经验总结,旨在为用户提供一系列实用的技术指南。文档内容涵盖MySQL的开发和优化两大方面,具体包括了MySQL的基础使用技巧、存储引擎的选择、数据类型的选用、字符集...
根据提供的文档信息,我们可以整理出一系列关于MySQL数据库开发的关键知识点,这些知识点主要涵盖了数据库的基本概念、数据类型、存储过程、锁定机制、事务处理等方面。下面将对这些知识点进行详细的阐述。 ### ...
事务是一系列操作的集合,这些操作要么全部成功,要么全部失败。在事务执行期间,为了保证数据的一致性和隔离性,通常会使用锁来保护数据资源不受并发操作的影响。例如,在更新操作中,为了避免两个事务同时修改同一...
04 ORM多表操作之一对多查询之双下划线查询 05 ORM多表操作之多对多添加记录 06 ORM多表操作之多对多查询 07 ORM多表操作之F查询与Q查询 08 ORM的querySet集合对象的特性 第53章 01 admin介绍 02 alex首秀失败 03 ...
根据提供的文档标题、描述、标签以及部分内容,我们可以总结出关于Spring框架、MySQL...Spring框架与MySQL数据库是现代软件开发中不可或缺的技术栈,掌握它们的核心概念和技术点对于提升软件系统的质量和性能至关重要。
- 一系列操作被视为一个不可分割的工作单元。 17. **锁的概念** - 控制并发访问的一种机制。 18. **视图的概念** - 一种虚拟表,其内容由查询结果决定。 19. **游标的概念** - 用于处理结果集中的每一行数据...
在组合服务递送系统中,这通常通过事务管理来实现,确保一系列操作要么全部成功,要么全部失败,遵循ACID(原子性、一致性、隔离性和持久性)原则。 1. **原子性(Atomicity)**:事务的所有操作被视为一个单元,...
超市系统中,商品种类和商品:一个商品种类可以包含多种具体商品,不符合一对一联系的定义。 - D. 超市系统中,订单和订单中的商品:一个订单可以包含多个商品,同样不符合一对一联系的定义。 **2. HFile 数据...
在《数据库系统概论》这本书中,通常会涵盖一系列关键概念和技术,这些内容对于理解和操作数据库至关重要。以下是一些可能涉及的重要知识点: 1. 数据库定义与类型:数据库是一种结构化的数据集合,用于存储和管理...