MySQL事务原理的分析

1.事务

并发连接下考虑事务。
在这里插入图片描述
事务的本质是并发控制的单元,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。

事务控制语句
在这里插入图片描述
ACID特性

原子性:要么都做,要走么都不做。在事务执行期间,对数据的修改操作会记录在undo log中,**如果事务回滚,MySQL会使用undo log中的信息来撤销这些修改操作。如果事务提交,undo log中的信息将被保留,以便在后续的事务中使用。**在InnoDB中,undo log是由多个undo log段组成的。每个undo log段都是一个固定大小的文件,用于存储undo log中的一部分信息。当一个undo log段已经被使用完毕时,InnoDB会自动创建一个新的undo log段,以继续存储undo log中的信息。

一致性:从一种一致性状态到另一种一致性状态。

隔离性:MySQL中的事务隔离性是通过锁和MVCC(多版本并发控制)机制来实现的

MySQL还使用MVCC机制来实现事务隔离性。MVCC机制允许多个事务同时访问同一行数据,每个事务看到的数据版本不同,从而实现了事务隔离性。在MySQL中,每个数据行都有一个版本号,当一个事务对该行数据进行修改时,会生成一个新的版本号。其他事务在读取该行数据时,会根据自己的事务版本号来读取相应的数据版本,从而实现了事务隔离性。

在MySQL中,事务隔离级别包括读未提交、读已提交、可重复读和串行化。不同的隔离级别会使用不同的锁和MVCC机制来实现事务隔离性。例如,读未提交隔离级别不会对数据进行任何锁定或版本控制,而串行化隔离级别会对所有的数据行进行写锁定,以保证事务的完全隔离性。

总之,MySQL中的事务隔离性是通过锁和MVCC机制来实现的。锁机制用于保证数据的一致性和隔离性,MVCC机制用于实现事务的并发控制和隔离性。在MySQL中,事务隔离级别可以通过设置来控制不同的隔离级别,以满足不同的应用场景和需求。

持久性在MySQL中,redo log(重做日志)是用于保证事务持久性的一种日志。redo log记录了对数据的修改操作,以便在数据库崩溃或重启后恢复数据的一致性。

在事务执行期间,对数据的修改操作将被记录到redo log中。如果事务提交,redo log中的信息将被写入磁盘,以保证数据的持久性。如果数据库崩溃或重启,MySQL会使用redo log中的信息来恢复数据的一致性。

redo log的工作原理是将修改操作记录到一个环形缓冲区中,称为redo log缓冲区。当缓冲区被写满时,MySQL会将缓冲区中的信息写入磁盘,并将缓冲区清空,以便继续记录后续的修改操作。为了保证数据的持久性,MySQL还会将redo log缓冲区中的信息定期写入磁盘,以便在数据库崩溃或重启时使用。

在MySQL中,redo log是由多个redo log文件组成的。每个redo log文件都是一个固定大小的文件,用于存储redo log中的一部分信息。当一个redo log文件已经被使用完毕时,MySQL会自动创建一个新的redo log文件,以继续记录redo log中的信息。

总之,redo log是MySQL中用于保证事务持久性的一种日志。redo log记录了对数据的修改操作,以便在数据库崩溃或重启后恢复数据的一致性。在MySQL中,redo log是由多个redo log文件组成的,每个文件都是一个固定大小的文件,用于存储redo log中的一部分信息。

一个SQL语句是怎么执行的?
在这里插入图片描述
InnoDB:一个单个SQL语句就是一个事务。

隔离级别

目的:提升并发性能
在这里插入图片描述
1.读未提交:读到了其他事务还没提交的数据。在read uncommitted隔离级别下,事务可以读取到其他未提交的事务所修改的数据这被称为脏读(dirty read)。这种隔离级别的优点是读取性能高,缺点是可能会读取到不一致的数据,因为其他事务的修改可能会被回滚。
2.读已提交:事务只能读取到已经提交的事务所修改的数据,这避免了脏读的问题。但是,由于其他事务可能会提交或回滚,因此在同一个事务内多次读取同一个数据可能会得到不同的结果,这被称为不可重复读(non-repeatable read)
在这里插入图片描述

3.可重复读: 当事务读取数据时,MySQL会记录一个事务开始的时间戳,并使用该时间戳来确定事务可以读取的数据版本。在同一个事务内多次读取同一个数据时,MySQL会始终返回相同的结果,即使其他事务在读取期间提交或回滚。这就是repeatable read的含义,即事务可以重复读取相同的数据而不会得到不同的结果。
在这里插入图片描述
不是,幻读不同于不可重复读。不可重复读是指在同一个事务内多次读取同一个数据时,可能会得到不同的结果,因为其他事务在读取期间提交或回滚。而幻读是指在同一个事务内多次查询同一个范围的数据时,可能会得到不同的结果,因为其他事务在这个范围内插入了新的数据

