MySQL 事务篇

news2024/11/24 10:56:45

事务有哪些特性?

原子性:

一个事务中的所有操作,必须全部执行。要么全部完成要么就不完成。中间如果出现错误,就要回滚到初始状态。

持久性:

事务处理结束后,对数据的修改就是永久的,就是系统故障也不会改变

一致性:

指事务操作前后,数据保持完整约束性。

隔离性:

数据库具有多个并发事务同时对数据进行读写和修改的能力。隔离性可以防止多个并发事务在执行时由于交叉执行而导致的数据不一致。

为了实现以上四个特性。数据库实现了一下机制:

持久性通过redo log  (重做日志)来实现

原子性通过undo log (回滚日志)实现

隔离性通过MVCC多并发控制或者锁来实现

一致性通过 持久性+原子性+隔离性 实现

 首先讲隔离性:

并发事务会引发的问题:

脏读:一个事务读到了另个事务未提交的数据

不可重复度:在一个事务内多次读取同一个数据,发现两次读取的数据不一致

幻读:在一个事务中多次查询某个符合查询条件的记录数量,发现两次查询的记录数量不一致。

SQL提供四种隔离级别来规避以上四种现象,隔离级别越高,性能效率越低

读未提交:可以读取到另一个事务未提交的数据 (可能会发生脏读,不可重复读,幻读)

读提交:可以读取到另一个事务已提交的数据(可能会发生不可重复读,幻读)

可重复读:从一个事务开启,他读取到的数据从始至终就是一致的 (可能会发生幻读)

Innodb 引擎的默认隔离级别是可重复读。但是他很大程度上避免了幻读。采用了以下两种方式

1. 针对快照读(普通select语句)

它采用了MVCC多并发控制,因为事务在执行过程中看到的数据,一直和事务启动时看到的数据是一致的。所以即使其他事务中途插入一条数据,也不会被该事务看到。

2. 针对当前读(select ...for update)

间隙锁+记录锁来实现。当执行语句时,会加上记录锁和间隙锁。如果有其他事务在在间隙锁和记录锁内插入一条数据,就会被阻塞。无法插入数据,就很好的避免了幻读现象。

 下面讲讲ReadView在MVCC里如何工作的

先了解ReadView的两个重要知识

1. ReadView 的四个字段

2. 聚簇索引记录中两个跟事务有关的两个隐藏列

 1. m_ids 当前数据库中活跃事务id列表,活跃事务指的是启动了但是还未提交的数据

 2. min_trx_id 创建ReadView时,当前数据库活跃且未提交的事务中最小事务的事务id

 3. max_trx_id 创建ReadView当前数据库中应该给下一个事务的id值,当前数据库最大id值+1

  4. creator_trx_id 指创建该事务时的id值

聚簇索引记录中的两个隐藏列

 trx_id 

当一个事务对某条聚簇索引记录进行改动时,就会把该事物的 id 隐藏在trx_id 中

 roll_pointer

每次对聚簇索引记录进行改动时,就会把旧版本的记录写入到 undo 日志中,然后roll_pointer 是一个指针,指向每一个旧版本记录,可以通过它找到修改前的记录。

创建ReadView之后,可以将记录中的trx_id 分为三种情况:

 一个事务访问记录时,除了自己更新的记录总是可见之外,还有以下几种情况:

1. 如果记录的 trx_id 值小于min_trx_id ,说明这个版本的记录是在创建ReadView前已经提交的十五生成的。所以该版本记录对该事务可见。

 2. 如果记录的trx_id 值大于max_trx_id ,说明这个版本的记录是在创建ReadView后的事务提交生成的,所以该版本记录对该事务不可见。

 3. 如果该记录的trx_id在min_trx_id和max_trx_id之间,需要判断trx_id是否在m_ids 列表中

         1)在m_ids 列表中,表示生成该记录的事务仍然活跃着,所以该记录不可见

         2)不在m_ids 列表中,表示该事务已经提交,该记录可见。

这种通过版本链(通过undo日志来实现,使用roll_pointer 来实现指向旧版本的记录)的形式来控制多并发事务访问同一个记录的行为叫做MVCC(多版本并发控制)

可重复读和读提交都是通过ReadView来实现,可重复读是从始至终每个事务就有一个ReadView

而读提交在每次读取数据时都会创建一个新的ReadView。

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

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

相关文章

使用CSS来实现爱心信封的效果

想必在520大家都和女朋友过了完美的节日,可是博主还没有女朋友鹅鹅鹅,还是写一个爱心信封来维护自己弱小的心灵吧鹅鹅鹅 个人名片: 😊作者简介:一名大一在校生,web前端开发专业 🤡 个人主页&a…

用友助力中核集团建设财务共享中心新华发电分中心,实现业财融合

企业在进行决策时需要大量的财务信息作为依据,财务共享中心的建设可以帮助企业将财务和业务分离后重新有序融合,使得决策数据更有价值,也帮助企业的管理和决策更加贴合实际。 新华水力发电有限公司(简称“新华发电”)…

IPEmotion采集J1939协议信号

一 背景 由于商用车相对于乘用车更注重实用性,功能也较单一,且具有产量小的特点,因此在设计开发时需要进行约束,以更大程度实现软硬件的复用和成本的降低,在此需求下J1939协议便随之产生了。 J1939协议是由美国汽车工…

使用Fiddler工具抓取微信小程序中的图片,使用Fiddler工具抓取电脑访问的链接图片

