MySQL 的事务隔离级别定义了多个并发事务在访问和修改相同数据时,彼此之间的可见性和影响程度。它解决了并发事务可能引发的三类核心问题:

  1. 脏读: 一个事务读取了另一个未提交事务修改的数据。
  2. 不可重复读: 一个事务内多次读取同一行数据,由于其他事务的修改并提交,导致前后读取的结果不一致。
  3. 幻读: 一个事务内多次执行相同的查询,由于其他事务的插入或删除并提交,导致前后查询结果集的行数不一致。

MySQL 遵循 SQL 标准,支持以下四种事务隔离级别,按隔离强度从低到高排序:

  1. READ UNCOMMITTED (读未提交):

    • 描述: 最低的隔离级别。
    • 解决的问题: 无。
    • 可能存在的问题: 脏读、不可重复读、幻读都可能发生。
    • 原理: 一个事务可以看到其他事务尚未提交的修改。
    • 使用场景: 非常少见,通常只在需要查看最新可能数据(即使未提交)且完全不在意数据一致性的极端场景使用。性能最高但风险最大。
  2. READ COMMITTED (读已提交):

    • 描述: 大多数数据库系统(如 Oracle, SQL Server, PostgreSQL)的默认隔离级别(但 MySQL InnoDB 默认不是它)。
    • 解决的问题: 脏读。
    • 可能存在的问题: 不可重复读、幻读。
    • 原理: 一个事务只能看到其他事务已经提交的修改。它保证读取到的任何数据都是已提交的数据。
    • 实现 (InnoDB): 通常使用一致性非锁定读(快照读)。在SELECT语句执行时(或事务内第一次读时)创建该语句的快照(Read View),基于这个快照读取数据。其他事务的提交在本次查询执行后对本事务的后续查询才可见(除非使用FOR UPDATE/LOCK IN SHARE MODE加锁)。
    • 使用场景:READ UNCOMMITTED安全很多,是很多应用的合理选择,特别是当应用逻辑能够容忍不可重复读和幻读时。性能较好。
  3. REPEATABLE READ (可重复读):

    • 描述: MySQL InnoDB 存储引擎的默认隔离级别
    • 解决的问题: 脏读、不可重复读。
    • 可能存在的问题: 幻读但在 InnoDB 中,通过 Next-Key Locks 机制在大多数情况下避免了幻读)。
    • 原理: 保证在同一个事务中多次读取同一行数据的结果是一致的。
    • 实现 (InnoDB):
      • 一致性非锁定读 (快照读): 在事务中第一次执行SELECT语句时创建一个整个事务的一致性快照(Read View)。在该事务后续的所有普通SELECT操作都会基于这个同一个快照来读取数据。因此,即使其他事务修改并提交了数据,本事务内看到的仍然是它开始时那个“快照”版本的数据,从而避免了不可重复读。
      • 锁定读 (当前读): 当执行SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODEUPDATEDELETE语句时,InnoDB 会使用Next-Key Locks。这种锁不仅锁住扫描到的索引记录,还会锁住这些记录之前的“间隙”,防止其他事务在锁定的范围内插入新行。正是这种机制在很大程度上防止了幻读的发生。
    • 使用场景: 需要保证事务内多次读取相同数据结果一致的场景(如对账、报表生成)。是 MySQL InnoDB 的默认且推荐级别,在保证较高一致性同时提供较好性能。
  4. SERIALIZABLE (可串行化):

    • 描述: 最高的隔离级别。
    • 解决的问题: 脏读、不可重复读、幻读。
    • 可能存在的问题: 性能最低(并发度最低),可能导致大量的锁等待甚至死锁。
    • 原理: 通过强制事务串行执行(而非并发执行)来避免所有并发问题。它会在读取的每一行数据上都加锁(通常是共享锁)。
    • 实现 (InnoDB): 将所有的普通SELECT语句隐式转换为SELECT ... LOCK IN SHARE MODE,即对读取的数据加共享锁。这会导致其他事务无法修改这些数据,写操作会被阻塞。写操作(UPDATE, DELETE, INSERT)仍然会对涉及的行加排他锁。
    • 使用场景: 要求最高级别的数据一致性,且可以接受显著性能下降的场景。如金融核心交易等。

总结对比表:

隔离级别脏读不可重复读幻读 (InnoDB)性能并发度
READ UNCOMMITTED最高最高
READ COMMITTED较高较高
REPEATABLE READ大部分避免 (Next-Key Lock)中等中等
SERIALIZABLE最低最低

