滚雪球学MySQL[5.3讲]:数据库隔离级别与一致性详解:从幻读到MVCC

news2024/10/2 9:15:58

全文目录:

    • 前言
    • 5.3 隔离级别与一致性
      • 1. 四种隔离级别详解
        • 1.1 读未提交(Read Uncommitted)
        • 1.2 读已提交(Read Committed)
        • 1.3 可重复读(Repeatable Read)
        • 1.4 串行化(Serializable)
      • 2. 幻读、脏读与不可重复读
        • 幻读
        • 脏读
        • 不可重复读
      • 3. MVCC(多版本并发控制)
    • 小结
    • 下期预告:6.1 备份策略

前言

在上一期内容中,我们深入探讨了并发事务的处理,了解了数据库系统在处理多个事务同时进行时所采取的策略,并探讨了事务的四大特性(ACID)。事务的处理是保障数据完整性与系统稳定性的关键,但是事务并发时可能引发一系列问题,如脏读、幻读、不可重复读等。本期,我们将继续沿着并发事务的主题,聚焦在数据库中的隔离级别与一致性上。

本期将系统地介绍数据库中的四种隔离级别,并深入探讨它们对数据一致性的影响,详细解释如幻读、脏读与不可重复读等现象。同时,我们也会介绍数据库中常见的多版本并发控制(MVCC)机制,它如何通过多个数据版本来解决并发事务中数据一致性的问题。

最后,我们将为下期内容备份策略做一个简单的预告,进一步延伸到数据保护与恢复策略的领域。

5.3 隔离级别与一致性

数据库的隔离级别是事务并发处理时的重要机制,它决定了多个事务之间的相互影响程度。数据库系统通过设置不同的隔离级别,来控制并发事务读写操作间的干扰,确保数据的一致性和完整性。

1. 四种隔离级别详解

SQL标准定义了四种事务的隔离级别,从低到高依次为:

  • 读未提交(Read Uncommitted)
  • 读已提交(Read Committed)
  • 可重复读(Repeatable Read)
  • 串行化(Serializable)

每种隔离级别的限制程度不同,影响着数据库并发性能和一致性之间的权衡。下面我们将逐一介绍这些隔离级别的特点。

1.1 读未提交(Read Uncommitted)

读未提交是隔离级别中最低的一个。在这种级别下,一个事务可以读取到其他事务尚未提交的修改,这意味着事务之间没有任何隔离。这种隔离级别可能会引发严重的并发问题,如脏读

脏读(Dirty Read)指的是一个事务读取到了另一个事务尚未提交的数据,如果该事务最终回滚,那么读取到的数据实际上是无效的。

案例演示:
事务A修改了某员工的工资为10000元,但事务A尚未提交。此时,事务B可以读取到该工资为10000元的数据,即使事务A随后回滚,事务B读到的依然是脏数据。

-- 事务A
UPDATE employees SET salary = 10000 WHERE id = 1;
-- 事务B在事务A未提交前读取
SELECT salary FROM employees WHERE id = 1;  -- 返回10000元

读未提交隔离级别不常用,因为它可能导致数据不一致性。

1.2 读已提交(Read Committed)

读已提交是很多数据库系统(如Oracle、SQL Server)的默认隔离级别。它确保一个事务只能读取到其他事务已经提交的数据,避免了脏读的发生。然而,在该隔离级别下,事务可能会出现不可重复读的问题。

不可重复读(Non-repeatable Read)指的是在同一个事务中,执行相同的查询却得到不同的结果,因为其他事务可能在两次查询之间修改了数据。

案例演示:
事务A先读取某员工的工资,事务B在事务A的查询后修改了该员工的工资,事务A再次查询时读到了不同的工资数据:

-- 事务A第一次读取
SELECT salary FROM employees WHERE id = 1;  -- 返回5000元
-- 事务B修改工资并提交
UPDATE employees SET salary = 10000 WHERE id = 1;
-- 事务A第二次读取
SELECT salary FROM employees WHERE id = 1;  -- 返回10000元

虽然读已提交避免了脏读,但并未解决不可重复读的问题。

1.3 可重复读(Repeatable Read)

可重复读隔离级别可以确保在同一事务中,所有的读取操作都会返回一致的数据,即事务不会看到其他事务的修改。它解决了不可重复读的问题。然而,这种隔离级别依然存在幻读的问题。

幻读(Phantom Read)指的是在同一个事务中,某次查询返回的行数与后续的相同查询返回的行数不同,因为另一个事务插入了新数据。

案例演示:
事务A查询工资大于5000元的员工数,事务B插入了一名符合条件的新员工,事务A再次查询时返回了不同的结果:

-- 事务A第一次查询
SELECT COUNT(*) FROM employees WHERE salary > 5000;  -- 返回5
-- 事务B插入一条新记录并提交
INSERT INTO employees (id, name, salary) VALUES (6, 'Bob', 6000);
-- 事务A第二次查询
SELECT COUNT(*) FROM employees WHERE salary > 5000;  -- 返回6

可重复读在MySQL等数据库中是默认隔离级别,它能保证事务中的读取数据一致性,但无法避免幻读。

