当前位置: 首页 > news >正文

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

  1. A开启事务,并且查询id=5的数据,不存在。
  2. B开启事务,插入一条id=5的数据,并提交事务。
  3. A直接进行update操作,修改id=5的数据,此时如果再次执行查询id=5的操作,那么就会查询到id=5的数据了!

        这种情况就是在A开启事务后,通过普通的sql语句生成了一个Read View,之后事务B向表中插入新数据并提交。紧接着事务A对id=5的数据进行update操作,我们前面提到要进行update操作,就必须获取到当前读,那么这样的话,就会导致事务A再次查询的时候,查询的就是最新的数据,就会出现幻读了。

5.2.可重复读级别下幻读情况2

  1. A开启事务,然后执行:select * from t_test where id > 100 (快照读)得到3条记录。
  2. B开启事务,往里面插入了一个 id=200 的记录并提交事务。
  3. A继续执行:select * from t_test where id > 100 for update (当前读)得到4条记录。

        这种情况就属于,A开启事务后没有马上执行select...for update操作,导致第一次读取数据时没有加next-key lock,从而导致B事务插入了新数据。

6.总结

  1. 事务的四大特性:ACID(原子性,一致性,隔离性,持久性)
  2. 持久性<-RedoLog , 一致性<-UndoLog ,隔离性<-MVCC || 锁 ,持久性<-前三个一起保证
  3. 并发事务带来的危害:脏读,可重复读,幻读
  4. 四种隔离级别:读未提交,读已提交(RC),可重复读(RR),串行化
  5. 可重复读解决可重复读隔离级别(默认隔离级),提出的避免幻读的方案:
  • 针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读。(生成快照读,后续的读都是基于第一次的快照读来获取数据)
  • 针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读。

备注:图片摘抄自小林coding,如有侵权,联系删除。

相关文章:

MySQL篇:事务

1.四大特性 首先&#xff0c;事务的四大特性&#xff1a;ACID&#xff08;原子性&#xff0c;一致性&#xff0c;隔离性&#xff0c;持久性&#xff09; 在InnoDB引擎中&#xff0c;是怎么来保证这四个特性的呢&#xff1f; 持久性是通过 redo log &#xff08;重做日志&…...

处理在 electron 中使用开启了懒加载的 el-image 后,窗口最大化或窗口尺寸变化后图片无法显示的问题

文章目录 1、问题描述2、详情动图3、解决思路4、解决方案5、效果展示 1、问题描述 在 electron 中使用 el-image 时&#xff0c;开启了懒加载后&#xff0c;发现只有当窗口滚动后&#xff0c;图片才会显示&#xff0c;即便图片已经处于窗口的可视区域。当拖动窗口使其尺寸变大…...

Electron 进程间通信

文章目录 渲染进程到主进程&#xff08;单向&#xff09;渲染进程到主进程&#xff08;双向&#xff09;主进程到渲染进程 &#xff08;单向&#xff0c;可模拟双向&#xff09; 渲染进程到主进程&#xff08;单向&#xff09; send &#xff08;render 发送&#xff09;on &a…...

0基础学python-8:if,while,for

目录 前言&#xff1a; 一、选择循环结构 1.if条件语句 2.while 3.for循环 4.break语句 5.continue语句 前言&#xff1a; if、while 和 for 是 Python 中常用的控制流结构&#xff0c;它们分别用于条件判断、循环执行和迭代遍历。这些关键字帮助程序根据条件和数据进行选…...

低空经济持续发热,无人机培训考证就业市场及前景剖析

随着科技的不断进步和社会需求的日益增长&#xff0c;低空经济已成为全球及我国经济增长的新引擎。作为低空经济的重要组成部分&#xff0c;无人机技术因其广泛的应用领域和显著的经济效益&#xff0c;受到了社会各界的广泛关注。为满足市场对无人机人才的需求&#xff0c;无人…...

[IDEA插件] JarEditor 编辑jar包(直接新增、修改、删除jar包内的class文件)

文章目录 1. 安装插件 JarEditor2. 在IDEA中添加外部JAR包3. JarEditor 使用介绍 之前我们需要修改jar内文件的时候需要解压jar包&#xff0c;反编译class&#xff0c;新建java源文件&#xff0c;修改代码&#xff0c;再编译成class&#xff0c;替换jar包内的class文件。 现在…...

