Mysql事务隔离级别是怎么实现的?

Mysql事务

  • 事务概念
  • 事务特性
  • 事务并发
  • 事务隔离级别
  • MVCC多版本并发控制

事务概念

小钢同学今天发工资了,赶紧打开招商银行app看看工资到账了没有,查看余额300
在这里插入图片描述
嗯,今天心情好,给对象转账50大元买lv包包去,最后的结果肯定是小钢同学的钱包余额是250,小钢同学对象钱包余额+50
转账的整个过程在mysql中涉及到一系列动作,下面仔细来看看

在这里插入图片描述
现在来考虑一下这个问题,如果在第6步的时候更新数据库失败了会发生什么情况?

  • 小钢同学的钱包余额为250元
  • 小钢同学对象的钱包余额为0元
    转账的50元不翼而飞了?小钢百思不得其解,为此还和对象吵了一架,明明钱给转过去了呀,对象还说没收到?
    还好小钢是个技术高超的程序员大佬,趁着和对象冷战期去研究了一下数据库事务,发现事务可以完美解决这个问题,于是赶紧连夜给平台提了bug
    数据库中的「事务(Transaction)」:让多个数据库操作要么全部成功,要么全部失败,不允许出现中间态数据,例如上面情况,如果第6步更新数据库失败,事务会负责回滚,小钢转出去的50元会被继续增加回去,小钢余额还是拥有300元

事务特性

首先得注意的是并不是所有的mysql存储引擎都支持事务,常见的Innodb是支持事务的,而MyISAM则不支持事物,所以mysql默认的存储引擎是Innodb
事务有以下四大特性:

  • 原子性:所有操作要么全部成功,要么全部失败,不允许出现中间态

比如文章开头所说的小钢转账问题,如果中间任何一个步骤出现问题,事务需要回滚到最初始状态,就好比没发生这件事情一样

  • 一致性:数据库从一个一致性的状态转移到另一个一致性的状态,满足完整性约束

小钢给对象转账之前,小钢余额300元,对象余额0元,总和300元;
小钢给对象转账50元以后,事务提交完成,小钢余额250,对象余额50元,总和300元
转账前和转账后总和不变,这就是一致性

  • 持久性:事务一旦提交,数据的改变就是持久性的,就算磁盘宕机恢复也还是修改后的数据

事物提交后,小钢余额250,对象余额50元,这个数据是一个持久性的状态,除非再次修改

  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致

事务并发

mysql事务核心在于隔离性,本文重点讲解一下隔离性
首先还是谈一下事务并发会带来什么问题?

  • 脏读:如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象

事务A和事务B同时开始执行,事务A先读取小钢余额是300元,事务B紧接着将小钢余额更新为250元,此时事务B没有提交事务,事务A在这个时候再次查询小钢余额发现变成了250元,此时事务B提交事务失败回滚了,小钢余额变为了初始300元,事务A却还认为小钢余额为250元,此时事务A读到的250元数据就是脏数据
在这里插入图片描述

  • 不可重复读:在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象

事务A和事务B同时开始执行,事务A读取小钢余额300元,然后先去干其他事情了,事务B读取小钢余额300元并更新为250元,然后成功提交事务,此时事务A再次读取小钢余额为250元,在同一次事务执行中读取数据不一致,这就是不可重复读问题
在这里插入图片描述

  • 幻读:在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象

事务A和事务B同时执行,事务A负责将所有工资等于100元的员工工资加薪到200元,比如此时有5个员工需要加薪,事务A完成了更新操作,但是还未提交事务,事务B此时新增一个新员工的数据工资为100元,然后提交事务,然后这个时候事务A再次查询工资等于100元的员工,发现变成了6个员工,就好像发生了幻觉一样,这就是幻读
在这里插入图片描述

事务隔离级别

事务四种隔离级别

  • 未提交读:一个事务未提交时,他所做的变更可以被其他事务看到

会发生脏读、不可重复读、幻读

  • 已提交读:一个事务提交以后,他所做的变更才能被其他事务看到

会发生不可重复读、幻读

  • 可重复读:事务开启以后,直到提交事务这个时间段,所能看到的数据就是事务开启时的数据,其他事务变更记录看不到

会发生幻读

  • 可串行化:对事务加锁,如果发生了读写冲突,会等拿到锁的事务提交以后才会继续执行其他事务