1.4 串行化(Serializable)

串行化是最高的隔离级别,确保事务之间完全隔离,相当于事务按顺序一个接一个执行。这种级别可以避免所有并发问题,如脏读、不可重复读和幻读,但也会显著降低数据库的并发性能。

案例演示:
在串行化隔离级别下,事务A和事务B不能同时执行,如果事务A正在读取或修改数据,事务B必须等待事务A提交后才能开始执行。

-- 事务A执行
SELECT COUNT(*) FROM employees WHERE salary > 5000;
-- 事务B必须等待事务A提交后才能开始

串行化提供了最强的数据一致性保证,但代价是性能上的巨大开销。

2. 幻读、脏读与不可重复读

为了更好地理解事务隔离级别对数据库一致性的影响,下面我们深入分析三种并发读写问题。

幻读

幻读是指在同一个事务中,两次相同的查询操作返回了不同的结果,因为在这两次查询之间,其他事务插入了新数据。幻读会导致查询结果的行数发生变化,而不仅仅是某些行的具体数据被修改。

脏读

脏读发生在一个事务读取了另一个未提交事务的数据。如果该未提交事务最终回滚,那么该读取的数据就变成了无效的,这就是“脏”的来源。

不可重复读

不可重复读意味着在同一事务中,两次读取同一行的数据结果不同。一般是由于另一个事务修改了该行数据并提交,导致前后读取结果不一致。

3. MVCC(多版本并发控制)

为了解决并发读写问题,很多数据库(如MySQL的InnoDB存储引擎)使用了MVCC(多版本并发控制)。MVCC允许数据库同时支持多个事务读取同一数据行的不同版本,避免了锁竞争问题,提升了系统并发性能。

MVCC通过为每一行数据创建多个版本来处理并发事务。每个事务在读取数据时,会根据事务的开始时间看到一个数据的历史版本,而不是最新的值,这就避免了不可重复读和幻读的问题。

案例演示:
在MVCC机制下,事务A读取了一个员工的工资,在事务A期间,事务B修改了该员工的工资并提交。然而,事务A读取的仍然是事务开始时的数据版本,而不会受到事务B修改的影响。

-- 事务A开始时读取工资
SELECT salary FROM employees WHERE id = 1;  -- 返回5000元
-- 事务B修改工资并提交
UPDATE employees SET salary = 10000 WHERE id = 1;
-- 事务A再次读取工资,仍返回5000元
SELECT salary FROM employees WHERE id = 1;  -- 返回5000元

通过MVCC,事务A读取到的是事务开始时的历史版本,而不受事务B提交数据的影响,这就避免了不可重复读和幻读的问题。

小结

本期我们深入探讨了数据库中的隔离级别与一致性,详细介绍了SQL标准定义的四种隔离级别及其应用场景,分析了幻读、脏读和不可重复读等常见问题,并介绍了多版本并发控制(MVCC)这一重要机制。理解隔离级别与一致性的概念是优化数据库性能和保证数据一致性的关键。

下期预告:6.1 备份策略

数据安全是数据库管理中的核心要素之一,尤其是在处理大规模数据的系统中,意外的系统故障、硬件损坏或数据操作错误可能导致数据丢失甚至影响业务连续性。因此,制定并实施有效的备份策略,确保数据可以在任何情况下得到恢复,是数据库管理员必须掌握的技能。下期我们将详细探讨不同的备份策略,包括全量备份、增量备份与差异备份的使用场景,如何平衡备份效率与恢复时间,以及如何利用现代工具进行数据库自动化备份,敬请期待!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android Studio Dolphin 中Gradle下载慢的解决方法

我用的版本Android Studio Dolphin | 2021.3.1 Patch 1 1.Gradle自身的版本下载慢 解决办法:修改gradle\wrapper\gradle-wrapper.properties中的distributionUrl 将https\://services.gradle.org/distributions为https\://mirrors.cloud.tencent.com/gradle dis…

【测试类文档整理】软件项目测试方案(word)

1. 引言 1.1. 编写目的 1.2. 项目背景 1.3. 读者对象 1.4. 参考资料 1.5. 术语与缩略语 2. 测试策略 2.1. 测试完成标准 2.2. 测试类型 2.2.1. 功能测试 2.2.2. 性能测试 2.2.3. 安全性与访问控制测试 2.3. 测试工具 3. 测试技术 4. 测试资源 4.1. 人员安排 4.…

查缺补漏----程序查询方式和中断方式计算题

1.程序查询方式 总结下来就是: 必须在外设传输完端口大小的数据时访问端口,以防止数据未被及时读出而丢失。 占CPU总时间:就是某段时间内设备用了多少时钟周期/PCU有多少个时钟周期 CPU的时钟周期数:就看主频,主频表示…

记录Mybatis分页查询排序问题: Encountered unexpected token: “and“ “AND“

通过Page.addOrder设置了字段排序 执行的时候在 com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor#autoCountSql 方法中执行 CCJSqlParserUtil.parse Select select (Select) CCJSqlParserUtil.parse(sql);报错: failed to concat o…

YOLOv1–v11: 版本演进及其关键技术解析