查看和设置隔离级别:

  • 查看当前会话隔离级别:

    SELECT @@transaction_isolation; -- MySQL 8.0+
    -- 或
    SELECT @@tx_isolation; -- MySQL 5.x
    
  • 查看全局隔离级别:

    SELECT @@global.transaction_isolation; -- MySQL 8.0+
    -- 或
    SELECT @@global.tx_isolation; -- MySQL 5.x
    
  • 设置当前会话隔离级别 (仅影响当前连接):

    SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 替换为需要的级别
    
  • 设置全局隔离级别 (影响之后的所有新连接,需要相应权限):

    SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED; -- 替换为需要的级别
    
  • 在启动时设置 (修改配置文件 my.cnf / my.ini):

    [mysqld]
    transaction-isolation = READ-COMMITTED # 替换为需要的级别
    

选择建议:

  1. 优先使用默认 (REPEATABLE READ): MySQL InnoDB 的默认REPEATABLE READ在性能和一致性之间取得了很好的平衡,并通过Next-Key Locks有效避免了幻读,适合绝大多数应用场景。
  2. 需要更强实时性且容忍不可重复读/幻读: 考虑READ COMMITTED。这在某些需要看到其他事务最新提交结果的场景(如消息通知)可能更合适。
  3. 最高一致性要求: 仅在绝对必要且完全理解性能代价时使用SERIALIZABLE
  4. 避免使用 READ UNCOMMITTED: 除非有非常特殊且可控的场景需求。

理解事务隔离级别对于设计高性能、高一致性的数据库应用至关重要。务必根据你的具体应用需求来选择最合适的隔离级别。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/90076.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/90076.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/90076.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统】基础IO(上)

1. 深入理解"文件"概念1.1 文件的狭义理解狭义上的“文件”主要指存储在磁盘上的数据集合。具体包括:文件在磁盘里:文件是磁盘上以特定结构(如FAT、ext4文件系统)保存的数据集合,由字节或字符序列构成。磁盘…

构建智能可视化分析系统:RTSP|RTMP播放器与AI行为识别的融合实践

技术背景 随着人工智能向边缘侧、实时化方向加速演进,视频已从传统的“记录媒介”跃升为支撑智能感知与自动决策的关键数据入口。在安防监控、工业安全、交通治理等复杂应用场景中,行为识别系统的准确性和响应效率,越来越依赖于视频源的时效…

AI入门学习-Python 最主流的机器学习库Scikit-learn

一、Scikit-learn 核心定位是什么:Python 最主流的机器学习库,涵盖从数据预处理到模型评估的全流程。 为什么测试工程师必学:✅ 80% 的测试机器学习问题可用它解决✅ 无需深厚数学基础,API 设计极简✅ 与 Pandas/Numpy 无缝集成&a…

apache-doris安装兼datax-web配置

Doris安装 官方快速开始链接 下载2.1.10,解压。我这边个人服务器CPU是J1900,是没有 avx2的,所以选no 配置JAVA_HOME,这里没有配置的要配置下,注意要Oracle的jdk,openjdk没有jps等工具集,后面跑…

问题实例:4G网络下语音呼叫失败

问题描述 测试机 拨号呼出后,一直在4G,超时后自动挂断。 对比机可以呼出成功,呼出时回落3G。 日志分析 测试机和对比机一样发起了CSFB 呼叫。 只是测试机后面没有回落3G。 03:44:40.373264 [0xB0ED] LTE NAS EMM Plain OTA Outgoing Message …

MATLAB 2024b深度学习新特性全面解析与DeepSeek大模型集成开发技术

随着人工智能技术向多学科交叉融合与工程实践领域纵深发展,MATLAB 2024b深度学习工具箱通过架构创新与功能强化,为科研创新和行业应用提供了全栈式解决方案。基于该版本工具链的三大革新方向展开:一是构建覆盖经典模型与前沿架构的体系化&…

Springboot美食分享平台

一、 绪论 1.1 研究意义 当今社会作为一个飞速的发展社会,网络已经完全渗入人们的生活, 网络信息已成为传播的第一大媒介, 可以毫不夸张说网络资源获取已逐步改变了人们以前的生活方式,网络已成为人们日常,休闲主要工…

微信小程序——世界天气小助手