例如,假设一个事务在执行如下的查询语句:

SELECT * FROM table WHERE column BETWEEN 10 AND 20;

如果在这个事务执行查询的过程中,另一个事务插入了一条符合条件的新数据,那么第一个事务在后续的查询中可能会返回这条新数据,这就是幻读。

为了避免幻读的问题,MySQL会使用间隙锁(gap lock)来锁定事务读取的数据范围,从而避免其他事务在这个范围内插入新的数据。但是,使用间隙锁会增加锁的开销,因此在一些特定的场景下,可以考虑使用其他的隔离级别来避免幻读的问题。例如,在Serializable隔离级别下,MySQL会对整个表进行锁定,从而避免幻读的问题。

脏读,不可重复读,幻读的总结

  1. 脏读:脏读只会在read uncommitted隔离级别下发生。在这个隔离级别下,一个事务可以读取到另一个未提交的事务所修改的数据,因此可能会读取到无效的数据。

  2. 不可重复读:不可重复读可能在read committed、repeatable read和serializable隔离级别下发生。

  • 在read committed隔离级别下,一个事务只能读取到已经提交的事务所修改的数据。因此,如果一个事务在读取数据时,另一个事务修改了该数据并提交了事务,那么第一个事务在随后的读取中会得到不同的结果,这就是不可重复读。
  • 在repeatable read隔离级别下,一个事务在读取数据时,会创建一个一致性视图(consistent snapshot),用于保证在整个事务过程中,读取到的数据是一致的。因此,如果一个事务在读取数据时,另一个事务修改了该数据并提交了事务,那么第一个事务在随后的读取中仍然会读取到原始的数据,不会发生不可重复读。
  • 在serializable隔离级别下,一个事务在读取数据时,会对整个表进行锁定,从而避免并发事务的干扰。因此,不可重复读和幻读都不会发生。
  1. 幻读:幻读只会在repeatable read和serializable隔离级别下发生。
  • 在repeatable read隔离级别下,虽然一个事务在读取数据时,会创建一个一致性视图,用于保证在整个事务过程中,读取到的数据是一致的。但是,如果一个事务在查询一个范围的数据时,另一个事务插入了符合条件的新数据并提交了事务,那么第一个事务在随后的查询中会得到不同的结果,这就是幻读。
  • 在serializable隔离级别下,一个事务在读取数据时,会对整个表进行锁定,从而避免其他事务的干扰。因此,幻读也不会发生。

需要注意的是,隔离级别越高,数据的一致性和安全性越高,但是并发性能越差。因此,在选择事务隔离级别时,需要根据具体的应用场景进行权衡和选择。

MVCC

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

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

相关文章

窗帘项目投标书:赢得合同的关键

窗帘项目投标书是在商业竞争激烈的市场中,展示公司实力、吸引客户目光,最终赢得合同的重要工具。一个精心编写的投标书不仅可以展示公司的专业素养和项目执行能力,还能突显出公司与众不同的竞争优势,为公司赢得更多商机。 1.投标…

原型中之find()-查找满足条件的第一个元素,并返回该元素的值

array.find(callback(element[, index[, array]])[, thisArg]) callback:必需。要在数组中每个元素上执行的函数。 element:必需。当前正在处理的数组元素。 index:可选。正在处理的元素的索引。 array:可选。调用该方法的数组…

【Java程序设计】【C00247】基于Springboot的农机电招平台(有论文)

基于Springboot的农机电招平台(有论文) 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的农机电招平台 本系统分为系统功能模块、管理员功能模块、农机机主功能模块以及使用者功能模块。 系统功能模块:农机电招…

电力升级改造,我发现了这种配电柜高效技巧!

在当今数字化和智能化的时代,电力作为企业和机构运转的生命线,其高效、可靠、安全的管理变得尤为重要。 因此,为了应对不断增长的电力需求和提升电力设备的运行水平,配电柜监控系统应运而生。 客户案例 制造业企业 济宁某企业面…

【vue】v-for 使用 Array.prototype.reverse() 的无限更新循环

v-for"item in items.reverse()"[Vue 警告] 组件渲染函数中可能存在无限更新循环。infinite loop update Array.prototype.reverse 实际上修改了它应用于 的数组. Vue 获取此更改并同时触发 v-for重新评估,触发另一个 .reverse() .这会触发 Vue 重新渲染…

8868体育助力意甲尤文图斯俱乐部 帮助球队签订新合同

意甲的尤文图斯俱乐部是8868合作体育球队之一,根据意大利媒体的消息,尤文图斯已经决定和费德里科-基耶萨续约,这名球员已经开始思考他的将来了。 费德里科-基耶萨今年26岁,他和尤文图斯的合约到2025年6月30号就结束了。他知道很多…

Jmeter 基于Docker 实现分布式测试