背景: 开发微信小程序的时候,是不是经常看到别人的小程序中某个图标或者图片好看想用,下面小编给大家分享一下怎么获得微信小程序中的图片。 一.什么是Fiddler 官网:https://www.telerik.com/ 下载地址1:Fiddler4_官方…

✨概率论期末速成(三套卷)——试卷①✨

✨博主:命运之光 ✨专栏:概率论期末速成(三套卷) 目录 ✨一、填空题(在下列各题填写正确答案,不填、填错,该题无分,每小题3分,共36分)✨二、计算题(本大题6小…

《2023金融科技十大趋势报告》重磅发布:安全成为金融科技发展生命线

5月23日,由腾讯研究院、腾讯云、腾讯安全、微信支付、腾讯广告、腾讯优图实验室、招商银行、中信建投证券联合编制的《2023金融科技十大趋势报告》(以下简称《报告》)正式发布。《报告》从创新篇、智能篇、普惠篇、安全篇、融合篇五个方面总结…

虎牙直播在微服务改造的实践总结2

博主介绍:✌全网粉丝4W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程,博主也曾写过优秀论文,查重率极低,在这方面…

常用的Jmeter参数化技巧总结,总有一个你不知道

说起接口测试,相信大家在工作中用的最多的还是Jmeter。 JMeter是一个100%的纯Java桌面应用,由Apache组织的开放源代码项目,它是功能和性能测试的工具。具有高可扩展性、支持Web(HTTP/HTTPS)、SOAP、FTP、JAVA 等多种协议。 在做…

安全狗云原生安全能力亮相2023年智能汽车信息安全大会

5月19日,2023年智能汽车信息安全大会在上海顺利落幕。作为国内云原生安全领导厂商,安全狗受邀出席此次活动。 据悉,在领导致辞后,来自汽车行业以及网络安全行业的专家们就智能汽车涉及到的数据安全、安全合规、网络安全等话题展开…

Prompt Engineering | 迭代式优化和完善prompt

😄 在尝试编写第一个 prompt时,满足上一博客说过的两个原则:清晰明确,并且给系统足够的时间思考。然后您可以运行它并查看结果。如果第一次效果不好,那么迭代的过程就是找出为什么指令不够清晰或为什么没有给算法足够的…

数据结构初阶——堆

目录 一,堆的概念 二,创建堆 2.1堆的结构 2.2堆的初始化 2.3堆的数据插入 2.4堆的数据的删除 注意点: 2.5 堆顶元素 2.6堆的长度 2.7堆的销毁 思维导图: 一,堆的概念 堆是什么?对于一个对于电脑储存结…

爆肝整理,接口测试到接口自动化测试小技巧,你的测试之路不再简单...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 Python自动化测试&…

Vue3 详细教程

文章目录 一、API 风格1.1 选项式 API1.2 组合式 API 二、Vue 指令2.1 {{}} 文本插值2.2 v-html 标签元素2.3 v-on 绑定事件2.4 v-show 隐藏元素2.5 v-if 消除元素2.6 v-bind 属性渲染2.7 v-for 列表渲染2.8 v-model 数据双向绑定 三、组件3.1 组件组合3.2 Props 组件交互3.3 自…

Linux:命令date、ntp查看和修改(校准)时间和地区。

Linux:命令date、ntp查看和修改(校准)时间和地区。 date -d 不仅可以1还可以加其他数字,表达后多久,-表达前多久: 备注:中国所在的时区是东八区 单独使用date时,会出现一串内容&…

Linux驱动入门——基础概念

文章目录 Linux内核简介Unix的历史Linux简介操作系统和内核简介单内核与微内核设计之比较小结 设备驱动简介驱动程序的角色划分内核设备和模块的分类安全问题版权条款 Linux驱动开发概述驱动程序概述设备驱动程序的作用设备驱动的分类Linux操作系统与驱动的关系Linux驱动开发编…

小程序容器技术在构建超级App的技术价值

今年来,随着软件及开源技术的发展,软件应用架构的概念也随之流行起来。它提供了一种组织和设计软件系统的有效方法,具有许多优势和好处: 模块化和可维护性:软件应用架构将系统拆分为模块化的组件,每个组件…

linux 部署jenkins

安装Jenkins 使用wget 命令下载Jenkins 先安装wget yum install wget ,如果已经安装过了,忽略直接到下一步; 若你的java环境为11~17,可以执行:wget http://mirrors.jenkins.io/war-stable/latest/jenkins.war 若你的java环境为8&#xff0…

Python实战基础10-正则表达式

1、正则表达式 在处理字符串时,经常会有查找符合某些复杂规则的字符串需求。正则表达式就算用于描述这些规则的工具。换句话说,正则表达式就是记录文本规则的代码。 1.1 行定位符 行定位符就是用来描述字符串的边界,“A”表示行的开始&…

2023新星导师活动【electron+vue3】方向,开营知识点提纲(2)

文章目录 前言一、vue是什么?二、vue的优势1.依托数据渲染2.新人的边界2.选项式和组合式 总结 前言 上篇文章主要讲解了electron、nodejs的相关概念。本篇文章将主要介绍vue3,以及vue3如何与electron协作完成桌面端功能。 同上篇文章一样,这…

系统集成项目管理工程师 下午 真题 及考点(2019年上半年)

文章目录 一:第10章 项目质量管理,规划质量管理输出,质量成本法(一致性成本【预防、评价】 和 非一致性成本【内部失败、外部失败】),七种工具二:第8章 项目进度管理,总浮动时间&…