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 弹出确认框, 点击…

四旋翼无人机入门基础知识

电池 聚合物锂电池单体电芯的额定电压都为3.7V 电池的保存电压:单个电芯3.8V 电池的满电电压:单个电芯4.2V 串联:容量不变,电压相加,并联:电压不变,容量相加 S:串联,P&…

基于博弈树的开源五子棋AI教程[7 多线程搜索]

文章目录 引子定义实现结果尾记 引子 多线程加快搜索速度这一认知是经受住实践考验的。博弈树搜索的并行搜索方式有很多种,例如叶子并行,根并行,树分裂等算法。笔者给出一种实现起来比较简单的根并行算法。 在是实现时需要注意两点&#xff…

【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的《…

2_单列模式_懒汉式单例模式

二.懒汉式单例模式 (1) 饿汉式单例模式概念 为了解决饿汉式单例可能带来的内存浪费问题,于是就出现了懒汉式单例的写法。懒汉式单例模式的特点是,单例对象要在被使用时才会初始化。 (2) 代码实现 实现代码方式1:简单的饿汉式单例 /*** 优…

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

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

基于java的 aws s3文件上传

aws s3 文件上传代码 首先,确保您已经在AWS上创建了一个S3存储桶,并拥有相应的访问密钥和密钥ID。这些凭据将用于在Java代码中进行身份验证。 接下来,需要在Java项目中添加AWS SDK的依赖。可以使用Maven或Gradle进行依赖管理。以下是一个Ma…

Kubernetes实战(十七)-设置kubernetes允许master调度pod

1 taint节点调度策略 NoSchedule: 一定不能被调度PreferNoSchedule: 尽量不要调度NoExecute: 不仅不会调度, 还会驱逐Node上已有的Pod 2 查看节点调度 $ kubectl describe node|grep -E "Name:|Taints:" Name: ops-master-1 Taints: no…

Kotlin 委托

Kotlin 委托 委托模式 是一种 通过 对象组合 实现代码重用 的设计模式, 对象处理请求时 将其 委托给 其他对象(委托)处理。 Kotlin 委托 分为: 类的委托属性的委托 一、类的委托 委托 Delegate 是实现继承的一种替代方式。达到了…

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

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

ElasticSearch概述+SpringBoot 集成 ES

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

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

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

剑指offer面试题4 替换空格

考察点 考察数据结构字符串知识点 不同于c语言,java语言有字符和字符串俩种数据类型,char类型(字符类型)是基本数据类型,string类型(字符串类型)是引用类型 java语言中的字符采用unicode编码在内存中用2个字节存储,因此一个英文…

js中console.log()的使用方法

console.log()是JavaScript中的一个内置函数,用于在控制台输出信息;该方法对于开发过程进行测试很有帮助。可以输出之前在其中定义的任何类型的变量,或者只输出需要显示给用户的任何消息。 语法是: console。log(&am…

HCIA-Datacom题库(自己整理分类的)_12_其他网络协议多选【12道题】

1.下面哪些是路由协议? BGP IPX OSPF IP 2.网络管理员使用Ping来测试网络的连通性,在这个过程中下面哪个协议可能会被使用到? UDP ICMP ARP TCP 解析:UDP、TCP是四层协议。 3.以下哪些是指网络通信? 使用即时通信软件(如:QQ、微信)与好友…

​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…

软件工程宠物管理系统详细计划示例

1.引言 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…