事务的隔离级别
事务由哪些特性
-
原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样
-
一致性(Consistency):是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
-
隔离性(Isolation):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的。
-
持久性(Durability):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
-
InnoDB 引擎通过什么技术来保证事务的这四个特性的呢?
-
持久性是通过 redo log (重做日志)来保证的;
-
原子性是通过 undo log(回滚日志) 来保证的;
-
隔离性是通过 MVCC(多版本并发控制) 或锁机制来保证的;
-
一致性则是通过持久性+原子性+隔离性来保证;
-
并行事务会引发什么
-
在同时处理多个事务的时候,就可能出现脏读(dirty read)、不可重复读(non-repeatable read)、幻读(phantom read)的问题。
-
脏读
-
如果一个事务「读到」了另一个「未提交事务修改过的数据」,就意味着发生了「脏读」现象。
-
如果在上面这种情况事务 A 发生了回滚,那么事务 B 刚才得到的数据就是过期的数据,这种现象就被称为脏读。
-
-
不可重复读
-
在一个事务内多次读取同一个数据,如果出现前后两次读到的数据不一样的情况,就意味着发生了「不可重复读」现象。
-
在这过程中如果事务 B 更新了这条数据,并提交了事务,那么当事务 A 再次读取该数据时,就会发现前后两次读到的数据是不一致的,这种现象就被称为不可重复读。
-
-
幻读
-
在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。
-
事务的隔离级别由哪些
-
脏读、不可重复读、幻读」的现象严重性排序
-
使用四种隔离级别来规避这些现象,隔离级别越高,性能效率就越低
-
读未提交(read uncommitted),指一个事务还没提交时,它做的变更就能被其他事务看到;
-
读提交(read committed),指一个事务提交之后,它做的变更才能被其他事务看到;
-
可重复读(repeatable read),指一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,MySQL InnoDB 引擎的默认隔离级别;只能看见启动事务时的数据
-
串行化(serializable );会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行;
-
不同的隔离级别,并发事务时可能发生的现象也会不同
-
MySQL 虽然支持 4 种隔离级别,但是与SQL 标准中规定的各级隔离级别允许发生的现象却有些出入
-
-
如何设置事务的隔离级别
-
修改事务的隔离级别:SET [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL level;
-
level: {REPEATABLE READ | READ COMMITTED | READ UNCOMMITTED | SERIALIZABLE }
-
-
在 SET 关键字后可以放置 GLOBAL 关键字、 SESSION 关键字或者什么都不放,这样会对不同范围的事务产生不同的影响
-
使用 GLOBAL 关键字(在全局范围影响)
-
使用 SESSION 关键字(在会话范围影响)
-
上述两个关键字都不用(只对执行语句后的下一个事务产生影响)
-
-
-
MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」,但是它很大程度上避免幻读现象(并不是完全解决了)解决的方案有两种:
-
针对快照读(普通 select 语句),是通过 MVCC 方式解决了幻读,因为可重复读隔离级别下,事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的,即使中途有其他事务插入了一条数据,是查询不出来这条数据的,所以就很好了避免幻读问题。
-
针对当前读(select ... for update 等语句),是通过 next-key lock(记录锁+间隙锁)方式解决了幻读,因为当执行 select ... for update 语句的时候,会加上 next-key lock,如果有其他事务在 next-key lock 锁范围内插入了一条记录,那么这个插入语句就会被阻塞,无法成功插入,所以就很好了避免幻读问题。
-
-
四种隔离级别具体是如何实现的呢?
-
对于「读未提交」隔离级别的事务来说,因为可以读到未提交事务修改的数据,所以直接读取最新的数据就好了;
-
对于「串行化」隔离级别的事务来说,通过加读写锁的方式来避免并行访问;
-
对于「读提交」和「可重复读」隔离级别的事务来说,它们是通过 Read View 来实现的,它们的区别在于创建 Read View 的时机不同,可以把 Read View 理解成一个数据快照,就像相机拍照那样,定格某一时刻的风景。「读提交」隔离级别是在「每个语句执行前」都会重新生成一个 Read View,而「可重复读」隔离级别是「启动事务时」生成一个 Read View,然后整个事务期间都在用这个 Read View。
-
-
执行「开始事务」命令,并不意味着启动了事务。在 MySQL 有两种开启事务的命令,分别是:
-
begin/start transaction 命令
-
事务的启动时机:执行了第一条 select 语句,才是事务真正启动的时机
-
-
start transaction with consistent snapshot 命令
-
事务的启动时机:执行了 start transaction with consistent snapshot 命令,就会马上启动事务
-
-
Read View 在 MVCC 里是如何工作的?
-
假如另一个事务已经修改了记录但是尚未提交, 是不能直接读取最新版本的记录的,核心问题就是:需要判断一下版本链中的哪个版本是当前事务可见的,设计 InnoDB 的人提出了一个 ReadView 的概念。
-
Read View 结果及其作用
-
m_ids :指的是在创建 Read View 时,当前数据库中「活跃事务」的事务 id 列表,注意是一个列表,“活跃事务”指的就是,启动了但还没提交的事务。
-
min_trx_id :指的是在创建 Read View 时,当前数据库中「活跃事务」中事务 id 最小的事务,也就是 m_ids 的最小值。
-
max_trx_id :这个并不是 m_ids 的最大值,而是创建 Read View 时当前数据库中应该给下一个事务的 id 值,也就是全局事务中最大的事务 id 值 + 1;
-
creator_trx_id :指的是创建该 Read View 的事务的事务 id。
-
-
聚簇索引记录中的两个隐藏列
-
trx_id,当一个事务对某条聚簇索引记录进行改动时,就会把该事务的事务 id 记录在 trx_id 隐藏列里;
-
roll_pointer,每次对某条聚簇索引记录进行改动时,都会把旧版本的记录写入到 undo 日志中,然后这个隐藏列是个指针,指向每一个旧版本记录,于是就可以通过它找到修改前的记录。
-
-
一个事务去访问记录的时候,除了自己的更新记录总是可见之外,还有这几种情况(可见就是可以读取到数据)
-
如果记录的 trx_id 值小于 Read View 中的
min_trx_id值,表示这个版本的记录是在创建 Read View 前已经提交的事务生成的,所以该版本的记录对当前事务可见。 -
如果记录的 trx_id 值大于等于 Read View 中的
max_trx_id值,表示这个版本的记录是在创建 Read View 后才启动的事务生成的,所以该版本的记录对当前事务不可见。 -
如果记录的 trx_id 值在 Read View 的
min_trx_id和max_trx_id之间,需要判断 trx_id 是否在 m_ids 列表中:-
如果记录的 trx_id 在
m_ids列表中,表示生成该版本记录的活跃事务依然活跃着(还没提交事务),所以该版本的记录对当前事务不可见。 -
如果记录的 trx_id 不在
m_ids列表中,表示生成该版本记录的活跃事务已经被提交,所以该版本的记录对当前事务可见。
-
-
-
通过「版本链」来控制并发事务访问同一个记录时的行为就叫 MVCC(多版本并发控制)
-
对该记录每次更新后,都会将旧值放到一条 undo日志 中,就算是该记录的一个旧版本,随着更新次数的增多,所有的版本都会被 roll_pointer 属性连接成一个链表,我们把这个链表称之为 版本链 ,版本链的头节点就是当前记录最新的值。另外,每个版本中还包含生成该版本时对应的事务id ,这个信息很重要
-
-
MVCC整体操作的流程
-
获取事务自己的版本号,也就是事务id
-
获取到ReadView
-
查询得到数据,然后与ReadView中的事务版本进行比较
-
如果不符合ReadView的规则,就需要从Undo log中获取历史快照
-
最后放回符合规则的数据
-
可重复读是如何工作的?
-
可重复读隔离级别是启动事务时生成一个 Read View,然后整个事务期间都在用这个 Read View。
读提交是如何工作的?
-
读提交隔离级别是在每次读取数据时,都会生成一个新的 Read View。
-
事务期间的多次读取同一条数据,前后两次读的数据可能会出现不一致,因为可能这期间另外一个事务修改了该记录,并提交了事务。
相关文章:
事务的隔离级别
事务由哪些特性 原子性(Atomicity):一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态…...
性能优化角度
1.启动角度 2.数据缓存角度比如历史信息联想 3.内存释放角度 4.配合并要求后端进行接口API整合 5.耗时较多需求,根据业务情况进行线程异步处理 6.通过开源的loop监控sdk日志埋点,可监控线程对应环路的休眠/唤醒时间间隔,优化卡顿 7.尽量避免离…...
Vue3 使用ElementUI 显示异常
element提供的样例不能正常显示,需要进行配置 1.npm install element-plus --save 2.main.js // main.ts import { createApp } from vue import ElementPlus from element-plus //全局引入 import element-plus/dist/index.css import App from ./App.vue const app = crea…...
从0开始复习python~
//,int() , abs(), divmod() ,float() ,complex() ,pow(), ** , bool() ,or , and , len() , range() , str() , 其中 for i in xxx: else: xxxxx; 有点意思... # 地板除,向下取整 print(-3//2) # 只保留整数部分 print(int(3.72)) # 绝对值 print…...
从零开始搭建后端信息管理系统(新手小白比如)
如果你是新手小白,首先我们要进行一些准备工作,安装一些基础软件, 备注一下:这里安装的vue环境的后台管理系统,不同的后台管理系统,需要安装不同的插件 准备工作: 安装 Visual Studio Code …...
CentOS 7详细介绍。
CentOS 7是CentOS项目发布的开源类服务器操作系统,自2014年7月7日正式发布以来,它已成为企业级Linux发行版本的佼佼者。CentOS 7不仅继承了其前身的优势,还在性能、安全性和易用性方面进行了显著的提升。以下是对CentOS 7的详细介绍。 一、C…...
JavaScript:nodeType节点/文档碎片对象模型-DcoumentFragment
1伪数组转真数组的方式: 伪数组转真数组的多种方式: 1 Array.from 2 Array.prototype.slice.call(list) 3 [...list] const list1 document.getElementsByTagName(p)//检查list1 是不是 Array数组 的实例 --> false --伪数组console.log(list1 instanceof …...
JDK安全剖析之安全处理入门
0.前言 Java 安全包括大量 API、工具以及常用安全算法、机制和协议的实现。Java 安全 API 涵盖了广泛的领域,包括加密、公钥基础设施、安全通信、身份验证和访问控制。Java 安全技术为开发人员提供了编写应用程序的全面安全框架,还为用户或管理员提供了…...
探索RAG:加强问答能力的新技术
文章目录 1. RAG是什么?1.1 技术简介1.2 挑战与解决方案1.3 RAG技术构成1.4 应用与前景 2. RAG架构详解2.1 典型的RAG应用有两个主要组件2.2 从原始数据到答案的完整流程 3. RAG在实际应用中的案例 1. RAG是什么? 1.1 技术简介 Retrieval Augmented Ge…...
赛氪网|2024中国翻译协会年会“AI科技时代竞赛与就业”分论坛
在2024年中国翻译协会年会期间,赛氪网与中西部翻译协会共同体多边合作平台共同承办,于3月30日下午在长沙成功举办了“AI科技时代竞赛与就业分论坛”。该论坛汇聚了众多翻译界、科技界和教育界的专家学者,共同探讨科技、实践、就业与竞赛人才培…...
【Jmeter+Influxdb+Grafana性能监控平台安装与部署】
JmeterInfluxdbGrafana性能监控平台安装与部署 前言Influxdb安装与连接Jmeternfluxdb下载(winodws)Grafana安装与配置 前言 我们在性能测试过程中,在需要较大并发时,为了尽量避免使用GUI界面来节省资源,通常使用命令行…...
[挖坟]如何安装Shizuku和LSPatch并安装模块(不需要Root,非Magisk)
2023年12月13日,LSPatch 停止维护 2024年1月8日,LSPosed 停止维护 2024年1月8日,ZygiskNext 停止维护 2024年1月9日,KernelSU 停止维护 这里使用 ColorOS 14 演示,其他品牌手机类似 安装 Shizuku 官网: https://shiz…...
rhce复习3
DNS DNS(Domain Name System)是互联网上的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网。 DNS系统使用的是网络的查询,那么自然需要有监听的port。DNS使用的是53端口&#x…...
CentOS 7 升级 5.4 内核
MatrixOne 推荐部署使用的操作系统为 Debian 11、Ubuntu 20.04、CentOS 9 等 Kernel 内核版本高于 5.0 的操作系统。随着 CentOS 7 的支持周期接近尾声,社区不少小伙伴都在讨论用以替换的 Linux 操作系统,经过问卷调查,我们发现小伙伴们的操作…...
photoshop2022增效工具ICOFormat.8bi(PS ico插件)
先退出关闭ps 1、下载插件压缩包,解压出ICOFormat.8bi文件,有两个版本ICOFormat64.8bi对应32位版、ICOFormat64.8bi对应64位版本。 2、把解压后的ICOFormat64.8bi文件覆盖到Photoshop安装目录: C:\Program Files\Adobe\Adobe Photoshop 2022\Required…...
LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】
LeetCode-146. LRU 缓存【设计 哈希表 链表 双向链表】 题目描述:解题思路一:双向链表,函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。一张图:知识点__slots__ 解题思路二:0解题思路三:0 题目描述&am…...
如何在Python中import其他文件的实时值
在A.py中加入变量TEST_A0后,可以通过不同的方式在B.py中调用该变量。下面是对两种方式的介绍: 使用from A import TEST_A调用TEST_A: 这种方式是直接将A.py中的TEST_A变量导入到B.py中,可以直接使用TEST_A变量,而不需…...
NumPy进阶(二)
2. NumPy进阶(二) 2.1 Numpy数组操作 2.1.1 添加元素 numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中 注意: 插入的维度要保证所有数组的长度是相同的如果没有指定轴,数组会被扁平处理 ndarr…...
计算机专业,不擅长打代码,考研该怎么选择?
考研其实和你的代码能力关系不大 所以在选学校以前可以看看有哪些学校复试是要求上机撸代码的,可能会要求比较严 初试真的不用担心代码问题,我也是基本零编程能力就开始备考考研的... 本人双非科班出身备考408成功上岸,在这里也想给想考40…...
SQL Server的详细使用教程
安装SQL Server 下载SQL Server 安装程序运行安装程序,选择"基本"安装类型在"实例配置"页面,将实例命名为"SQLServerTest"在"服务器配置"页面,选择"NT服务\系统"作为启动账户完成其他设置,然后安装SQL Server 连接SQL Serve…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
golang循环变量捕获问题
在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下: 问题背景 看这个代码片段: fo…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
使用LangGraph和LangSmith构建多智能体人工智能系统
现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
统计学(第8版)——统计抽样学习笔记(考试用)
一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征(均值、比率、总量)控制抽样误差与非抽样误差 解决的核心问题 在成本约束下,用少量样本准确推断总体特征量化估计结果的可靠性(置…...