可以解决所有事务并发问题

那么可能会有一个问题,为什么可串行化可以解决所有事务并发问题,为什么数据库不用可串行化隔离级别?
原因:可串行化需要加锁,太慢了,对于优秀的开源系统怎能容忍这种效率问题
mysql默认的隔离级别是可重复读,虽然有幻读的风险,但是概率并不大

MVCC多版本并发控制

mysql的可重复读就是巧妙的借用了MVCC多版本并发控制的思想

  • 针对快照读普通查询(select * from table_name):通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好的避免幻读问题
  • 针对当前读(select … for update 等语句):通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select … for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题
    快照读是如何使用MVCC多版本控制思想的呢?原理是什么?
    待更新…

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

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

相关文章

Vmware虚拟机问题解决方案 运行虚拟机系统蓝屏 运行虚拟机时报错VT-x

1. 运行虚拟机系统蓝屏 可能的原因有两个: 1). 虚拟机所在磁盘的空间不足 ; -------> 清理磁盘空间 。 2). 操作系统版本高, 需要适配新版本的Vmware ; ------> 卸载Vmware15版本, 安装Vmware16版本 。 2. 卸载Vmware步骤 1). 卸载已经安装的VMware 弹出确认框, 点击…

【LabVIEW FPGA入门】LabVIEW FPGA 实现SPI通信协议

该实现由两个组件组成:在 LabVIEW FPGA 中实现的 SPI 协议以及用于从主机 PC 或实时控制器与 FPGA 进行通信的 LabVIEW 主机接口。该架构允许从单个主机程序控制多个 SPI 端口,同时仍然允许定制 FPGA VI 以进行其他数据采集和处理。该实现不使用任何DMA&…

【期末不挂科-C++考前速过系列P4】大二C++实验作业-继承和派生(3道代码题)【解析,注释】

前言 大家好吖,欢迎来到 YY 滴C考前速过系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的《…

解密威胁:.kat6.l6st6r 勒索病毒的威胁与恢复

导言: 在当今数字化时代,勒索病毒已经成为网络安全威胁中的一大巨头。其中,.kat6.l6st6r 勒索病毒以其狡猾的传播方式和高级的加密算法备受关注。本文将深入介绍.kat6.l6st6r 勒索病毒的特点、应对措施以及如何预防此类威胁。如果您在面对被…

流量预测中文文献阅读(郭郭专用)

目录 基于流量预测的超密集网络资源分配策略研究_2023_高雪亮_内蒙古大学(1)内容总结(2)流量预测部分1、数据集2、结果对其中的一个网格的CDR进行预测RMSE和R2近邻数据和周期数据对RMSE的影响 (3)基于流量预…

ElasticSearch概述+SpringBoot 集成 ES

