MySQL 事务隔离级别详解
一、事务的基本概念
(一)什么是事务
事务是一个逻辑工作单元,由一组数据库操作组成。这些操作要么全部成功执行,要么全部回滚,以确保数据库的一致性。事务具有以下四个特性,通常被称为 ACID 特性:
- 原子性(Atomicity):事务中的所有操作要么全部成功,要么全部失败回滚,就像一个不可分割的原子。
- 一致性(Consistency):事务必须使数据库从一个一致性状态转变为另一个一致性状态。
- 隔离性(Isolation):多个事务并发执行时,它们之间应该相互隔离,不能相互干扰。
- 持久性(Durability):一旦事务提交,它对数据库的修改就应该是永久性的,即使系统发生故障也不会丢失。
(二)为什么需要事务隔离级别
在多个事务并发执行的情况下,如果没有适当的隔离机制,可能会出现各种数据不一致的问题。事务隔离级别就是为了控制事务之间的干扰程度,确保数据的一致性和正确性。
二、MySQL 的事务隔离级别
MySQL 提供了四种事务隔离级别,分别是读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
(一)读未提交(Read Uncommitted)
- 定义:在这个隔离级别下,一个事务可以读取另一个未提交事务的数据。这意味着一个事务可以看到其他事务尚未提交的中间结果。
- 存在的问题:
- 脏读(Dirty Read):一个事务读取到了另一个事务尚未提交的数据,如果另一个事务回滚,那么这个读取到的数据就是错误的。
- 示例:
- 事务 A 开始更新一条记录,但尚未提交。
- 事务 B 读取了这条被事务 A 更新但未提交的记录。
- 事务 A 回滚了更新操作。
- 此时,事务 B 读取到的数据是错误的,因为它读取了一个被回滚的事务的数据。
(二)读已提交(Read Committed)
- 定义:在这个隔离级别下,一个事务只能读取另一个已提交事务的数据。这可以避免脏读问题,但可能会出现不可重复读问题。
- 存在的问题:
- 不可重复读(Non-repeatable Read):一个事务在多次读取同一数据时,可能会得到不同的结果,因为在这个事务执行过程中,其他事务可能对该数据进行了修改并提交。
- 示例:
- 事务 A 读取一条记录。
- 事务 B 更新了这条记录并提交。
- 事务 A 再次读取这条记录,发现结果与第一次不同。
(三)可重复读(Repeatable Read)
- 定义:这是 MySQL 的默认隔离级别。在这个隔离级别下,一个事务在多次读取同一数据时,会得到相同的结果,避免了不可重复读问题。但可能会出现幻读问题。
- 存在的问题:
- 幻读(Phantom Read):一个事务在多次执行相同的查询时,可能会得到不同数量的行,因为在这个事务执行过程中,其他事务可能插入了新的行。
- 示例:
- 事务 A 读取满足某个条件的所有记录。
- 事务 B 插入了一条满足事务 A 查询条件的新记录并提交。
- 事务 A 再次执行相同的查询,发现结果比第一次多了一行。
(四)串行化(Serializable)
- 定义:在这个隔离级别下,事务之间是完全串行执行的,一个事务在执行时会锁定它所访问的所有数据,直到事务提交。这可以避免脏读、不可重复读和幻读问题,但会极大地降低数据库的并发性能。
- 存在的问题:
- 并发性能非常低,因为事务之间需要排队执行。
- 示例:
- 事务 A 开始执行,锁定了它需要访问的所有数据。
- 事务 B 尝试访问被事务 A 锁定的数据,必须等待事务 A 提交后才能执行。
三、如何设置事务隔离级别
在 MySQL 中,可以通过以下方式设置事务隔离级别:
(一)使用 SQL 语句
- 设置全局事务隔离级别:
SET GLOBAL TRANSACTION ISOLATION LEVEL <隔离级别名称>;
例如,要将全局事务隔离级别设置为读已提交,可以使用以下命令:
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
- 设置当前会话的事务隔离级别:
SET SESSION TRANSACTION ISOLATION LEVEL <隔离级别名称>;
例如,要将当前会话的事务隔离级别设置为可重复读,可以使用以下命令:
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
(二)在配置文件中设置
可以在 MySQL 的配置文件(通常是 my.cnf 或 my.ini)中设置默认的事务隔离级别。在 [mysqld] 部分添加以下行:
transaction-isolation = <隔离级别名称>
例如,要将默认的事务隔离级别设置为串行化,可以添加以下行:
transaction-isolation = SERIALIZABLE
四、事务隔离级别对并发性能的影响
不同的事务隔离级别对数据库的并发性能有不同的影响:
(一)读未提交
- 优点:允许最大的并发度,因为事务之间的干扰最小。
- 缺点:会导致脏读问题,数据的一致性无法得到保证。
(二)读已提交
- 优点:避免了脏读问题,比读未提交隔离级别更能保证数据的一致性。
- 缺点:可能会出现不可重复读问题,并发性能比读未提交隔离级别稍低。
(三)可重复读
- 优点:避免了不可重复读问题,是 MySQL 的默认隔离级别,在大多数情况下能够满足数据一致性的要求。
- 缺点:可能会出现幻读问题,并发性能比读已提交隔离级别更低。
(四)串行化
- 优点:可以完全避免脏读、不可重复读和幻读问题,保证了数据的绝对一致性。
- 缺点:并发性能非常低,只适用于对数据一致性要求非常高且并发度很低的场景。
五、如何选择合适的事务隔离级别
在选择事务隔离级别时,需要考虑以下几个因素:
(一)数据一致性要求
- 如果对数据一致性要求非常高,不能容忍任何数据不一致的情况,可以选择串行化隔离级别。
- 如果需要保证数据不被脏读,但可以接受不可重复读或幻读问题,可以选择读已提交隔离级别。
- 如果需要避免不可重复读问题,可以选择可重复读隔离级别。
- 如果对数据一致性要求不高,可以选择读未提交隔离级别以提高并发性能。
(二)并发性能要求
- 如果应用对并发性能要求很高,可以选择较低的隔离级别,如读未提交或读已提交。
- 如果并发性能要求不是很高,但需要保证一定的数据一致性,可以选择可重复读隔离级别。
- 如果并发性能要求非常低,且对数据一致性要求极高,可以选择串行化隔离级别。
(三)应用场景
- 对于一些对数据一致性要求不高的应用,如日志记录系统,可以选择读未提交隔离级别。
- 对于一些需要保证数据不被脏读,但对不可重复读问题可以容忍的应用,如在线购物系统的库存查询,可以选择读已提交隔离级别。
- 对于一些需要保证数据在多次读取时一致的应用,如银行系统的账户余额查询,可以选择可重复读隔离级别。
- 对于一些对数据一致性要求极高且并发度很低的应用,如金融交易系统的核心业务处理,可以选择串行化隔离级别。
相关文章:
MySQL 事务隔离级别详解
一、事务的基本概念 (一)什么是事务 事务是一个逻辑工作单元,由一组数据库操作组成。这些操作要么全部成功执行,要么全部回滚,以确保数据库的一致性。事务具有以下四个特性,通常被称为 ACID 特性ÿ…...
C语言——高精度问题
1、高精度计算的本质:竖式计算; 2、适用解决超出long long int 范围的大整数计算 #include<stdio.h> #include<string.h> #define N 100 char str1[N4]{0},str2[N4]{0}; int arr1[N4]{0},arr2[N4]{0}; int ans[N5]{0};//将字符串转化成整型…...
aippt:AI 智能生成 PPT 的开源项目
aippt:AI 智能生成 PPT 的开源项目 在现代办公和学习中,PPT(PowerPoint Presentation)是一种非常重要的展示工具。然而,制作一份高质量的PPT往往需要花费大量的时间和精力。为了解决这一问题,aippt项目应运…...
【Qt之·类QSettings·参数保存】
系列文章目录 文章目录 前言一、概述1.1 QSetting是什么1.2 为什么学习QSetting是重要的 二、不同存储位置的优缺点三、 QSetting的高级用法四、实例演示总结 前言 在当今的应用程序开发中,设置管理是一个至关重要的方面。应用程序的设置包括用户偏好、配置选项和其…...
location重定向和nginx代理
文章目录 1 location重定向1.1 概述1.2 rewrite跳转1.3 用例1.4 实验1.4.1 基于域名的跳转1.4.2 基于ip的跳转1.4.3 基于后缀名的跳转 2 nginx的代理2.1 nginx内置变量2.2 正向代理2.2.1 固定正向代理2.2.2 自动代理 2.3 反向代理2.3.1 负载均衡的算法2.3.2 负载均衡的特点2.3.…...
iptables详解
华子目录 什么是防火墙分类netfilter(数据包过滤)定义netfilter分析内容 防火墙无法完成的任务netfilter策略管理工具netfilter的5类hook函数防火墙规则策略匹配原则iptablesiptables流量处理动作iptables表5种规则表 安装iptablesiptables策略文件 ipta…...
Edge SCDN深度解析,边缘安全加速的创新实践
边缘安全加速(Edge Secure Content Delivery Network,SCDN)是酷盾安全推出的边缘集分布式 DDoS 防护、CC 防护、WAF 防护、BOT 行为分析为一体的安全加速解决方案。通过边缘缓存技术,智能调度使用户就近获取所需内容,为…...
solidworks常见问题已解决
solidworks常见问题已解决 问题1:step总是提示默认模板无效。问题2:异型孔向导”时出现了“找不到标准数据库。问题3:找不到CalloutForm.txt文件,标注将由几何体定义。问题5:工程图显示文件损坏不能保存。问题6&#x…...
vCenter开启HA报错
昨天给客户开启vCenter开启HA功能报错,报错的内容比较多 博通官方给出解决办法 https://knowledge.broadcom.com/external/article/318929/error-vsphere-ha-agent-cannot-be-correct.html 常规的解决办法 1.关闭集群HA,再次开启HA 2.主机进入维护模式,再次加入…...
在 Ubuntu 中 make 是否是系统自带的?怎么样查看Linux系统中是否有make?
make 命令 并不是所有 Ubuntu 系统都默认安装的,但它通常是开发工具链的一部分,许多开发者会在安装系统后配置它。make 是一个非常重要的构建工具,用于自动化编译和构建过程,特别是在编译软件或内核时。 make 的来源 make 是一个…...
js:我要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写
问: 我按在要在template中v-for循环遍历这个centrerTopdata,我希望自循环前面三个就可以了怎么写? 回答: 问: <div v-for"(item, index) in centrerTopdata.slice(0, 3)" :key"index"> d…...
前端使用 Cursor 的最佳助手 - PromptCoder
前端使用 Cursor 的最佳助手 - PromptCoder 你是否正在使用 Cursor 进行前端开发,却苦于繁琐的代码生成和原型图的还原?你是否渴望一个更高效、更智能的工具来提升你的开发效率?那么,你一定不能错过 PromptCoder! Pr…...
深入了解 Spring IOC,AOP 两大核心思想
文章目录 一、Spring 基础 - 控制反转(IOC)1.1. 引入1.2. 如何理解 IOCSpring Bean 是什么?IoC 是什么?IoC 能做什么?IoC 和 DI 是什么关系? 1.3. IoC 配置的三种方式xml 配置Java 配置注解配置 1.4. 依赖注…...
QT从入门到精通——Qlabel介绍与使用
1. QT介绍——代码测试 Qt 是一个跨平台的应用程序开发框架,广泛用于开发图形用户界面(GUI)应用程序,也支持非图形应用程序的开发。Qt 提供了一套工具和库,使得开发者能够高效地构建高性能、可移植的应用程序。以下是…...
华为HarmonyOS NEXT 原生应用开发:鸿蒙中组件的组件状态管理、组件通信 组件状态管理小案例(好友录)!
文章目录 组件状态管理一、State装饰器1. State装饰器的特点2. State装饰器的使用 二、Prop装饰器(父子单向通信)1. Prop装饰器的特点2. Prop装饰器的使用示例 三、Link装饰器(父子双向通信)1. Link装饰器的特点3. Link使用示例 四…...
node.js 环境配置
node_global下创建node_modules 系统变量 新建NODE_Path -> node_modules的路径 用户变量 编辑Path 编辑…\npm为 node_modules的路径 系统变量 Path 新建 %NODE_PATH% CMD测试 npm install express -g 报错 npm error code ETIMEDOUT源的连接超时,没用了要换源 …...
高并发数据采集场景下Nginx代理Netty服务的优化配置
高并发数据采集场景下,要优化Nginx反向代理来支持多个Netty数采服务并保证稳定的性能,可以从以下几个方面对Nginx进行优化配置。 直连模式(直接通过 Nginx 处理与后端 Netty 服务的连接,而不作为反向代理),…...
【C++算法】40.模拟_N 字形变换
文章目录 题目链接:题目描述:解法C 算法代码: 题目链接: 6. N 字形变换 题目描述: 解法 解法一:模拟 a,b,c,d,e,f,g...... n4 弄个矩阵放进去,最后从左往右读取。 解法二:模拟优化-…...
【云计算】虚拟化技术
目录 1. 虚拟化技术在云计算中的那些地方发挥了关键作用? 2. 比较VMare,Xen等虚拟化产品的关键技术,以及对云计算技术提供的支持? 3. 服务器虚拟化,存储虚拟化和网络虚拟化都有哪些实现方式? 4. 讨论桌面…...
手机租赁系统开发指南一站式服务流程解析
内容概要 手机租赁系统的开发是一个复杂但有趣的过程,像搭建乐高一样,只要找到合适的模块,就能打造出一个宾至如归的租赁平台。在这部分,我们将对开发流程的整体结构进行简要概述,并指出每个环节的重要性。 首先&…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
SAP学习笔记 - 开发26 - 前端Fiori开发 OData V2 和 V4 的差异 (Deepseek整理)
上一章用到了V2 的概念,其实 Fiori当中还有 V4,咱们这一章来总结一下 V2 和 V4。 SAP学习笔记 - 开发25 - 前端Fiori开发 Remote OData Service(使用远端Odata服务),代理中间件(ui5-middleware-simpleproxy)-CSDN博客…...
LLMs 系列实操科普(1)
写在前面: 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容,原视频时长 ~130 分钟,以实操演示主流的一些 LLMs 的使用,由于涉及到实操,实际上并不适合以文字整理,但还是决定尽量整理一份笔…...
Webpack性能优化:构建速度与体积优化策略
一、构建速度优化 1、升级Webpack和Node.js 优化效果:Webpack 4比Webpack 3构建时间降低60%-98%。原因: V8引擎优化(for of替代forEach、Map/Set替代Object)。默认使用更快的md4哈希算法。AST直接从Loa…...
4. TypeScript 类型推断与类型组合
一、类型推断 (一) 什么是类型推断 TypeScript 的类型推断会根据变量、函数返回值、对象和数组的赋值和使用方式,自动确定它们的类型。 这一特性减少了显式类型注解的需要,在保持类型安全的同时简化了代码。通过分析上下文和初始值,TypeSc…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!
本文介绍了一种名为AnomalyAny的创新框架,该方法利用Stable Diffusion的强大生成能力,仅需单个正常样本和文本描述,即可生成逼真且多样化的异常样本,有效解决了视觉异常检测中异常样本稀缺的难题,为工业质检、医疗影像…...
