MySQL技术内幕InnoDB存储引擎(六)——锁
什么是数据库的锁?
锁是数据库系统区别于文件系统的一个关键特性。锁机制用于管理对共享资源的并发访问。让数据库事务满足隔离性的要求。
InnoDB 中锁的作用
不仅用于对数据进行并发访问,还还包括了缓冲池中给LRU列表的操作。从而提供了数据的完整一致性。
latch与lock的区别?
- latch是轻量级的锁,也成为闩锁。
- latch要求锁定的持续时间短,否则性能会很差。
- latch用来保证并发时临界资源的正确性,而lock是整个事务过程。
- latch没有死锁检测机制,lock有。
- latch应用对象时线程,而lock是事务。
- latch保护内存数据结构,而lock保护数据库内存。
InnoDB的锁
分类
- 共享锁:允许事务读一行数据。
- 排他锁:允许事务删除或者更新一行数据。
- 意向共享锁:事务想要获得一张表中某几行的共享锁。
- 意向派排他锁:事务想要获得一张表中某几行的排他锁。
所谓意向锁,就是更细粒度的锁。
一致性非锁定读
原理:
如果在读取数据的时候,该数据正在执行删除或者更新操作,那么这个读取操作就不会等待之前的操作结束,而是直接读取之前版本中备份的信息,也就是undo日志上的数据。
特点:
- 极大程度地提高了并发性能。
- 这是数据库默认的读取方式。
- 无法保证数据逻辑的一致性,因为读到的可能是之前的数据。
对应事务隔离级别:
- 读已提交
- 可重复读
多版本并发控制
什么是多版本并发控制?
对于保留数据库快照数据的之前的各个历史版本,由此带来的并发控制,就是多版本并发控制。所谓快照数据,就是保留某一时刻的数据。
不同事务级别下读取版本:
- 读已提交:读取最新一份的快照数据。
- 可重复读:读取事务开始时的行数据版本。
一致性锁定读
也就是读的时候,去获取数据的锁,防止有其他会话在更改数据。保证督导的数据是最新的,也不会有人在修改。
对应事务隔离级别:
- 串行化。
自增长锁
对于表中的自增长数据,插入的时候就会对一个计数器加一。但是大量的数据插入会使其他事务阻塞。
InnoDB中提供了一种轻量级互斥量的自增长实现机制,这种机制大大提高了自增长插入的性能。
外键和锁
对于外键值的插入和更新,会先去给其父表加一个共享锁,防止父表在期间被修改。
所谓父表,就是外键引用的源表。
锁的算法
InnoDB上有三种行锁的算法,分别是:
- 记录锁:单个行记录上的锁。
- 间隙锁:锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。
- Next-Key Lock:是上两种锁的结合,锁定一个范围,并锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。InnoDB对于行的查询都是采用了Next-Key Lock的算法
当查询的索引含有唯一属性的时候,Next-Key Lock 会进行优化,将其降级为Record Lock,即仅锁住索引本身,不是范围。
并发的问题
1.脏读
脏读就是在不同事务下,两次读的数据不同,当前事务读取了别的事务还没有提交的数据。
现在基本不会发生,因为现在的事务隔离界别都是读已提交。
2.不可重复读
不可重复读就是一个事务内多次读取同一个数据,两次读到数据不同,当前事务读取了别的事务已经提交的数据。
这个问题在很多情况下是容忍的,因为别人提交的数据也是正确的数据。因为如果没有提交,是可能被回滚的
将事务隔离级别设置为可重复读就能解决。
3.幻读
指同一事务下,连续执行两次同样的SQL产生不同的结果,第二次的SQL返回之前不存在的行。也就是幻读。
采用InnoDB默认的事务隔离级别RR,RR下读行默认采用Next-Key Locking算法避免幻读。其原理就是对一个范围的行进行加锁,反正其他会话插入数据产生幻读。
4.丢失更新
就是一个事务的更新操作被另一个事务的更新操作覆盖了,从而导致数据不一致。
这不是数据库层面的问题,而是应用层面的问题,很难避免,唯一的途径就是串行化。比如用户1才操作的时候,不能让其他用户进行操作,因为同时两个用户操作,就有可能丢失一个用户的更新操作。
脏读、不可重复读和幻读的区别
- 这三者的表现都是同一事务多次读取的结果不一样。
- 脏读侧重于读取了别人未提交的同一条数据。
- 不可重复读侧重于读了别人已经提交的数据。
- 幻读侧重于读取了数据条数发生了改变,而上面两条是数据本身发生了改变。
死锁
死锁就是两个或者以上的事务相互等待对方的数据,导致谁都不释放数据,谁都不能获取数据的造成一直等待的现象。
解决死锁的方法
- 超时回滚
如果一个事务等待的时间超过了某一阈值,那么它就要回滚数据,释放资源,另个事务就能拿到资源继续。
问题就是如果这个需要超时回滚的事务是一个大事务(undol量很大),回滚的时间就会很长,不划算。 - 等待图
构建锁的信息链表和事务的等待链表,如果图中存在环,那就说明存在死锁。如果引擎检测到死锁,就会释放环中undo量最小的事务。
这是InnoDB采用的方法。主动检测死锁。
锁升级
锁升级就是将当前锁的粒度降低,锁住的东西变多了。
InnoDB不存在锁升级的问题,因为它是根据事务访问的每个页对锁进行管理的。锁的开销很平均。
MySQL技术内幕InnoDB存储引擎(六)——锁的更多相关文章
- 《mysql技术内幕 InnoDB存储引擎(第二版)》阅读笔记
一.mysql架构 mysql是一个单进程多线程架构的数据库. 二.存储引擎 InnoDB: 支持事务 行锁 读操作无锁 4种隔离级别,默认为repeatable 自适应hash索引 每张表的存储都是 ...
- Mysql技术内幕——InnoDB存储引擎
Mysql技术内幕——InnoDB存储引擎 http://jingyan.baidu.com/article/fedf07377c493f35ac89770c.html 一.mysql体系结构和存储引 ...
- mysql技术内幕InnoDB存储引擎-阅读笔记
mysql技术内幕InnoDB存储引擎这本书断断续续看了近10天左右,应该说作者有比较丰富的开发水平,在源码级别上分析的比较透彻.如果结合高可用mysql和高性能mysql来看或许效果会更好,可惜书太 ...
- MySQL技术内幕InnoDB存储引擎(三)——文件相关
构成MySQL数据库和InnoDB存储引擎表的文件类型有: 参数文件:MySQL实例运行时需要的参数就是存储在这里. 日志文件:用来记录MySQL实例对某种条件做出响应时写入的文件. socket文件 ...
- (转)Mysql技术内幕InnoDB存储引擎-表&索引算法和锁
表 原文:http://yingminxing.com/mysql%E6%8A%80%E6%9C%AF%E5%86%85%E5%B9%95innodb%E5%AD%98%E5%82%A8%E5%BC% ...
- MySQL技术内幕InnoDB存储引擎(表&索引算法和锁)
表 4.1.innodb存储引擎表类型 innodb表类似oracle的IOT表(索引聚集表-indexorganized table),在innodb表中每张表都会有一个主键,如果在创建表时没有显示 ...
- 【Mysql技术内幕InnoDB存储引擎】读书笔记
一.存储引擎 1.InnoDB引擎 设计目标是面向在线事务(OLTP)处理的应用. 支持事务.行级锁.通过多版本并发控制(MVCC)支持高并发.提供一致性非锁定读.next-key locking避免 ...
- 《MySQL技术内幕 InnoDB存储引擎 》学习笔记
第1章 MySQL体系结构和存储引擎 1.3 MySQL存储引擎 数据库和文件系统最大的区别在于:数据库是支持事务的 InnoDB存储引擎: MySQL5.5.8之后默认的存储引擎,主要面向OLTP ...
- MySQL技术内幕InnoDB存储引擎(七)——事务
什么是数据库的事务? 事务是访问并更新数据库中各种数据的一个程序执行单元.事务也是数据库区别于文件系统的一个重要特性. 事务需要满足的特性 1.原子性 原子性就是指数据库中的一个完整的事务是不可分割的 ...
- MySQL技术内幕InnoDB存储引擎(二)——InnoDB存储引擎
1.概述 是一个高性能.高可用.高扩展的存储引擎. 2.InnoDB体系架构 InnoDB存储引擎主要由内存池和后台线程构成. 其中,内存池由许多个内存块组成,作用如下: 维护所有进程和线程需要访问的 ...
随机推荐
- java中elasticsearch7.x关于nested类型的api使用,新增+更新
0,定义esHighClient 1 @Configuration 2 public class RestClientConfig { 3 4 //类似:200.188.22.20:9300,200. ...
- 精尽 MyBatis 源码分析 - 基础支持层
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
- a标签中的target
html中target四种选择_blank._parent._self._top,分别是什么意思? eg:<Cell title="Open link in new window&qu ...
- 安装Ubuntu16.04系统后分辨率底的问题
问题描述:安装Ubuntu系统后有可能会遇到分辨率很低的问题,别着急,这是一个小问题. 解决方案:修改/etc/default/grub,打开终端用命令:sudo gedit /etc/default ...
- 公司人员组织架构图用思维导图软件MindManager怎么做
有朋友一直不太明白组织架构图怎么做,其实组织架构图就是组织结构图.小编今天就在这里以一个公司为例,来给大家演示一番人员组织结构图怎么做. 老规矩,先说一下小编使用的软件跟电脑系统,这里用的是MindM ...
- 从维基百科等网站复制数据和公式到MathType里编辑
在我们写论文的时候,经常会需要用一些实际案例以及数据,而这些数据和案例有很大一部分可以直接在网络上找到.但是有时候也会发现我们想要的内容和公式,从网页上复制粘贴后太模糊,不适合打印和投影.就需要我们将 ...
- github搭建html网站到外网
最近想自己弄个网站,但又没有服务器可以用,只好借用强大得github来帮忙了,不过GitHub确实有这个功能. 感谢以下大佬得教程,非常得详细,但我觉得还是有必要记录下来. 大佬链接: https:/ ...
- 再论<? extends T>和<? super T>
参考: https://www.cnblogs.com/drizzlewithwind/p/6100164.html Java 泛型 <? super T> 中 super 怎么 理解?与 ...
- Arduion学习(一)点亮三色发光二极管
这是我接触Arduion以来第一个小实验 实验准备: 1.查阅相关资料,了解本次实验所用到的引脚.接口的相关知识. 2.准备Arduion板(本次实验所用到的型号为mega2560).三色发光二极管. ...
- 程序媛数据报告:近三年增长至70%,平均月薪1.54W,女性程序媛并不是特殊物种