数据库事务的 ACID,通过MVCC能做什么

数据库事务的 ACID 特性

原子性 (Atomicity):事务内的操作要么全部成功,要么全部回滚。
一致性 (Consistency):事务执行后数据库保持逻辑完整性(约束、业务规则)。
隔离性 (Isolation):事务并发执行时互不干扰。
持久性 (Durability):事务提交后修改永久有效。

事务并发问题
在并发场景下,若隔离性不足,可能引发以下问题:
脏读 (Dirty Read):事务 A 读取了事务 B 未提交的修改。
不可重复读 (Non-Repeatable Read):事务 A 多次读取同一数据,结果不一致(因事务 B 修改了该数据并提交)。
幻读 (Phantom Read):事务 A 多次查询同一条件,结果集的行数变化(因事务 B 插入或删除了符合条件的数据并提交)。

MVCC 如何解决这些问题?

MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种通过维护数据的多个版本来实现无锁并发控制的机制。它通过以下方式解决脏读、不可重复读和幻读:

1. MVCC 的核心原理

数据版本快照:每个事务启动时,会生成一个一致性视图(Read View),记录当前活跃事务的 ID 列表。
版本链:每条数据行保存多个版本,通过 DB_TRX_ID(事务 ID)和 DB_ROLL_PTR(回滚指针)链接到历史版本。
可见性规则:事务只能看到在它启动前已提交的版本,或由自身修改的版本。

2. 解决脏读

问题场景:
事务 B 修改数据但未提交,事务 A 读取了该未提交的脏数据。
MVCC 的解决方案:
事务 A 读取数据时,根据其 Read View 判断数据版本的可见性。
若数据版本对应的事务(事务 B)未提交,则沿着版本链找到已提交的最新版本。
结果:事务 A 读取的是事务 B 修改前的已提交版本,避免脏读。

3. 解决不可重复读

问题场景:
事务 A 第一次读取数据后,事务 B 修改并提交了该数据,事务 A 再次读取时结果不一致。
MVCC 的解决方案:
在 可重复读(Repeatable Read) 隔离级别下,事务 A 的 Read View 在第一次查询时生成,后续所有读取都基于此视图。
即使事务 B 提交了新版本,事务 A 仍通过版本链读取旧版本数据。
结果:事务 A 多次读取同一数据的结果一致,避免不可重复读。

4. 解决幻读

问题场景:
事务 A 根据条件查询得到结果集,事务 B 插入或删除符合条件的数据并提交,事务 A 再次查询时结果集行数变化。

MVCC 的解决方案:
可重复读(RR)隔离级别下:
快照读(普通 SELECT):事务 A 基于一致性视图读取数据,其他事务插入的新数据对其不可见,避免幻读。
当前读(SELECT FOR UPDATE 或 UPDATE/DELETE):通过 间隙锁(Gap Lock) 锁定范围,阻止其他事务插入符合条件的数据。
读已提交(RC)隔离级别下:
MVCC 仅解决部分幻读问题,但可能因其他事务插入新数据导致幻读。

MVCC 的具体实现(以 MySQL InnoDB 为例)

1. 隐藏字段

每条记录包含以下隐藏字段:
DB_TRX_ID:最后修改该数据的事务 ID。
DB_ROLL_PTR:指向 Undo Log 中旧版本数据的指针。
DB_ROW_ID:行唯一标识(隐式主键)。

2. Undo Log

存储数据的历史版本,形成版本链。
事务回滚时,通过 Undo Log 恢复数据。

3. Read View

包含以下信息:
trx_ids:当前活跃事务 ID 列表。
low_limit_id:生成 Read View 时系统尚未分配的最小事务 ID。
up_limit_id:生成 Read View 时系统已分配的最大事务 ID。

判断数据版本可见性的规则:
若数据版本的 DB_TRX_ID < up_limit_id,说明该版本在事务启动前已提交,可见。
若 DB_TRX_ID >= low_limit_id,说明该版本在事务启动后生成,不可见。
若 DB_TRX_ID 在 trx_ids 列表中且未提交,不可见;否则可见。

MVCC 的隔离级别支持

