MySQL篇:事务
1.四大特性
首先,事务的四大特性:ACID(原子性,一致性,隔离性,持久性)
在InnoDB引擎中,是怎么来保证这四个特性的呢?
- 持久性是通过 redo log (重做日志)来保证的;
- 原子性是通过 undo log(回滚日志) 来保证的;
- 隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
- 一致性则是通过持久性+原子性+隔离性来保证;
然后的话,我们这次重点讲一下事务的隔离性。
2.并发事务会带来哪些问题?
MySQL是允许多个客户端连接的,这样就会导致MySQL同时处理多个事务的情况。
那么,就会出现以下三个问题:脏读,不可重复读,幻读
脏读:A事务读到了B事务还未提交且修改过的数据。
比如A第一次读某人卡里的余额为100,然后A把这个余额修改为200但是不提交事务,此时B正好也来读取余额得到200,然后A把这个修改进行了回滚(100),那么B读到的就是脏数据了。
不可重复读:A事务前后两次读的数据不一致
比如A第一次读某人卡里余额100,然后B来把这个余额进行了修改为200并且提交了事务,那么A再一次读取卡里余额,就变成200了,前后两次读取的数据不一致。
幻读:A事务多次查询某个条件的记录数量,前后两次查询得到的记录数量不一致。
比如A第一次读取余额大于100的用户有5个,然后此时B来插入了一条数据(余额为150)并提交了事务,然后A第二次读取余额大于100的用户变成了6个,前后两次读取的记录数量不一致。
3.事务的隔离级别
3.1.四种隔离级别
那么针对上面的三个问题,SQL标准提出了四种隔离级别来规避这些现象,分别是:
- 读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;
- 读提交(read committed),RC指一个事务提交之后,它做的变更才能被其他事务看到;
- 可重复读(repeatable read),RR指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;
- 串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;
对于上面四种隔离级别,每个级别还存在的问题有如下:
所以,要解决脏读现象,就要升级到「读已提交」以上的隔离级别;要解决不可重复读现象,就要升级到「可重复读」的隔离级别,要解决幻读现象不建议将隔离级别升级到「串行化」。
这是因为,MySQL的InnoDB引擎在可重复读的级别下,很大程度的规避了幻读现象(不是完全规避),我们在后面重点讲可重复读这一块。
3.3.可重复读(RR)是如何工作的?
可重复读级别是在启动事务之后,第一次读取数据时,生成一个Read View,以后的本事务中每次普通查询语句都会依据这个Read View来获取数据。
3.4 读已提交(RC)是如何工作的?
读已提交级别是在启动事务后,每次读取数据时,都会生成一个新的Read View。
4.可重复读怎么很大程度解决幻读现象?
4.1针对普通select语句(快照读)
是通过MVCC的方式解决了幻读,因为RR级别下,开始事务后,在执行第一个查询语句,就会创建一个Read View,后续的查询语句,都是在这个Read View的基础上来得到数据的。所以即使中途有其他事务插入了新记录,那么也是查不出来这个新数据的。
4.2针对select..for update语句(当前读)
MySQL 里除了普通查询是快照读,其他都是当前读,比如 update、insert、delete,这些语句执行前都会查询最新版本的数据,然后再做进一步的操作。
那么如果在当前读的情况下没有加锁,那就会出现幻读现象,如下:
所以,InnoDB引擎为了解决 “在可重复读隔离级别下使用当前读” 而导致的幻读问题,就引出了间隙锁。
间隙锁,顾名思义是在一个范围之间加锁,那么在这个范围之内,其他事务就无法进行增删改操作了。
假设,表中有一个范围 id 为(3,5)间隙锁,那么其他事务就无法插入 id = 4 这条记录了,这样就有效的防止幻读现象的发生。
然后我们举个具体的例子:
事务A执行了这条sql语句之后,就会对表中的记录加上id范围为(2,+∞] 的next-key lock,
(这个next-key lock是间隙锁+记录锁的组合,锁的是左开右闭的区间。) 然后事务B在执行sql语句的时候,被事务A加的next-key lock给阻塞了,那么事务B就会生成一个意向锁,等待事务A提交之后,再进行插入操作,这样就避免了因为B事务插入新数据而导致A事务出现幻读的情况。
5.可重复读级别下幻读被完全解决了吗?
通过上面两种情况所做的处理,可以说是很大程度上避免了幻读现象,但是还没有完全解决幻读现象。
例如:
5.1.可重复读级别下幻读情况1
- A开启事务,并且查询id=5的数据,不存在。
- B开启事务,插入一条id=5的数据,并提交事务。
- A直接进行update操作,修改id=5的数据,此时如果再次执行查询id=5的操作,那么就会查询到id=5的数据了!
这种情况就是在A开启事务后,通过普通的sql语句生成了一个Read View,之后事务B向表中插入新数据并提交。紧接着事务A对id=5的数据进行update操作,我们前面提到要进行update操作,就必须获取到当前读,那么这样的话,就会导致事务A再次查询的时候,查询的就是最新的数据,就会出现幻读了。
5.2.可重复读级别下幻读情况2
- A开启事务,然后执行:select * from t_test where id > 100 (快照读)得到3条记录。
- B开启事务,往里面插入了一个 id=200 的记录并提交事务。
- A继续执行:select * from t_test where id > 100 for update (当前读)得到4条记录。
这种情况就属于,A开启事务后没有马上执行select...for update操作,导致第一次读取数据时没有加next-key lock,从而导致B事务插入了新数据。
6.总结
- 事务的四大特性:ACID(原子性,一致性,隔离性,持久性)
- 持久性<-RedoLog , 一致性<-UndoLog ,隔离性<-MVCC || 锁 ,持久性<-前三个一起保证
- 并发事务带来的危害:脏读,可重复读,幻读
- 四种隔离级别:读未提交,读已提交(RC),可重复读(RR),串行化
- 可重复读解决可重复读隔离级别(默认隔离级),提出的避免幻读的方案:
- 针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读。(生成快照读,后续的读都是基于第一次的快照读来获取数据)
- 针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。
备注:图片摘抄自小林coding,如有侵权,联系删除。
相关文章:

MySQL篇:事务
1.四大特性 首先,事务的四大特性:ACID(原子性,一致性,隔离性,持久性) 在InnoDB引擎中,是怎么来保证这四个特性的呢? 持久性是通过 redo log (重做日志&…...

处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题
文章目录 1、问题描述2、详情动图3、解决思路4、解决方案5、效果展示 1、问题描述 在 electron 中使用 el-image 时,开启了懒加载后,发现只有当窗口滚动后,图片才会显示,即便图片已经处于窗口的可视区域。当拖动窗口使其尺寸变大…...
Electron 进程间通信
文章目录 渲染进程到主进程(单向)渲染进程到主进程(双向)主进程到渲染进程 (单向,可模拟双向) 渲染进程到主进程(单向) send (render 发送)on &a…...
0基础学python-8:if,while,for
目录 前言: 一、选择循环结构 1.if条件语句 2.while 3.for循环 4.break语句 5.continue语句 前言: if、while 和 for 是 Python 中常用的控制流结构,它们分别用于条件判断、循环执行和迭代遍历。这些关键字帮助程序根据条件和数据进行选…...

低空经济持续发热,无人机培训考证就业市场及前景剖析
随着科技的不断进步和社会需求的日益增长,低空经济已成为全球及我国经济增长的新引擎。作为低空经济的重要组成部分,无人机技术因其广泛的应用领域和显著的经济效益,受到了社会各界的广泛关注。为满足市场对无人机人才的需求,无人…...

[IDEA插件] JarEditor 编辑jar包(直接新增、修改、删除jar包内的class文件)
文章目录 1. 安装插件 JarEditor2. 在IDEA中添加外部JAR包3. JarEditor 使用介绍 之前我们需要修改jar内文件的时候需要解压jar包,反编译class,新建java源文件,修改代码,再编译成class,替换jar包内的class文件。 现在…...
JavaScript系列:JS实现复制粘贴文字以及图片
文章目录 一. 基于 Clipboard API 复制文字(推荐)基本概念主要方法使用限制实际应用示例 二、基于 document.execCommand(copy)缺陷实际应用示例说明 三、复制图片功能四、封装 一. 基于 Clipboard API 复制文字(推荐) 基本概念 …...

音视频入门基础:H.264专题(14)——计算视频帧率的公式
一、引言 通过FFmpeg命令可以获取到H.264裸流文件的视频帧率: 在vlc中也可以获取到视频帧率(vlc底层也使用了FFmpeg进行解码): 所以FFmpeg和vlc是怎样获取到H.264编码的视频的帧率呢?它们其实是通过SPS中的VUI parame…...

LeetCode-返回链表倒数第K个节点、链表的回文结构,相交链表
一、返回链表倒数第k个节点 . - 力扣(LeetCode) 本体思路参展寻找中间节点的方法,寻找中间节点是定义快慢指针,快指针每次走两步,慢指针每次走一步,当快指针为空或者快指针的下一个节点是空时,…...

Linux 网络配置与连接
一、网络配置 1.1 ifconfig 网卡配置查询 ifconfig #查看所有启动的网络接口信息 ifconfig 指定的网卡 #查看指定网络接口信息 1.2 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #ens33网络配置文…...
5. 基于Embedding实现超越elasticsearch高级搜索
Embedding介绍 Embedding是向量的意思,向量可以理解为平面坐标中的一个坐标点(x,y),在编程领域,一个二维向量就是一个大小为float类型的数组。也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中,向量通常用于表示数据的特征。 向量…...

探索Docker网络配置和管理
目录 1.docker网络类型有几种? 2.自定义网络管理 1.查看网络信息 2.查看网络的详细信息 3.创建四种网络容器 3.none类型 1.验证 4.host类型 1.验证 5. bridge类型 1.验证 2.设备对 6. container类型 1.验证 2.详解 7.科普下docker的网络名称空间 “…...

【数据库】 mysql数据库管理工具 Navicat平替工具 免费开源数据库管理工具
一、数据库分享 本次分享针对mysql的数据库管理工具 全部为开源免费工具 1、beekeeper-studio 可以从github或者官方下载 1.1、官方网址 官方地址:https://www.beekeeperstudio.io/ 1.2、Github 网址 Github地址:https://github.com/beekeeper-studio…...

信息系统项目管理师(高项)—学习笔记二
第一章 以下是上一篇(信息系统项目管理师(高项)—学习笔记)的续写,因为是之前记录的,这一篇还是细致到每一个小节的内容,有些过于复杂了,后续会简化~ 1.3 现代化创新发展 党的十九…...
【Vue】 style中的scoped
一、什么是scoped,为什么要用 在vue文件中的style标签上,有一个特殊的属性:scoped。 当一个style标签拥有scoped属性时,它的CSS样式就只能作用于当前的组件,通过该属性,可以使得组件之间的样式不互相污染…...

maven项目容器化运行之2-maven中使用docker插件调用远程docker构建服务并在1Panel中运行
一.背景 公司主机管理小组的同事期望我们开发的maven项目能够在1Panel管理的docker容器部署。上一篇写了先开放1Panel中docker镜像构建能力maven项目容器化运行之1-基于1Panel软件将docker镜像构建能力分享给局域网-CSDN博客。这一篇就是演示maven工程的镜像构建、容器运行、运…...

电影购票小程序论文(设计)开题报告
一、课题的背景和意义 随着互联网技术的不断发展,人们对于购票的需求也越来越高。传统的购票方式存在着排队时间长、购票流程繁琐等问题,而网上购票则能够有效地解决这些问题。电影购票小程序是网上购票的一种新型应用,它能够让用户随时随地…...

IP风险画像 金融行业的安全盾牌
在当今数字化时代,金融行业面临着前所未有的安全挑战。随着在线交易和数字银行业务的迅猛发展,欺诈和网络攻击的威胁也在不断增加。金融机构需要高效、可靠的安全解决方案来保护客户的资产和个人信息,防止各种形式的欺诈行为。 IP风险画像是…...
探索老年综合评估实训室的功能与价值
一、引言 随着人口老龄化的加剧,老年健康问题日益受到关注。老年综合评估实训室作为专门为老年人健康服务而设立的场所,具有独特的功能和重要的价值。 二、老年综合评估实训室的功能 (一)健康评估功能 1、身体功能评估 通过专业设…...

视频剪辑软件如何选?FCPX和PR更适合新手呢
随着抖音、快手等短视频平台的迅速兴起,短视频数量急剧增加。想要发布一款简单、高质量的短视频,运用剪辑软件至关重要。目前比较流行的有Adobe家的Premiere,以及Final Cut Pro X,经常有用户在二者间,不知如何选择&…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放
简介 前面两期文章我们介绍了I2S的读取和写入,一个是通过INMP441麦克风模块采集音频,一个是通过PCM5102A模块播放音频,那如果我们将两者结合起来,将麦克风采集到的音频通过PCM5102A播放,是不是就可以做一个扩音器了呢…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...