Mysql中的快照读和当前读

mysql当前读和快照读(MVCC)
mysql读取数据实际上有两种读取模式:当前读和快照读
当前读:每次读取的都是当前最新的数据,但是读的时候不允许写,写的时候也不允许读。
快照读:读写不冲突,每次读取的是快照数据,
隔离级别Repeatable Read下(默认隔离级别):有可能读取的不是最新的数据
Read Committed隔离级别下:快照读和当前读读取的数据是一样的,都是最新的。
一. 相关知识
1.1 undolog
在操作数据之前,把需要操作的数据和事务记录备份到undo log中,目的就是为了保证原子性,如果一个事务执行中发生了故障,就可以通过undolog进行回滚

1.2 共享锁和排它锁
共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句。

如果事务T仅对数据A进行读取,那么会对数据A加上共享锁,之后则其他事务如果要读取数据A的话可以对其继续加共享锁,但是不能加排他锁(也就是无法修改数据)。获准共享锁的事务只能读数据,不能修改数据。
排他锁(X锁):用于数据修改操作,例如 INSERT、UPDATE 或 DELETE。确保不会同时同一资源进行多重更新。

如果事务T对数据A要进行修改,则需要对其添加排它锁,加上排他锁后,则其他事务不能再对A加任任何类型的封锁。获准排他锁的事务既能读数据,又能修改数据。
二. 当前读
Mysql实现当前读是通过共享锁+排他锁+Next-Key Lock实现的。
每次对行数据进行读取的时候,加共享锁。此时就不允许修改,但是允许其他事务读取,所以每次都可以读到最新的数据。
每次对行数据进行修改的时候,加排他锁,不允许其他事务读取和修改。这种情况下其他事务读取的数据也一定是最新的数据。
每次对范围行数据进行读取的时候,对这个范围加一个范围共享锁。
每次对范围行数据进行修改的时候,读这个范围加一个范围排它锁。
基于上述锁机制,实现当前读,确保每次读取的都是最新的数据。

三. 快照读
mysql中的快照读是通过MVCC+undolog实现的。
快照读,顾名思义,就是读取快照数据,也就是说当某个数据正在被修改的时候,也可以进行读取该数据,保证读写不冲突。
刚刚提到undolog,当我们对记录做了变更操作时,就会产生undo记录,undo记录中存储的是老版数据,当一个旧的事务需要读取数据时,为了能够读取到老版本的数据,需要顺着undo列找到满足其可见性的记录,这个找满足可见行的记录依赖。就是说每次都是读取undolog中的数据。
MVCC:

MVCC也称多版本并发控制,说的通俗易懂一点就是记录数据的不同版本。
实际上,不同事务或者相同事务的对同一记录的修改,会导致该记录的undo log成为一条记录版本线性表,既链表,undo log的链首就是最新的旧记录,链尾就是最早的旧记录。
所以快照读都是去读取undolog中链首的最新的旧记录。
但是不同隔离级别下的快照读又有所区别。下面简单阐述

四. 不同隔离级别下的快照读
这里举例说明:

事务开始前 name = 张三 id = 1
事务A:select name from t where id = 1 (多次)
事务B:update name = 李四 from t where id = 1
在Read Committed隔离级别下,快照读和当前读读取的是一样的。因为每次select都会去读取最新的快照数据。

过程如下:

事务A开始
事务B开始
事务A select ,查出name = 张三
事务B update,修改name = 李四
事务B结束
事务A 再次select ,查出name = 李四 (因为此时undolog中的最新数据为李四)
事务A结束
在默认隔离级别Repeatable Read下,在一个事务内,读取的都是第一次select的数据,所以可能会出现读取的数据不是最新数据的情况
过程如下:

事务A开始
事务B开始
事务A select ,查出name = 张三
事务B update,修改name = 李四
事务B结束
事务A 再次select ,查出name = 张三 (因为只读第一次的快照数据)
事务A结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347137.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

仿王者荣耀网页-前端网页技术设计完整精美源码HTML+CSS+JS

效果预览①主页首页 效果预览②游戏介绍页 效果预览③游戏攻略页 效果预览④手办商城页 效果预览⑤问卷调查页 效果预览⑥加入我们页 微信公众号:创享日记 发送:王者荣耀 获取完整源码(打开即可用) 其余及源码详见下载&…

仿今日头条实时新闻微信小程序项目源码

微信公众号:创享日记 发送:今日头条 获取完整源码(微信开发者工具导入即可用) 以下可以忽略不看! 今日头条是北京字节跳动科技有限公司开发的一款基于数据挖掘的推荐引擎产品,为用户推荐信息、提供连接人与…

【超级鼠标键盘锁】之HOOK钩子屏蔽鼠标和Ctrl+Alt+Del、Win+L之外的按键

最初,于2018年初步实现了windows7 64位系统下的鼠标键盘锁。然而,随着时光的流逝,微软已经放弃了对windows7系统的更新与维护,windows10系统已经不断地普及,是时候研究一下win10系统下的鼠标键盘锁了。 ①HOOK钩子dll实现 HOOK钩子动态链接库部分的实现,直接在VS中建立…

perl大骆驼和小骆驼_从代码内部:骆驼路由引擎第一部分