隔离级别脏读不可重复读幻读实现机制
读未提交 (RU)无 MVCC,直接读最新数据
读已提交 (RC)每次查询生成新 Read View
可重复读 (RR)✅ 部分✅(快照读)事务内复用同一 Read View + 间隙锁
串行化 (S)完全依赖锁机制

MVCC 的优缺点

优点
高并发:读操作不阻塞写操作,写操作不阻塞读操作。
避免锁竞争:通过版本链实现无锁读取,提升性能。
支持快照读:提供一致性视图,简化业务逻辑。

缺点
存储开销:需维护多版本数据和 Undo Log。
历史版本清理:需定期清理过期版本(如 MySQL 的 Purge 线程)。
无法完全消除幻读:在 RR 级别下,当前读仍需间隙锁配合。

总结

MVCC 核心:通过多版本和一致性视图实现无锁并发控制。
解决脏读:只读取已提交的版本。
解决不可重复读:事务内复用同一 Read View。
解决幻读:快照读通过版本控制,当前读通过间隙锁。
适用场景:读多写少的高并发系统(如电商、社交平台)。
通过 MVCC,数据库在保证 ACID 特性的同时,显著提升了并发性能,是现代关系型数据库(如 MySQL、PostgreSQL)的核心并发控制机制。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Harbor端口更改||Harbor端口映射

Harbor端口更改|Harbor端口映射 目标&#xff1a;将端口更改为8930 前言 [rootk8s-node1 harbor]# ls common common.sh docker-compose.yml harbor.v2.5.0.tar.gz harbor.yml harbor.yml.tmpl install.sh LICENSE prepare如上是Harbor的文件目录 更改harbor.yml文件…

PGlite:浏览器中运行的PostgreSQL

PGlite 是一款基于 WebAssembly&#xff08;WASM&#xff09;构建的轻量级 PostgreSQL 数据库引擎&#xff0c;旨在简化开发者在浏览器、Node.js、Bun 或 Deno 环境中运行 PostgreSQL。PGlite 无需复杂的安装或配置&#xff0c;特别适合开发测试、本地化应用及快速原型设计。 一…

DeepSeek集成到VScode工具,让编程更高效

DeepSeek与VScode的强强联合&#xff0c;为编程效率树立了新标杆。 DeepSeek&#xff0c;一款卓越的代码搜索引擎&#xff0c;以其精准的索引和高速的检索能力&#xff0c;助力开发者在浩瀚的代码海洋中迅速定位关键信息。 集成至VScode后&#xff0c;开发者无需离开熟悉的编辑…

蓝桥杯 - 每日打卡(类斐波那契循环数)

题目: 解题思路&#xff1a; 假设输入数值为number 分析题目&#xff0c;如果想要解决这个问题&#xff0c;我们需要实现两个方法&#xff0c;第一个检查number是否是类斐波那契&#xff0c;第二个是模拟1e7 - 0的过程&#xff0c;因为是求最大的&#xff0c;那么我们从1e7开始…

JavaScript实现著名的“两数之和”问题

下面是使用 JavaScript 实现“两数之和”问题的一种常见解法&#xff0c;利用哈希表&#xff08;Map&#xff09;存储遍历过的数字和它们对应的下标&#xff0c;从而在一次遍历中完成查找。以下是详细的代码和说明&#xff1a; function twoSum(nums, target) {// 创建一个 Ma…

【微信小程序】每日心情笔记

个人团队的比赛项目&#xff0c;仅供学习交流使用 一、项目基本介绍 1. 项目简介 一款基于微信小程序的轻量化笔记工具&#xff0c;旨在帮助用户通过记录每日心情和事件&#xff0c;更好地管理情绪和生活。用户可以根据日期和心情分类&#xff08;如开心、平静、难过等&#…

【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分

文章目录 &#x1f967;栈的初步理解&#xff1a;&#x1f967;易错&#xff1a;如何判断栈满&#x1f967;栈满理解&#x1f967;栈的基本运算&#x1f4da;栈操作的伪代码逻辑&#xff08;顺序和链栈&#xff09;&#x1f4d5;顺序栈运算实现&#xff1a;顺序栈的表示&#x…

利用opencv_python(pdf2image、poppler)将pdf每页转为图片

1、安装依赖pdf2image pip install pdf2image 运行.py报错&#xff0c;因为缺少了poppler支持。 2、安装pdf2image的依赖poppler 以上命令直接报错。 改为手工下载&#xff1a; github: Releases oschwartz10612/poppler-windows GitHub 百度网盘&#xff1a; 百度网盘…