ES概述 开源的、高扩展的、分布式全文检索引擎【站内搜索】 解决问题 1.搜索词是一个整体时,不能拆分(mysql整体连续) 2.效率会低,不会用到索引(mysql索引失效) 解决方式 进行数据的存储(只存储…

无缝打通易快报与电子签章系统,合同管理也能如此简单!

客户介绍: 某股份有限公司是一家专注于高端装备制造和智能制造解决方案的高新技术企业。该公司的产品和服务广泛应用于汽车、航空、高铁、智能家居、电子电器、新能源等领域,为全球客户提供了高效、精准、可靠的制造解决方案。 添加图片注释&#xff0c…

​iOS 应用上架指南:资料填写及提交审核

目录 摘要 引言 打开appuploader工具,第二步:打开appuploader工具 第五步:交付应用程序,在iTunes Connect中查看应用程序 总结 摘要 本文提供了iOS新站上架资料填写及提交审核的详细指南,包括创建应用、资料填写-…

【JAVA语言-第12话】API中的工具类 之 Date,DateFormat,SimpleDateFormat,Calendar类的详细解析

目录 日期和时间 1.1 Date类 1.1.1 概述 1.1.2 常用方法 1.1.3 案例 1.2 DateFormat类 1.2.1 概述 1.2.2 常用方法 1.3 SimpleDateFormat类 1.3.1 概述 1.3.2 构造方法 1.3.3 模式字符 1.3.4 日期转字符串 1.3.5 字符串转日期 1.4 Calendar类 1.4.1 概述 1…

Raspbian安装摄像头

Raspbian安装摄像头 1. 源由2. 摄像头2.1 选型2.2 系统2.3 安装 3. 配置&命令3.1 命令3.2 配置 4. 测试4.1 拍照4.1.1 libcamera-jpeg4.1.2 libcamera-still 4.2 视频流4.2.1 RTSP流4.2.2 TCP流 5. 参考资料 1. 源由 家里闲置两块树莓派,打算做个WiFi视频流RTS…

【JaveWeb教程】(21) MySQL数据库开发之多表设计:一对多、一对一、多对多的表关系 详细代码示例讲解

目录 2. 多表设计2.1 一对多2.1.1 表设计2.1.2 外键约束 2.2 一对一2.3 多对多2.4 案例 2. 多表设计 关于单表的操作(单表的设计、单表的增删改查)我们就已经学习完了。接下来我们就要来学习多表的操作,首先来学习多表的设计。 项目开发中,在进行数据库…

MISGAN

MISGAN:通过生成对抗网络从不完整数据中学习 代码、论文、会议发表: ICLR 2019 摘要: 生成对抗网络(GAN)已被证明提供了一种对复杂分布进行建模的有效方法,并在各种具有挑战性的任务上取得了令人印象深刻的结果。然而,典型的 GAN 需要在训练期间充分观察数据。在本文中…

matlab中any()函数用法

一、帮助文档中的介绍 B any(A) 沿着大小不等于 1 的数组 A 的第一维测试所有元素为非零数字还是逻辑值 1 (true)。实际上,any 是逻辑 OR 运算符的原生扩展。 二、解读 分两步走: ①确定维度;②确定运算规则 以下面二维数组为例 >>…

FEB(acwing)

文章目录 FEB题目描述输入格式输出格式数据范围输入样例1:输出样例1:输入样例2:输出样例2:输入样例3:输出样例3:代码题解情况1:xxxxxx:0,1,2,…&a…

AI教我学编程之C#变量及实例演示

前言 在AI教我学编程之AI自刀 这篇文章中,我们知道了变量的基础类型,那么变量在C#中有什么作用呢?我们一起来看看吧! 目录 重点先知 变量 变量类型 实例演示 变量声明 实例演示 提出疑问 初始化变量 自动初始化 多变量声明 实…

【深度学习目标检测】十六、基于深度学习的麦穗头系统-含GUI和源码(python,yolov8)

全球麦穗检测是植物表型分析领域的一个挑战,主要目标是检测图像中的小麦麦穗。这种检测在农业领域具有重要意义,可以帮助农民评估作物的健康状况和成熟度。然而,由于小麦麦穗在视觉上具有挑战性,准确检测它们是一项艰巨的任务。 全…

使用emu8086实现——顺序程序设计

一、实验目的 1. 掌握顺序程序设计方法 2. 掌握汇编语言编程设计方法。 二、实验内容 1.用查表的方法将一位十六进制数转换成它相应的ASCII码。 代码及注释: Data segment ;定义数据段Tab db 30h,31h,32h,33h,34h,35,36h,37h,38h,39h ;定义一个Tab的字节型…

js逆向第20例:猿人学第19题乌拉乌拉乌拉

文章目录 一、前言二、定位关键参数1、JA3/TLS指纹怎么查看2、加密值长度对比三、代码实现四、参考文献一、前言 任务十九:抓取这5页的数字,计算加和并提交结果 此题在以前用python写逆向代码是存在缺陷的,直到今年有个大佬开源了curl_cffi库,并且支持 JA3/TLS 和 http2 指…

npmvue详解

1、npm是node.js的一个软件依赖包管理工具 2、当前目录下面一般会有一个package.json文件 3、npm install 会去按照package.json文件中的依赖去下载依赖包 默认会下载到当前目录中的node_modules文件夹下,-g会进行全局安装 4、package.json文件中有两种依赖关系 …

H7303 无电感,线性恒流,低压差,大电流,车灯/台灯 9V 12V 24V 30V

线性恒流芯片是一种用于控制电流的电子元件,通常用于驱动LED等器件。它的工作原理是通过维持输出电流的恒定来保持被驱动器件的亮度或功率稳定。 具体来说,线性恒流芯片会监测输出电流并调整电压以保持恒定的电流流过被驱动器件。以下是其基本工作步骤&…