哈喽,大家好! 最近小编开发了一个简单的微信小程序——世界天气小助手,希望大家喜欢。 No.1: 为大家介绍下开发者工具下的页面结构。一共有三个界面{主页、搜索页、详情页}No.2: 具体页面展示:当前页面是主页&…

基于单片机的智能家居安防系统设计

摘 要 为了应对目前人们提出的对生活越来越智能的要求,在提高生活品质的同时降低意外事件发生对用户造成的经济损失或其他损失。针对日常生活中经常发生的火灾,失窃,电力资源浪费等生活问题,本设计正是在这种需求背景下展开研究…

腾讯研究院 | AI 浪潮中的中国品牌优势解码:华为、小米、大疆、科大讯飞等品牌从技术破壁到生态领跑的全维突围

当 DeepSeek-R1 模型在 2025 年掀起大众 AI 热潮,当腾讯混元大模型与京东言犀大模型在产业场景中落地生根,中国品牌正在 AI 技术革命的浪潮中完成从追随者到引领者的蜕变。腾讯营销洞察(TMI)联合京东消费及产业研究院、腾讯研究院…

FreeRTOS学习笔记——空闲任务prvIdleTask

文章目录任务创建任务的内容推荐阅读任务创建 prvIdleTask任务,是由任务调度函数vTaskStartScheduler创建的,任务优先级0,任务堆栈深度由配置选项configMINIMAL_STACK_SIZE定义。 void vTaskStartScheduler(void) {/* 其他代码*//* Add the…

初识卷积神经网络CNN

卷积神经网络CNN 全连接神经网络存在的问题: 输入的形式应该是列向量,但是卷积神经网络中的输入是图像(2D矩阵),那么就需要对图片进行展平处理,原本图像中蕴含的空间等信息就被打乱了输入的特征多了,那么神经元的参数就会很多&…

高层功能架构详解 - openExo

高层功能架构详解1. 系统整体结构与模块化设计2. 两大核心类:ExoData 与 ExoA. ExoDataB. ExoC. 数据结构的层级关系3. 多微控制器协作与BLE通信4. 主控软件运行流程(主循环伪代码)5. 架构优点小结6. 与 Code Structure 的关系实用建议1. 系统…

【西北工业大学公开课】导引系统原理(全61讲)周军 -个人笔记版 5000字

【严正声明】此文档为个人笔记:仅供个人与同学参考学习,记录学习过程,严谨商业转载,或商业售卖!感谢西北工业大学公开课知识分享,公开资料开源!视频链接:【【西北工业大学】导引系统…

《命令行参数与环境变量:从使用到原理的全方位解析》

前言 当我们在终端输入 ls -l /home 查看目录详情,或用 gcc -o hello hello.c 编译代码时,或许很少思考:这些空格分隔的 “指令 选项 路径” 是如何被程序识别的?为什么 PATH 变量能让系统找到可执行文件,而 HOME 变…

C++设计模式:单例模式 (现代C++主流实现方式Meyer‘s Singleton + 使用CRTP模板化)

文章目录单例模式创建单例类饿汉式or懒汉式现代C单例模式的主流实现方式——Meyers Singleton使用 CRTP 模板化单例类单例模式 单例模式是指程序中只需要一个实例化对象,在全局作用域或整个代码架构中,此对象只被实例化一次,就可以达到在整个…

Eureka 和 Nacos

一、基本介绍EurekaEureka 是 Netflix 公司开发的一款基于 REST 风格的服务注册与发现组件,专为分布式系统设计。它遵循 AP 原则(可用性、分区容错性优先),强调在网络分区等异常情况下的服务可用性,是 Spring Cloud Ne…

文件IO笔试题

目录前言一、核心概念:二、关键操作步骤:三、为什么需要文件IO?四、常见类型:五、标准IO源码六、笔试真题和练习1.代码实现1代码实现22.代码实现3.代码实现4.代码实现5.代码实现七、总结前言 文件IO(文件输入/输出&am…

前端学习 5:DFT

DFT技术 DFT (design for testability):指在设计系统和电路的同时,考虑测试的需求,通过增加一定的硬件开销,获得最大可测性的设计过程。(因为增加了硬件,所以也带来了不足&#xff…

最长递增子序列(LIS)问题详解

最长递增子序列LIS问题详解一、问题定义与核心特征1.1 问题描述1.2 核心特征二、基础解法:动态规划(DP)2.1 解法思路2.2 Java代码实现2.3 复杂度分析三、优化解法:二分查找贪心3.1 核心思路3.2 二分查找的作用3.3 Java代码实现代码…