IDEA + DeepSeek 实现 AI辅助编程,提升效率10倍(全网超详细的终极图文实战指南)

前言 在软件开发的世界里&#xff0c;每个开发者都经历过这样的困境——在重复的CRUD代码中机械劳动&#xff0c;为复杂的业务逻辑调试数小时&#xff0c;或是在海量文档中寻找某个API的正确用法。传统的IDE工具虽能提供基础支持&#xff0c;却难以突破效率的“玻璃天花板”。而…

青训营:简易分布式爬虫

一、项目介绍 该项目是一个简易分布式爬虫系统&#xff0c;以分布式思想为基础&#xff0c;通过多节点协作的方式&#xff0c;将大规模的网页抓取任务分解&#xff0c;从而高效、快速地获取网络数据 。 项目地址&#xff1a;https://github.com/yanchengsi/distributed_crawle…

论坛系统测试报告

目录 一、项目背景二、论坛系统测试用例思维导图三、论坛系统测试3.1界面测试3.2登陆测试3.3主页测试3.4个人中心测试 四、自动化测试脚本4.1配置驱动4.2创建浏览器类4.3功能测试4.3.1登陆测试4.3.2注册测试4.3.3主页测试4.3.4帖子编辑4.3.5运行主代码 五、BUG分析六、测试总结…

C++ std::vector 超详细指南:基础实践(手搓vector)

目录 一.基本概念 二.类的常用接口说明 1.类对象的常见构造 2. vector类空间变化 1&#xff09;.size()&#xff08;获取数据个数&#xff09; 2&#xff09;.capacity()&#xff08;获取容量大小&#xff09; 3&#xff09;.empty()&#xff08;判断是否为空&#xff0…

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 &#xff0c;发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型(LLM)应用开发平台

AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 目录 AGI 之 【Dify】 之 使用 Docker 在 Windows 端本地部署 Dify 大语言模型&#xff08;LLM&#xff09;应用开发平台 一、简单介绍 二、Docker 下载安…

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …

常见网络协议考察知识点

说说http,https协议&#xff1b; HTTPS&#xff08;Secure Hypertext Transfer Protocol&#xff09;安全超文本传输协议&#xff1a; 它是一个安全通信通道&#xff0c;它基于HTTP开发&#xff0c;用于在客户计算机和服务器之间交换信息&#xff0c;它使用安全套接字层(SSL)…

上海市闵行区数据局调研云轴科技ZStack,共探数智化转型新路径

为进一步深化人工智能、大模型技术的应用&#xff0c;推动区域数字经济高质量发展&#xff0c;2025年2月27日&#xff0c;上海市闵行区数据局局长吴畯率队赴上海云轴科技股份有限公司&#xff08;以下简称“云轴科技ZStack”&#xff09;开展专题调研。此次调研旨在深入了解企业…

数据结构秘籍(四) 堆 (详细包含用途、分类、存储、操作等)

1 引言 什么是堆&#xff1f; 堆是一种满足以下条件的树&#xff1a;&#xff08;树这一篇可以参考我的文章数据结构秘籍&#xff08;三&#xff09;树 &#xff08;含二叉树的分类、存储和定义&#xff09;-CSDN博客&#xff09; 堆中的每一个结点值都大于等于&#xff08…

MySQL增量更新数据:高效同步策略与PanguSync实战指南

Mysql增量更新数据软件下载https://pan.baidu.com/s/1WesHaKGO7uQMhPNE-BTDmg?pwdabcd#list/path%2F 在数据驱动的商业环境中&#xff0c;实时数据同步已成为企业数字化转型的关键。本文将深入探讨MySQL增量更新的核心技术&#xff0c;并详细解析如何通过PanguSync工具实现高…

【Wireshark 02】抓包过滤方法

一、官方教程 Wireshark 官网文档 &#xff1a; Wireshark User’s Guide 二、显示过滤器 2.1、 “数据包列表”窗格的弹出过滤菜单 例如&#xff0c;源ip地址作为过滤选项&#xff0c;右击源ip->prepare as filter-> 选中 点击选中完&#xff0c;显示过滤器&#…