JavaScript系列:JS实现复制粘贴文字以及图片

文章目录 一. 基于 Clipboard API 复制文字&#xff08;推荐&#xff09;基本概念主要方法使用限制实际应用示例 二、基于 document.execCommand(copy)缺陷实际应用示例说明 三、复制图片功能四、封装 一. 基于 Clipboard API 复制文字&#xff08;推荐&#xff09; 基本概念 …...

音视频入门基础:H.264专题(14)——计算视频帧率的公式

一、引言 通过FFmpeg命令可以获取到H.264裸流文件的视频帧率&#xff1a; 在vlc中也可以获取到视频帧率&#xff08;vlc底层也使用了FFmpeg进行解码&#xff09;&#xff1a; 所以FFmpeg和vlc是怎样获取到H.264编码的视频的帧率呢&#xff1f;它们其实是通过SPS中的VUI parame…...

LeetCode-返回链表倒数第K个节点、链表的回文结构,相交链表

一、返回链表倒数第k个节点 . - 力扣&#xff08;LeetCode&#xff09; 本体思路参展寻找中间节点的方法&#xff0c;寻找中间节点是定义快慢指针&#xff0c;快指针每次走两步&#xff0c;慢指针每次走一步&#xff0c;当快指针为空或者快指针的下一个节点是空时&#xff0c;…...

Linux 网络配置与连接

一、网络配置 1.1 ifconfig 网卡配置查询 ifconfig #查看所有启动的网络接口信息 ifconfig 指定的网卡 #查看指定网络接口信息 1.2 修改网络配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 #ens33网络配置文…...

5. 基于Embedding实现超越elasticsearch高级搜索

Embedding介绍 Embedding是向量的意思&#xff0c;向量可以理解为平面坐标中的一个坐标点(x,y),在编程领域&#xff0c;一个二维向量就是一个大小为float类型的数组。也可以用三维坐标系中的向量表示一个空间中的点。在机器学习中&#xff0c;向量通常用于表示数据的特征。 向量…...

探索Docker网络配置和管理

目录 1.docker网络类型有几种&#xff1f; 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、官方网址 官方地址&#xff1a;https://www.beekeeperstudio.io/ 1.2、Github 网址 Github地址&#xff1a;https://github.com/beekeeper-studio…...

信息系统项目管理师(高项)—学习笔记二

第一章 以下是上一篇&#xff08;信息系统项目管理师&#xff08;高项&#xff09;—学习笔记&#xff09;的续写&#xff0c;因为是之前记录的&#xff0c;这一篇还是细致到每一个小节的内容&#xff0c;有些过于复杂了&#xff0c;后续会简化~ 1.3 现代化创新发展 党的十九…...

【Vue】 style中的scoped

一、什么是scoped&#xff0c;为什么要用 在vue文件中的style标签上&#xff0c;有一个特殊的属性&#xff1a;scoped。 当一个style标签拥有scoped属性时&#xff0c;它的CSS样式就只能作用于当前的组件&#xff0c;通过该属性&#xff0c;可以使得组件之间的样式不互相污染…...

maven项目容器化运行之2-maven中使用docker插件调用远程docker构建服务并在1Panel中运行

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

电影购票小程序论文(设计)开题报告

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

IP风险画像 金融行业的安全盾牌

在当今数字化时代&#xff0c;金融行业面临着前所未有的安全挑战。随着在线交易和数字银行业务的迅猛发展&#xff0c;欺诈和网络攻击的威胁也在不断增加。金融机构需要高效、可靠的安全解决方案来保护客户的资产和个人信息&#xff0c;防止各种形式的欺诈行为。 IP风险画像是…...

探索老年综合评估实训室的功能与价值

一、引言 随着人口老龄化的加剧&#xff0c;老年健康问题日益受到关注。老年综合评估实训室作为专门为老年人健康服务而设立的场所&#xff0c;具有独特的功能和重要的价值。 二、老年综合评估实训室的功能 &#xff08;一&#xff09;健康评估功能 1、身体功能评估 通过专业设…...

视频剪辑软件如何选?FCPX和PR更适合新手呢