perl大骆驼和小骆驼因此,最近我重新燃起了对Apache Camel的工作方式的兴趣。 Camel是一种功能强大的集成工具,使用非常广泛,但是只要我将其投入使用,我都会忍不住想“好吧,这到底是怎么做的!” …我只是有一…

高频小信号谐振放大器设计-课程设计Multisim仿真

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送:高频课设 获…

【超级鼠标键盘锁】之winlogon.exe进程调试

至此,除了Ctrl+Alt+Del、Win+L组合键之外,其他能想到的按键和鼠标都屏蔽了,对于这两个组合键的屏蔽,看下论坛中有位前辈heiheiabcd很早之前就写了一篇文章: https://blog.csdn.net/linfei2707/article/details/25237671 文章提到四种想法,其中第四种方法堪称完美,好像这…

Java机器学习,第1部分

您搜索了某种导出机器学习模型的方法,以便可以将它们用于评估数据,并且看到可以PMML格式导出它们。 您实际上是在Java生态系统中工作的,但没有动机既不编写PMML库也不为其编写Rest API。 然后,我将向您推荐LightningScorer &#…

微波技术基础实验二 功分器与定向耦合器设计

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送:耦合器 获取…

【超级鼠标键盘锁】之远线程注入winlogon.exe进程屏蔽Ctrl+Alt+Del、Win+L

通过上一节对winlogon.exe进程的调试,得到了其处理Ctrl+Alt+Del和Win+L按键的关键代码位置偏移,并阐述了如何对指令进行修改,从而达到屏蔽这两个按键。 本节采用远线程注入技术进行实现。 一、远线程注入与卸载 远线程注入和卸载部分主要参考书籍《Windows核心编程》,在…

微波技术基础实验一 滤波器的设计

微信公众号:创享日记 发送:滤波器 获取完整报告工程源文件 一、新建滤波器工程和设计原理图 新建一个workspace,并创建原理图。在图中放置电容、电感并用导线连接。双击电容和电感,设置电容为2pF,电感为1.5nH&#xff…

【超级鼠标键盘锁】项目工程下载地址

一、【超级鼠标键盘锁】之实现思路(非驱动实现) 二、HOOK钩子屏蔽鼠标和Ctrl+Alt+Del、Win+L之外的按键 ①HOOK钩子dll实现 ②主程序实现 三、winlogon.exe进程调试 ①window7系统winlogon.exe调试 ②windows10系统winlogon.exe调试 系统版本1 系统版本2 ③在内存中…

微波技术大作业课设-分立电容电感+微带单枝短截线+微带双枝短截线

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送:微带 获取完…

java 观察者模式示例_Java中的观察者设计模式-示例教程

java 观察者模式示例观察者模式是行为设计模式之一 。 当您对对象的状态感兴趣并希望在发生任何更改时得到通知时,观察者设计模式很有用。 在观察者模式中,监视另一个对象状态的对象称为Observer ,而正在监视的对象称为Subject 。 根据GoF&am…

电磁场与电磁波实验一 熟悉Matlab软件在电磁场领域的应用

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 微信公众号:创享日记 发送:matlab电磁…

高斯信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)(代码见CSDN同名资源,博客中也有代码)

关注公号【逆向通信猿】更精彩!!! 一、伪随机序列PN码的生成 伪随机序列有很多种,如m序列、Gold序列和正交Gold序列,其中m序列的构造及MATLAB生成方法见: 线性移位寄存器序列(m序列)之MATLAB实现 m序列虽然性能优良,但同样长度的m序列个数不多,且m序列之间的互相…

Java EE MVC:处理表单验证

在本文中,我们将介绍Java EE MVC中的表单验证。 Java EE MVC与Java Bean验证API( JSR 303 )集成在一起,这使得添加验证约束变得非常容易。 使用JAX-RS方式进行验证 假设我们有一个小的html表单,可用于发送联系人消息…

信号处理系统综合设计-求解器函数的设计(连续和离散时间系统)

微信公众号:创享日记 发送:求解器 获取完整报告(含源程序代码结果分析) 一、在s域分析连续时间系统的方法 一个线性时不变连续时间系统可以用线性常系数微分方程描述,对系统的时域分析可归结为利用数学方法对该方程求解…

OFFICE2019精简安装D盘(包括Word、PPT、Excel,可根据需要调整)+VISIO2019+Mathtype7.4.0完美下载安装教程

经过笔者测试,64位的OFFICE2019、VISIO2019对MathType兼容性很差,时不时出现问题,且网上能查阅到的解决办法均不能很好地解决。 无奈之下换回32位的OFFICE2019,配合MathType7.4.0,简直完美,现将OFFICE 201…

仿知乎论坛社区社交微信小程序

微信公众号:创享日记 发送:仿知乎 获取完整源码(静态数据),导入微信开发者工具即可 说明:源码主要是前端,后端可自行开发 1、首页 问题列表 话题列表 触底加载刷新 2、问题列表及回答 3、发现…

单径Rayleigh信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列)

接上一节 高斯信道下基带模型的多用户BPSK直接序列扩频系统MATLAB仿真(m序列、Gold序列和正交Gold序列) 下面再来看一下m序列与正交Gold序列在单径Rayleigh衰落信道下的性能。 Rayleigh信道 利用改进的jakes模型来产生单径的平坦型瑞利衰落信道(对该jakes模型生成Rayleig…