如何理解数据库的几种事务隔离级别?以及如何理解脏读、不可重复度、幻读?
在多用户并发访问数据库时,数据库系统需要通过事务隔离级别来控制不同事务之间的相互影响。不同的隔离级别可以避免或减少在并发环境下可能出现的数据不一致或冲突。常见的事务隔离级别有四种:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和可串行化(Serializable)。与之对应,数据库在并发环境下可能会出现三种常见的问题:脏读(Dirty Read)、不可重复读(Non-Repeatable Read)和幻读(Phantom Read)。
下面,我们先介绍几种常见的事务隔离级别,然后再说明“脏读”、“不可重复读”、“幻读”这几种并发读问题是如何产生的以及在哪些隔离级别下会被避免。
一、数据库事务隔离级别
1. 读未提交(Read Uncommitted)
- 概念:允许一个事务读到另一个事务尚未提交的数据。
- 可能导致的问题:脏读、不可重复读、幻读都有可能发生。
- 特点:这是最低的隔离级别,几乎没有任何并发控制。
场景举例
- 事务A正在更新某条记录,更新尚未提交;事务B此时读到事务A尚未提交的数据。若事务A随后回滚,那么B读到的数据就成为了无效的数据,这就是脏读。
2. 读已提交(Read Committed)
- 概念:只能读到其他事务已经提交的数据,即禁止读到未提交的数据。
- 可能导致的问题:不可重复读、幻读仍可能发生。
- 特点:很多数据库(如 Oracle、默认的 SQL Server 等)采用该隔离级别,能避免脏读,但无法解决不可重复读或幻读。
场景举例
- 在事务B中,先执行一次查询得到某行记录为“值X”。随后,事务A对这条记录进行了更新并提交。再回到事务B中执行同样的查询,发现该记录已变成“值Y”,与先前读到的不一致,这就是不可重复读。
3. 可重复读(Repeatable Read)
- 概念:在一个事务中多次读取同一条记录时,结果始终保持一致,除非该事务自己修改数据。
- 可能导致的问题:幻读依然可能存在。
- 特点:MySQL InnoDB 存储引擎在默认情况下使用该隔离级别,可以避免不可重复读的问题,但对幻读需要额外处理(MySQL 在可重复读隔离级别下通过间隙锁(Gap Lock)等机制,通常也能避免幻读。但在理论上,该级别仍可能出现幻读的情况)。
场景举例
- 在事务B中,多次读取同一条记录,读到的值不会改变(如果没有被本事务修改),避免了不可重复读。
- 但如果在事务B进行“range查询”时,事务A插入了新的记录,可能导致事务B前后两次范围查询的结果条数不一样,出现幻读(如果没有进一步的锁机制来阻止)。
4. 可串行化(Serializable)
- 概念:最高的隔离级别,相当于对同一时间执行的事务进行排队串行化处理,几乎可以避免所有并发问题,包括脏读、不可重复读和幻读。
- 特点:并发性能最差,通常只有在对数据一致性要求极高、并发量相对较低的场景中使用。
场景举例
- 数据库会对相关的表、记录或范围上加锁,确保所有并发事务都像是串行执行的一样,从而避免脏读、不可重复读、幻读。不过,这种强隔离也付出了降低并发性能的代价。
二、脏读、不可重复读和幻读
1. 脏读(Dirty Read)
- 含义:一个事务读到了另一个事务还未提交(甚至还可能回滚)的数据。
- 发生场景:隔离级别为“读未提交”时(Read Uncommitted)。
- 示例:
- 事务A:将某个记录的值从10更新为20,但是暂未提交。
- 事务B:读取该记录时发现值为20。
- 如果事务A随后回滚,撤销更新,值又变回10,那么B就读到了一个从未真正“生效”过的数据,这就是脏读。
2. 不可重复读(Non-Repeatable Read)
- 含义:同一个事务中,多次读取同一条记录却得到不同的结果。
- 发生场景:在“读已提交”级别下会出现不可重复读;“可重复读”隔离级别能够避免不可重复读。
- 示例:
- 事务B(“读已提交”级别)第一次查询记录R,得到的值为10。
- 事务A更新记录R为20并提交。
- 事务B再次查询相同的记录R,却变成了20。前后两次读取到的数据不同,就产生了不可重复读。
3. 幻读(Phantom Read)
- 含义:同一个事务中,多次执行“范围查询”或“聚合操作”时,因其他事务插入或删除了符合范围条件的新数据,导致返回的数据行数或统计结果不一致。
- 发生场景:在“读已提交”和“可重复读”级别下,都有机会发生幻读。只有在“可串行化”级别(或者 MySQL InnoDB 结合间隙锁实现的 MVCC 机制)才能彻底避免幻读。
- 示例:
- 事务B第一次执行:
SELECT * FROM student WHERE score > 60;
得到 10 条记录。 - 事务A向
student
表中插入了一条score=70
的新记录并提交。 - 事务B第二次执行相同查询:
SELECT * FROM student WHERE score > 60;
发现有 11 条记录,与第一次查询的结果不一致。 - 这种新记录“突然出现”的现象称为幻读。
- 事务B第一次执行:
三、隔离级别与并发问题对照表
隔离级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
读未提交 (Read Uncommitted) | 可能 | 可能 | 可能 |
读已提交 (Read Committed) | 避免 | 可能 | 可能 |
可重复读 (Repeatable Read) | 避免 | 避免 | 可能(理论上) / 实际上 MySQL 可避免 |
可串行化 (Serializable) | 避免 | 避免 | 避免 |
- 在实际应用中,读已提交 和 可重复读 是最常见的两个隔离级别:
- Oracle、SQL Server 的默认级别通常是 “读已提交”。
- MySQL InnoDB 的默认级别是 “可重复读”,并在实现中通过间隙锁、Next-Key Lock等机制,实际上也能避免幻读。
四、总结
-
读未提交(Read Uncommitted)
- 容易出现脏读、不可重复读、幻读等问题,隔离级别最低。
-
读已提交(Read Committed)
- 解决了脏读问题,但仍有不可重复读和幻读。
-
可重复读(Repeatable Read)
- 进一步解决不可重复读问题,在理论上仍有幻读可能,但 MySQL InnoDB 实际上也通过机制避免了大多数幻读场景。
-
可串行化(Serializable)
- 隔离级别最高,可以避免所有并发问题,但是会严重影响并发性能。
- 脏读:读取到其他事务未提交的数据。
- 不可重复读:同一个事务中多次读取同一条记录,读取结果不一致。
- 幻读:同一个事务中多次执行范围查询,结果集不一致(新增或删除的“幻影”记录出现或消失)。
选择适合的隔离级别需要在性能与数据一致性之间做权衡。一般而言,“读已提交”或“可重复读”是常见的折中选择。在一些对数据一致性要求极高的场景下,可能会使用“可串行化”级别,但必须承受其带来的性能代价。
相关文章:
如何理解数据库的几种事务隔离级别?以及如何理解脏读、不可重复度、幻读?
在多用户并发访问数据库时,数据库系统需要通过事务隔离级别来控制不同事务之间的相互影响。不同的隔离级别可以避免或减少在并发环境下可能出现的数据不一致或冲突。常见的事务隔离级别有四种:读未提交(Read Uncommitted)、读已提…...
计算机网络基础简答题资料(对口高考)
1、什么是计算机网络?计算机网络的功能有哪些? 答案:计算机网络,是指将分布在不同地理位置、具有独立功能的多台计算机及其外围设备,通过通信设备和通信线路连接起来,在网络操作系统、网络管理软件及网络通…...
在docker容器中运行vllm部署deepseek-r1大模型
# 在本地部署python环境 cd /app/ python -m venv myenv # 激活虚拟环境 source /app/myenv/activate # 要撤销激活一个虚拟环境,请输入: deactivate# 进入虚拟环境安装modelscope pip install modelscope# 下载大模型(7B为例) modelscope do…...
HeidiSQL如何替换代码中的某些信息
1.SQL代码里的某些内容,比如2025年这个日期信息,我想替换成2024年的,按照:“搜索”---“替换文本”然后按照图片上的步骤来就可以了,特别是在sql代码有几百行甚至几千行的时候使用 2.SQL代码的表格对象中的数据如何一次性把某个内…...
Wireshark 插件开发实战指南
Wireshark 插件开发实战指南 环境搭建流程图 #mermaid-svg-XpNibno7BIyfzNn5 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-XpNibno7BIyfzNn5 .error-icon{fill:#552222;}#mermaid-svg-XpNibno7BIyfzNn5 .error-t…...
【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式
【大模型➕知识图谱】大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式 大模型结合医疗知识图谱:解锁智能辅助诊疗系统新范式引言一、系统架构1.1 系统架构图1.2 架构模块说明1.2.1 用户输入1.2.2 大模型(语义理解与意图识别)1.2.3 Agent(问题解析与任务分配)1.2.4 问…...
大模型应用落地具体规划方案
摘要 本篇文章主要探讨大模型应用落地的具体规划方案,包含六点内容的分享,分别是: 大模型本地部署架构 大模型应用交互场景 基于阿里云RAG 项目的实现方案 大模型推荐落地场景方案 大模型应用落地发展规划 大模型开源架构选型推荐 在阅…...
【Qt】MVC设计模式
目录 一、搭建MVC框架 二、创建数据库连接单例类SingleDB 三、数据库业务操作类model设计 四、control层,关于model管理类设计 五、view层即为窗口UI类 一、搭建MVC框架 里面的bin、lib、database文件夹以及sqlite3.h与工程后缀为.pro文件的配置与上次发的文章…...
python量化交易——金融数据管理最佳实践——qteasy创建本地数据源
文章目录 qteasy金融历史数据管理总体介绍本地数据源——DataSource对象默认数据源查看数据表查看数据源的整体信息最重要的数据表其他的数据表 从数据表中获取数据向数据表中添加数据删除数据表 —— 请尽量小心,删除后无法恢复!!总结 qteas…...
深入探索Python机器学习算法:监督学习(线性回归,逻辑回归,决策树与随机森林,支持向量机,K近邻算法)
文章目录 深入探索Python机器学习算法:监督学习一、线性回归二、逻辑回归三、决策树与随机森林四、支持向量机五、K近邻算法 深入探索Python机器学习算法:监督学习 在机器学习领域,Python凭借其丰富的库和简洁的语法成为了众多数据科学家和机…...
word转换为pdf后图片失真解决办法、高质量PDF转换方法
1、安装Adobe Acrobat Pro DC 自行安装 2、配置Acrobat PDFMaker (1)点击word选项卡上的Acrobat插件,(2)点击“首选项”按钮,(3)点击“高级配置”按钮(4)点…...
【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)和CA(匀加速)
给出三维下的交互式多模型(IMM)matlab例程,模型使用匀速运动CV和匀加速运动CA,滤波使用EKF(扩展卡尔曼滤波) 文章目录 代码运行结果程序结构 代码讲解模型定义:轨迹生成:IMM核心流程…...
千峰React:Hooks(下)
useLayoutEffect useLayoutEffect在useEffect之前触发 这样会闪屏,因为是异步的,两次都渲染了 import {useEffect,useState } from react;function App() {const [msg,setMsg] useState(hello App)useEffect(() > {setMsg(hello useEffect)});retu…...
突破网络壁垒:实现 Mac SSH 访问 Windows WSL Ubuntu 的最佳实践20250301
突破网络壁垒:实现 Mac SSH 访问 Windows WSL Ubuntu 的最佳实践 背景与痛点 在现代开发环境中,开发者通常会面临不同操作系统之间的协同工作。例如: 主要开发环境位于 Windows 的 WSL Ubuntu 子系统需要从局域网内的 Mac 设备进行远程访问…...
【开源-鸿蒙土拨鼠大理石系统】鸿蒙 HarmonyOS Next App+微信小程序+云平台
✨本人自己开发的开源项目:土拨鼠充电系统 ✨踩坑不易,还希望各位大佬支持一下,在GitHub给我点个 Start ⭐⭐👍👍 ✍GitHub开源项目地址👉:https://github.com/lusson-luo/HarmonyOS-groundhog-…...
RAG 阿里云
RAG-阿里云Spring AI Alibaba官网官网 RAG-阿里云Spring AI Alibaba官网官网 AI应用跑起来,取消一下航班的操作666...
python -ssh学习
def exe_sshcmd(ip,username,userpswd,port,cmd): """ 功能:SSH登录到指定设备,并执行对应的命令 入参:前四项为ssh登录shell的ip和port,具备管理员权限的用户名和密码, cmd可以…...
【Java学习】内部类
面向对象系列六 一、类级别 1.静态成员 2.非静态成员与方法 二、类的创建与成员管理 1.类的创建 2.类的成员管理 三、常见的内部类 1.非静态内部类 2.静态内部类 3.匿名内部类 4.局部内部类 一、类级别 1.1静态成员 静态成员是类级别的是能一路直属都是在类层面的&…...
养生,开启健康生活之门
在这个快节奏的时代,人们在忙碌奔波中,往往忽略了自身健康。养生保健,不再是老年人的专属,而是各个年龄段维持良好生活状态的关键,它是我们开启健康生活的一把钥匙。 规律作息是养生的基石。人体就像一台精密的仪器&am…...
1-3压缩命令
文章目录 1. tar1.1 压缩(.tar.gz .tgz .tar.bz2 )1.2 解压缩(.tar.gz .tgz .tar.bz2 ) 2.zip2.1 压缩(.zip)2.2 解压缩 3.xz3.1 压缩(.tar.xz)3.2 解压缩 1. tar 1.1 压缩(.tar.gz .tgz .tar.bz2 ) c…...
Dify使用和入门
第一步:了解 Dify 在开始之前,先简单了解一下 Dify 是什么: Dify 是一个开源的 LLM 应用开发平台,专注于帮助开发者快速构建生产级的生成式 AI 应用。它支持知识库集成、RAG(检索增强生成)技术、复杂工作…...
AcWing 5933:爬楼梯 ← 递归 / 递推 / 高精度
【题目来源】 https://www.acwing.com/problem/content/5936/ 【题目描述】 树老师爬楼梯,他可以每次走 1 级或者 2 级,输入楼梯的级数,求不同的走法数。 例如:楼梯一共有 3 级,他可以每次都走一级,或者第…...
WebGL 渲染器 WebGLRenderer
目录 Three.js封装的渲染器 .domElement属性 .setSize(width, height)方法 帧缓冲区的相关封装 渲染器方法.clear(color,depth,stencil) 渲染器方法.clearDepth() 渲染器属性.autoClear Three.js封装的渲染器 .domElement属性 如果想通过WebGL渲染一个三维场景&#…...
基于Three.js的3D赛车游戏开发实战详解
目录 一、项目效果预览二、核心技术架构2.1 三维场景构建2.2 赛道与车辆模型2.3 光照系统三、核心运动系统3.1 车辆运动控制3.2 物理模拟公式3.3 边界限制四、摄像机控制系统4.1 第三人称视角数学原理4.2 鼠标交互实现五、星空背景特效5.1 点云生成算法5.2 动态闪烁效果六、性能…...
⭐算法OJ⭐位操作实战【计数】(C++ 实现)
191. Number of 1 Bits Given a positive integer n, write a function that returns the number of set bits in its binary representation (also known as the Hamming weight). int hammingWeight(uint32_t n) {int count 0;while (n) {count n & 1; // 检查最低位…...
【通俗讲解电子电路】——从零开始理解生活中的科技(一)
导言:电子电路为什么重要? ——看不见的“魔法”,如何驱动你的生活? 清晨,当你的手机闹钟响起时,你可能不会想到,是电子电路在精准控制着时间的跳动;当你用微波炉加热早餐时&#…...
浏览器JS打不上断点,一点就跳到其他文件里。浏览器控制台 js打断点,指定的位置打不上断点,一打就跳到其他地方了。
关闭JavaScript 源代码映射,F12开发者模式 设置->偏好设置->源代码/来源->JavaScript 源代码映射。 肯定不是这个原因导致的,但这个办法可以暂时解决问题,点完这个东西就隐藏了webpack,有懂的来讲讲。 又浪费一个小时…...
浅谈人工智能之Windows安装llama factory
浅谈人工智能之Windows安装llama factory Llama Factory 是一个强大的工具,旨在帮助用户轻松管理和优化Llama模型的训练和部署。在某些情况下,您可能需要在部分互联网连接的环境中安装和使用Llama Factory。本文将详细介绍如何在Windows系统上这种情况下…...
mac电脑中使用无线诊断.app查看连接的Wi-Fi带宽
问题 需要检查连接到的Wi-Fi的AP硬件支持的带宽。 步骤 1.按住 Option 键,然后点击屏幕顶部的Wi-Fi图标;2.从下拉菜单中选择 “打开无线诊断”(Open Wireless Diagnostics);3.你可能会看到一个提示窗口,…...
Python--内置模块和开发规范(下)
2. 开发规范 2.1 单文件应用 文件结构示例 # 文件注释 import os import jsonDB_PATH "data.json" # 常量放顶部def load_data():"""函数注释:加载数据"""if os.path.exists(DB_PATH):with open(DB_PATH, "r"…...
vue3配置端口,比底部vue调试
import { fileURLToPath, URL } from ‘node:url’ import { defineConfig } from ‘vite’ import vue from ‘vitejs/plugin-vue’ import vueJsx from ‘vitejs/plugin-vue-jsx’ // 关闭vue底部调试模式 // import vueDevTools from ‘vite-plugin-vue-devtools’ // htt…...
代码随想录day51
647. /** lc appleetcode.cn id647 langcpp** [647] 回文子串*/// lc codestart #include<iostream> #include<vector> #include<string> using namespace std; class Solution { public:int countSubstrings(string s) {vector<vector<bool>> …...
B2B2C多语言电商系统代销逻辑设计和开发
随着全球电商市场的快速发展,B2B2C(Business-to-Business-to-Consumer)模式逐渐成为企业拓展业务的重要方式。特别是在多语言、多文化的国际市场环境中,B2B2C多语言电商系统的代销功能为企业提供了灵活的业务模式,帮助…...
示波器探头衰减值:简单来说就是“信号缩小器
一、什么是衰减值 衰减值就是探头把信号“缩小”多少倍再传给示波器。比如: 1X衰减:信号原样传输(不缩小),适合测小电压(比如手机电池3.7V)。 10X衰减:信号缩小10倍,适…...
Nginx系列06(Nginx 缓存配置、SSL/TLS 配置)
目录 Nginx 缓存配置 SSL/TLS 配置 Nginx 缓存配置 概念:Nginx 缓存配置允许服务器将频繁访问的资源(如网页、图片、脚本等)存储在内存或磁盘中,当再次接收到相同请求时,直接从缓存中读取并返回,减少对后…...
JavaScript——前端基础3
目录 JavaScript简介 优点 可做的事情 运行 第一个JavaScript程序 搭建开发环境 安装的软件 操作 在浏览器中使用JavaScript文件 分离JS 使用node运行JS文件 语法 变量与常量 原生数据类型 模板字符串 字符串的内置方法 数组 对象 对象数组和JSON if条件语…...
操作系统知识点12
1.在操作系统的结构设计中,采用层次结构的操作系统其最大优点是把整体问题局部化 2.非特权指令是指操作系统和用户均可以使用的指令 3.向处理器发出的中断信号称为中断请求 4.轮转法RR是单纯基于时间片考虑的 5.当进程处于就绪状态时,表示进程已获得…...
(七)趣学设计模式 之 适配器模式!
目录 一、 啥是适配器模式?二、 为什么要用适配器模式?三、 适配器模式的实现方式1. 类适配器模式(继承插座 👨👩👧👦)2. 对象适配器模式(插座转换器 🔌…...
RBF神经网络+NSGAII多目标优化算法,工艺参数优化、工程设计优化(Matlab)
目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.RBF神经网络NSGAII多目标优化算法(Matlab完整源码和数据) 多目标优化是指在优化问题中同时考虑多个目标的优化过程。在多目标优化中,通常存在多个冲突的目标,即改善一…...
IP段转CIDR:原理Java实现
🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…...
工会考试知识点分享
工会考试涵盖工会基础知识、劳动法及相关法律法规、时政等内容,以下是一些常见的知识点分享: 工会基础知识 工会的性质与职能:工会是职工自愿结合的工人阶级的群众组织,基本职责是维护职工合法权益,同时还具有组织、…...
Java进阶——Stream流以及常用方法详解
本文详细介绍了 Java Stream 流的重要知识点。包括数据源与操作分离(不存储数据,不可复用)、惰性求值与短路优化;以及流的创建方式,如集合创建、数组 / 值创建、文件创建;然后介绍中间操作,像过…...
数据如何安全“过桥”?分类分级与风险评估,守护数据流通安全
信息化高速发展,数据已成为企业的核心资产,驱动着业务决策、创新与市场竞争力。随着数据开发利用不断深入,常态化的数据流通不仅促进了信息的快速传递与共享,还能帮助企业快速响应市场变化,把握商业机遇,实…...
Kubernetes LimitRange对于pod 的 update 事件会不会处理?
在 Kubernetes 中,LimitRange 是一个用于限制命名空间中 Pod 或容器资源使用的对象。它主要限制资源请求(requests)和资源限制(limits),如 CPU 和内存。LimitRange 影响的是 Pod 或容器的创建(c…...
服务器禁止操作汇总(Server Prohibits 0peration Summary)
服务器禁止操作汇总 一、禁忌操作TOP10 1. 直接断电关机 💥 血泪案例:某物流公司运维拔电源强制关机,导致数据库事务中断,20万订单状态丢失。 📌 技术解析: • 直接断电可能引发: ✅ 文件系统…...
Android Studio 新版本Gradle通过JitPack发布Maven仓库示例
发布本地仓库示例:https://blog.csdn.net/loutengyuan/article/details/145938967 以下是基于 Android Studio 24.2.2(Gradle 8.10.2 AGP 8.8.0 JDK17) 的通过JitPack发布Maven仓库示例,包含aar和jar的不同配置: 1.…...
Spring Boot 测试:单元、集成与契约测试全解析
一、Spring Boot 分层测试策略 Spring Boot 应用采用经典的分层架构,不同层级的功能模块对应不同的测试策略,以确保代码质量和系统稳定性。 Spring Boot 分层架构: Spring Boot分层架构 A[客户端] -->|HTTP 请求| B[Controller 层] …...
一个便捷的web截图库~
随着时间的发展,前端开发的范围越来越广,能够实现的功能也越来越多,要实现的功能也五花八门,今天就给大家介绍一个web截图库,让前端也能实现截图功能—— js-web-screen-shot js-web-screen-shot js-web-screen-shot 是一个基于 …...
【HTML— 快速入门】HTML 基础
准备工作 vscode下载 百度网盘 Subline Text 下载 Sublime Text下载 百度网盘 vscode 下载 Sublime Text 是一款轻量好用的文本编辑器,我们在写前端代码时,使用 Sublime Text 打开比使用记事本打开,得到的代码体验更好,比 vscode…...
github操作
在本地创建一个 Git 仓库并将其上传到 GitHub 的整个流程可以分为以下几个步骤。以下是详细的说明和对应的命令: 1. 安装 Git 确保你的系统已经安装了 Git。如果未安装,可以通过以下方式安装: Windows: 下载 Git for Windows 并安装。macOS…...