随着抖音、快手等短视频平台的迅速兴起&#xff0c;短视频数量急剧增加。想要发布一款简单、高质量的短视频&#xff0c;运用剪辑软件至关重要。目前比较流行的有Adobe家的Premiere&#xff0c;以及Final Cut Pro X&#xff0c;经常有用户在二者间&#xff0c;不知如何选择&…...

解决第三方模块ts声明文件编译错误问题

最近小卷在用vite脚手架学习vue组件开发&#xff0c;使用的语言框架是typescript。在搭建vitepress在线文档服务时&#xff0c;用到了vitepress-demo-preview模块来展示vue组件示例和源代码。 发现import相关依赖时&#xff0c;会有这样的编译错误&#xff1a; 也就是没找到第…...

数据结构小测试:排序算法

目录 1、请简述数据结构八大排序算法的思路。 2、常用排序算法手写 冒泡排序&#xff1a; 选择排序&#xff1a; 快速排序&#xff1a; 归并排序&#xff1a; 堆排序&#xff1a; 3、额外再加一个二分查找吧 1、请简述数据结构八大排序算法的思路。 冒泡排序&#xff…...

电脑远程开关机

1. 远程开机 参考&#xff1a;https://post.smzdm.com/p/664774/ 1.1 Wake On LAN - 局域网唤醒&#xff08;需要主板支持&#xff0c;一般都支持&#xff09; 要使用远程唤醒&#xff0c;有几种方式&#xff1a;使用类似向日葵开机棒&#xff08;很贵&#xff09;、公网ip&…...

# Redis 入门到精通(四)-- linux 环境安装 redis

Redis 入门到精通&#xff08;四&#xff09;-- linux 环境安装 redis 一、linux 环境安装 redis – 基于 Linux 安装 redis 1、基于 Center 0S7 或者 unbunt-18.04 安装 Redis 1&#xff09;下载安装包wget http://download.redis.io/releases/redis-?.?.?.tar.gz 如&…...

SQL进阶技巧:如何按照固定尺寸(固定区间)对数据进行打分类标签?

目录 0 问题引入 应用案例1 应用案例2 小结 0 问题引入 在日常数据分析中,经常会遇到数据产品经理或数据分析师提出这样的需求,比如按照某一给定的区间或数据范围对数据进行分类标签,而遇到这样的问题,好多同学感觉SQL做起来有点困难或无从下手,其实面对这样的问题笔者…...

数学建模·灰色关联度

灰色关联分析 基本原理 灰色关联分析可以确定一个系统中哪些因素是主要因素&#xff0c;哪些是次要因素&#xff1b; 灰色关联分析也可以用于综合评价&#xff0c;但是由于数据预处理的方式不同&#xff0c;导致结果 有较大出入 &#xff0c;故一般不采用 具体步骤 数据预处理…...

EMQX开源版安装

一、EMQX是什么 EMQX 是一款开源的大规模分布式 MQTT 消息服务器&#xff0c;功能丰富&#xff0c;专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条&#xff0c;单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息&#xff0c;同时保证毫秒…...

R语言进行集成学习算法:随机森林

# 10.4 集成学习及随机森林 # 导入car数据集 car <- read.table("data/car.data",sep ",") # 对变量重命名 colnames(car) <- c("buy","main","doors","capacity","lug_boot","safety"…...

虚拟机的状态更新

文章目录 虚拟机的更新一、检查虚拟机的配置1.已连接状态2. 保证镜像源挂载 二、进行更新三、其余事项 虚拟机的更新 虚拟机的更新是确保系统软件包和库的更新&#xff0c;以获得最新的修复和改进&#xff1b;如果长期没有打开单机或者集群&#xff0c;可以考虑先进行一次更新…...

基于hive数据库的泰坦尼克号幸存者数据分析

进入 ./beeline -u jdbc:hive2://node2:10000 -n root -p 查询 SHOW TABLES; 删除 DROP TABLE IF EXISTS tidanic; 上传数据 hdfs dfs -put train.csv /user/hive/warehouse/mytrain.db/tidanic 《泰坦尼克号幸存者数据分析》 1、原始数据介绍 泰坦尼克号是当时世界上…...