基于Docker 实现分布式测试 制作Jmeter基础镜像制作工作节点镜像启动工作节点启动控制节点遇到的问题 使用Docker 部署Jmeter非常方便,可以省略软件的安装以及配置,比如jdk、jmeter。需要部署多个工作节点可以节省时间。 控制节点(Master-主节…

yo!这里是单例模式相关介绍

目录 前言 特殊类设计 只能在堆上创建对象的类 1.方法一(构造函数下手) 2.方法二(析构函数下手) 只能在栈上创建对象的类 单例模式 饿汉模式实现 懒汉模式实现 后记 前言 在面向找工作学习c的过程中,除了基本…

隐写术:隐藏信息的秘密艺术

一、引言 隐写术,这个充满神秘色彩的词汇,似乎让我们回到了间谍和秘密特工的时代。但实际上,隐写术在现代社会仍然有着广泛的应用,例如在军事、情报、商业等领域。本文将带你走进隐写术的世界,探索它的原理、应用和防…

大模型增量预训练新技巧:解决灾难性遗忘

大家好,目前不少开源模型在通用领域具有不错的效果,但由于缺乏领域数据,往往在一些垂直领域中表现不理想,这时就需要增量预训练和微调等方法来提高模型的领域能力。 但在领域数据增量预训练或微调时,很容易出现灾难性…

git 如何修改仓库地址

问题背景:组内更换大部门之后,代码仓的地址也迁移了,所以原来的git仓库地址失效了。 虽然重新建一个新的文件夹,再把每个项目都git clone一遍也可以。但是有点繁琐,而且有的项目本地还有已经开发一半的代码&#xff0c…

python 包管理工具 pip 怎么用?

什么是 pip pip 是 Python 事实上的标准软件包安装程序,已成为全球 Python 开发人员不可或缺的工具。它的易用性、全面的软件包管理能力以及在维护软件包兼容性方面的作用,使其成为任何 Python 项目的宝贵资产。 为什么 pip 对 Python 开发人员至关重要…

Redis面试题40

人工智能如何影响医疗保健行业? 答:人工智能对医疗保健行业产生了深远的影响,为医疗保健提供了更高效、准确和个性化的服务。以下是一些人工智能在医疗保健领域的应用示例: 疾病诊断:人工智能可以利用机器学习和深度学…

遗失的源代码之回归之路的探索与实践

背景 最近比较突然被安排接手一个项目,该项目的情况如下 原生和RN结合的混合开发模式组件化开发,有很多基础组件以及业务组件但是在梳理项目依赖时发现了个别组件源码不全的情况,于是写了个cli用于对比两个版本产物文件,生成差异结果以便于快速进行源码找回恢复。 结果如下…

【lesson9】高并发内存池Page Cache层释放内存的实现

文章目录 Page Cache层释放内存的流程Page Cache层释放内存的实现 Page Cache层释放内存的流程 如果central cache释放回一个span,则依次寻找span的前后page id的没有在使用的空闲span,看是否可以合并,如果合并继续向前寻找。这样就可以将切…

05、全文检索 -- Solr -- Solr 全文检索之图形界面的文档管理(文档的添加、删除,如何通过关键字等参数查询文档)

目录 Solr 全文检索之文档管理添加文档使用 JSON 添加文档:使用 XML 添加文档: 删除文档使用 JSON 删除文档:使用 XML 删除文档: 查询文档查询文档的详细参数fq(Filter Query):过滤sort:排序sta…

[Linux 进程(六)] 写时拷贝 - 进程终止

文章目录 1、写时拷贝2、进程终止2.1 进程退出场景2.1.1 退出码2.1.2 错误码错误码 vs 退出码2.1.3 代码异常终止引入 2.2 进程常见退出方法2.2.1 exit函数2.2.2 _exit函数 本片我们主要来讲进程控制,讲之前我们先把写时拷贝理清,然后再开始讲进程控制。…

简单的程序员简历模板

以下是一个简单的程序员简历模板,您可以根据自己的经验和需求进行调整: 姓名:张三联系方式:XXX-XXXX-XXXX电子邮箱:zhangsanexample.com个人网址:(如果适用,比如GitHub、个人博客等&…

[office] 在Excel2010中设定某些单元格数据不参与排序的方法介绍 #其他#知识分享#笔记

在Excel2010中设定某些单元格数据不参与排序的方法介绍 在Excel中排序,相信大家都会了,直接将一组数据按照从小到大或者从大到小进行排序,但是,现在要求我们规定其中几组数据不进行排序,只排序其余的部分。又该如何操作…

ruoyi(若依)(el-menu也可参考)菜单栏过长显示省略号才显示气泡

一、背景 若依前后端分离的版本,新版本中优化了菜单名称过长悬停显示标题,但是是悬浮所有长度大于5的标题。可以查看提交记录:https://gitee.com/y_project/RuoYi-Cloud/commit/99932d91c0144da9f34f5bb05683cc0b86303217 但是我希望是只悬浮…