最新消息:Yolo11发布最新版本2024.10 YOLO (You Only Look Once) 是一种高效的目标检测算法,自其初代发布以来,经过多次迭代,逐步提升了检测速度和精度。本文将详细介绍 YOLO 从 v1 到 v11 的各个版本,涵盖每个版本的发…

高性价比PCB分板机高速主轴SycoTec 4025 HY

德国 SycoTec 4025 HY 迷你型高速主轴以其悠久的历史、卓越的性能、良好的散热和长寿命,成为PCB分板的高性价比选择。 一、4025 HY亮点 1.悠久历史与 拥有 50 多年的应用历史,被称为 “主轴之母”,充分证明了其在行业中的可靠性和稳定性。 …

人工智能 | 手工测试用例转Web自动化测试生成

简介 在传统编写 Web 自动化测试用例的过程中,基本都是需要测试工程师,根据功能测试用例转换为自动化测试的用例。市面上自动生成 Web 或 App 自动化测试用例的产品无非也都是通过录制的方式,获取操作人的行为操作,从而记录测试用…

迎国庆,开源完全免费工作流引擎AntFlow 0.9最强版本发布,支持tidb,提升易用性and more...

AntFlow是一款前端仿钉钉的企业级工作流引擎。后端既可嵌入到现有业务系统,也可以做为独立的流程引擎中台部署(SAAS模式)。嵌入业务系统模式已经在笔者所在企业使用多年,功能丰富,能适多种国产办公场景;简单…

sql-labs靶场第一关测试报告

目录 一、测试环境 1、系统环境 2、使用工具/软件 二、测试目的 三、操作过程 1、寻找注入点 2、注入数据库 ①Order by判断列数 ②判断回显地方 ③爆库,查看数据库名称 ④爆表,查看security库的所有表 ⑤爆列,查看users表的所有…

【CKA】五、网络策略–NetworkPolicy

5、配置网络策略–NetworkPolicy 1. 考题内容: 2. 答题思路: 1、根据题目分析要创建怎样的网络策略 2、按题目要求查看ns corp-net的label 3、编写yaml,其中注意 namespace、label、port 3. 官网地址: https://kubernetes.io/…

【EXCEL数据处理】000011 案列 EXCEL带有三角形图标的单元格转换

前言:哈喽,大家好,今天给大家分享一篇文章!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【EXCEL数据处理】000011 案列 EXCEL带有三角形图标的单元格转换。使用…

数据结构-4.3.串的存储结构

一.串的顺序存储: 1.静态数组会由系统自动回收;动态数组需要手动回收; 2.优点:随机存取,可以立即找到所需的字符;缺点:插入和删除较麻烦; 3.串的顺序存储方案: 对于方…

双指针--收尾的两道题

双指针 (封面起到吸引读者作用,和文章内容无关哈,但是文章也是用心写的) 三数之和 给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k ,同时还满足 nums[i] nums…

面向代理的从单体到基于服务架构的转变的好处

论文标题:《Benefits of Agent-Oriented Transitioning from Monolithic To Service-Based Architectures》 作者信息: Daniel-Costel Bouleanu, University of Craiova, Romania; Polytechnic of Bari, ItalyMarco Alfredo Loaiza Carrillo, Universi…

根据视频id查询播放量

声明:文章仅用于学习交流,如有侵权请联系删除 如何根据视频ID查询视频的播放数量 在数字化时代,视频内容的消费已成为人们日常生活的重要组成部分。无论是社交媒体平台上的短视频,还是视频分享网站上的长视频,了解视频的播放数量…

TryHackMe 第5天 | Pre Security (四)

该学习路径讲解了网络安全入门的必备技术知识,比如计算机网络、网络协议、Linux命令、Windows设置等内容。过去三篇已经对前三块内容进行了简单介绍,本篇博客将记录 Windows设置 部分。 Windows Fundamentals Part 1 对于 Windows ,肯定会感…

只需10秒,昂首资本发现短线交易4个优点

在金融市场,短线交易已经成为投资者追求高效收益的重要工具。那么,这种交易的本质究竟是怎样的?以下是昂首资本对短线交易的深入解析,以及其优缺点的详细分析。 短线交易的本质可以这样描述:交易会有相当小的止损&…

LeetCode 983.最低票价

在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年时间里,你要旅行的日子将以名为 days 的数组给出。每一项是一个 1 到 365 的整数。 火车票有三种不同的销售方式: 一张为期一天的通行证售价为cost[0]美元 一张为…

Stable Diffusion绘画 | 来训练属于自己的模型:素材准备篇

首先要说明的是,模型训练,需要显卡持续不间断地一致运行, 快则0.5-1小时左右,慢的话可能需要跑上几小时,甚至是几天, 原因跟显卡的配置和训练设置参数都有关系。 模型训练与显卡配置: 训练 L…

从零开始搭建UVM平台(七)-加入monitor

书接上回: 从零开始搭建UVM平台(一)-只有uvm_driver的验证平台 从零开始搭建UVM平台(二)-加入factory机制 从零开始搭建UVM平台(三)-加入objection机制 从零开始搭建UVM平台(四&…