InnoDB的MVCC实现原理?MVCC如何实现不同事务隔离级别?MVCC优缺点?

概念

InnoDB的MVCC(Multi-Version Concurrency Control)即多版本并发控制,是一种用于处理并发事务的机制。它通过保存数据在不同时间点的多个版本,让不同事务在同一时刻可以看到不同版本的数据,以此来减少锁竞争,提高数据库的并发性能,同时保证事务的隔离性。

实现原理

隐藏列

InnoDB会为表中的每行记录添加三个隐藏列:

  • DB_TRX_ID:记录最后一次对该行记录进行插入或更新操作的事务ID。当进行删除操作时,也会将其视为一次更新操作,只是会将该行记录标记为已删除。
  • DB_ROLL_PTR:回滚指针,指向该行记录的上一个版本所在的回滚段。通过这个指针,能找到该行记录的历史版本。
  • DB_ROW_ID:如果表没有主键,InnoDB会自动生成一个隐藏的自增主键。
回滚段(Rollback Segment)

回滚段用于存储数据的旧版本。当一个事务对某行记录进行更新或删除操作时,InnoDB不会直接覆盖原数据,而是将旧版本的数据复制到回滚段中,并更新当前行的DB_TRX_IDDB_ROLL_PTR。这样,就可以保留数据的历史版本,供其他事务查看。

事务ID

每个事务在启动时都会被分配一个唯一的事务ID,且这个ID是按照事务启动的顺序依次递增的。

可见性判断规则

在不同的事务隔离级别下,InnoDB根据事务的开始时间和记录的隐藏列信息来判断哪些版本的数据对当前事务是可见的。以下以可重复读(REPEATABLE READ)隔离级别为例说明:

  • 当事务开始时,会获取一个当前系统中所有活跃事务ID的列表。
  • 对于要查询的每一行记录:
    • 如果该行记录的DB_TRX_ID小于当前事务开始时活跃事务ID列表中的最小值,说明该行记录是在当前事务开始之前就已经提交的事务修改的,当前事务可以看到这个版本的数据。
    • 如果该行记录的DB_TRX_ID大于当前事务开始时活跃事务ID列表中的最大值,说明该行记录是在当前事务开始之后才开始的事务修改的,当前事务看不到这个版本的数据。
    • 如果该行记录的DB_TRX_ID在当前事务开始时活跃事务ID列表的范围内,需要进一步判断该事务是否已经提交。如果已经提交,当前事务可以看到这个版本的数据;如果未提交,当前事务看不到这个版本的数据。

不同事务隔离级别下的MVCC表现

读未提交(READ UNCOMMITTED)

此隔离级别下,MVCC基本不起作用。事务可以读取到其他事务未提交的数据,不会考虑数据版本的可见性规则,可能会出现脏读问题。

读已提交(READ COMMITTED)
  • 每次查询时都会生成一个新的快照,即获取当前最新的活跃事务ID列表。
  • 事务只能看到已经提交的事务所做的更改,避免了脏读问题,但可能会出现不可重复读问题,因为在同一个事务中不同时间点的查询可能会看到不同版本的数据。
可重复读(REPEATABLE READ)
  • 事务在开始时会生成一个快照,在整个事务期间都会使用这个快照。
  • 同一个事务中多次读取相同的数据,看到的版本始终是一致的,避免了不可重复读问题,但可能会出现幻读问题(不过InnoDB通过间隙锁等机制在一定程度上解决了幻读问题)。
串行化(SERIALIZABLE)

该隔离级别下,MVCC不发挥作用。事务会对读取的数据加共享锁,对写入的数据加排他锁,事务之间是串行执行的,避免了所有并发问题,但会导致并发性能极低。

MVCC的优点

  • 提高并发性能:多个事务可以同时对数据进行读写操作,减少了锁竞争,从而提高了数据库的并发处理能力。
  • 实现事务隔离:不同的事务可以看到不同版本的数据,从而实现了不同级别的事务隔离,保证了数据的一致性和完整性。
  • 避免死锁:由于减少了锁的使用,降低了事务之间相互等待锁的情况,减少了死锁的发生概率。

MVCC的局限性

  • 占用额外存储空间:为了保存数据的多个版本,需要使用回滚段来存储旧版本的数据,这会占用额外的存储空间。
  • 增加系统复杂度:MVCC的实现需要维护隐藏列、回滚段和事务ID等信息,增加了系统的复杂度和管理难度。
  • 可能导致长事务问题:如果一个事务长时间不提交,会保留大量的旧版本数据,可能会导致回滚段空间不足,影响系统性能。

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

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

相关文章

针对 Java从入门到精通 的完整学习路线图、各阶段技术点、CTO进阶路径以及经典书籍推荐。内容分阶段展开,兼顾技术深度与职业发展

以下是针对 Java从入门到精通 的完整学习路线图、各阶段技术点、CTO进阶路径以及经典书籍推荐。内容分阶段展开,兼顾技术深度与职业发展。 一、学习路线图分阶段详解 阶段1:Java基础入门(3-6个月) 目标:掌握Java核心…

报错:Nlopt

报错:Nlopt CMake Error at TGH-Planner/fast_planner/bspline_opt/CMakeLists.txt:20 (find_package):By not providing "FindNLopt.cmake" in CMAKE_MODULE_PATH this project hasasked CMake to find a package configuration file provided by "…

鸿蒙公共通用组件封装实战指南:从基础到进阶

一、鸿蒙组件封装核心原则 1.1 高内聚低耦合设计 在鸿蒙应用开发中,高内聚低耦合是组件封装的关键准则,它能极大提升代码的可维护性与复用性。 从原子化拆分的角度来看,我们要把复杂的 UI 界面拆分为基础组件和复合组件。像按钮、输入框这…

Linux 网络基础二 ——应用层HTTP\HTTPS协议

我们程序员写的一个个解决我们实际问题,满足我们日常需求的网络程序,都是在应用层。 前面写的套接字接口都是传输层经过对 UDP 和 TCP 数据发送能力的包装,以文件的形式呈现给我们,让我们可以进行应用层编程。换而言之&#xff0c…

Spark-SQL

Spark-SQL 概述 Spark SQL 是 Spark 用于结构化数据(structured data)处理的 Spark 模块 Shark 是伯克利实验室 Spark 生态环境的组件之一,是基于 Hive 所开发的工具,它修改了内存管理、物理计划、执行三个模块,并使之能运行在 Spark 引擎上…

Java 在人工智能领域的突围:从企业级架构到边缘计算的技术革新

一、Java AI 的底层逻辑:从语言特性到生态重构 在 Python 占据 AI 开发主导地位的当下,Java 正通过技术重构实现突围。作为拥有 30 年企业级开发经验的编程语言,Java 的核心优势在于强类型安全、内存管理能力和分布式系统支持,这…

编程实现除法程序时需要注意的细节

使用Python实现除法程序时,需注意以下关键细节: 除数为零的处理 必须检查除数是否为零,否则会触发ZeroDivisionError异常。可通过try-except结构捕获异常并处理。 整数除法与浮点数除法的区别 • 使用/运算符时,无论操作数是否为…

Java万级并发场景-实战解决

今天我们来做一个典型的消费力度能达到万级别的并发场景,老师点名-学生签到 正常情况 正常情况来说是不同班级下的老师发布不同的点名--然后不同班级下的很多学生同一时间进行签到,签到成功就去修改数据库,签到失败就返回,但是这…

openGauss新特性 | 自动参数化执行计划缓存

目录 自动化参数执行计划缓存简介 SQL参数化及约束条件 一般常量参数化示例 总结 自动化参数执行计划缓存简介 执行计划缓存用于减少执行计划的生成次数。openGauss数据库会缓存之前生成的执行计划,以便在下次执行该SQL时直接使用,可…

计算机操作系统——存储器管理

系列文章目录 1.存储器的层次结构 2.程序的装入和链接 3.连续分配存储管理方式(内存够用) 4.对换(Swapping)(内存不够用) 5.分页存储管理方式 6.分段存储管理方式 文章目录 系列文章目录前言一、存储器的存储结构寄存器&…

KF V.S. GM-PHD

在计算机视觉的多目标跟踪(MOT)任务中,卡尔曼滤波(KF)和高斯混合概率假设密度(GM-PHD)滤波器是两种经典的状态估计方法,但它们的原理和应用场景存在显著差异。以下是两者的核心机制和…

车载通信架构 --- DOIP系统机制初入门

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 周末洗了一个澡,换了一身衣服,出了门却不知道去哪儿,不知道去找谁,漫无目的走着,大概这就是成年人最深的孤独吧! 旧人不知我近况,新人不知我过…

C++对象池设计:从高频`new/delete`到性能飞跃的工业级解决方案

一、new/delete的性能之殇:一个真实的生产事故 2023年某证券交易系统在峰值时段出现请求堆积,事后定位发现:每秒40万次的订单对象创建/销毁,导致: 内存碎片率高达37%(jemalloc统计)malloc调用…

【C/C++】深入理解整型截断与提升:原理、应用与区别

文章目录 1. 整形截断(Integer Truncation)1.1 整形截断的例子1.2 整形截断的细节 2. 整形提升(Integer Promotion)2.1 整形提升的规则2.2 整形提升的示例2.3 整形提升的实际应用2.4 整型提升与标准操作符 3. 整型截断与提升的区别…

python蓝桥杯备赛常用算法模板

一、python基础 (一)集合操作 s1 {1,2,3} s2{3,4,5} print(s1|s2)#求并集 print(s1&s2)#求交集 #结果 #{1, 2, 3, 4, 5} #{3}(二)对多维列表排序 1.新建列表 list1[[1,2,3],[2,3,4],[0,3,2]] #提取每个小列表的下标为2的…

【模块化拆解与多视角信息3】教育背景:学历通胀时代的生存法则

教育背景:学历通胀时代的生存法则 写在最前 作为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算…

uniapp实现H5页面麦克风权限获取与录音功能

1.权限配置 在uni-app开发H5页面时,需要在manifest.json文件中添加录音权限的配置。具体如下: {"h5": {"permissions": {"scope.record": {"desc": "请授权使用录音功能"}}} }这段配置代码是用于向…

功能丰富的PDF处理免费软件推荐

软件介绍 今天给大家介绍一款超棒的PDF工具箱,它处理PDF文档的能力超强,而且是完全免费使用的,没有任何限制。 TinyTools(PC)这款软件,下载完成后即可直接打开使用。在使用过程中,操作完毕后&a…

鸿蒙开发-ArkUi控件使用

2.0控件-按钮 2.1.控件-文本框 Text(this.message).fontSize(40) // 设置文本的文字大小.fontWeight(FontWeight.Bolder) // 设置文本的粗细.fontColor(Color.Red) // 设置文本的颜色------------------------------------------------------------------------- //设置边框Tex…

深入理解 ResponseBodyAdvice 及其应用

ResponseBodyAdvice 是 Spring MVC 提供的一个强大接口&#xff0c;允许你在响应体被写入 HTTP 响应之前对其进行全局处理。 下面我将全面介绍它的工作原理、使用场景和最佳实践。 基本概念 接口定义 public interface ResponseBodyAdvice<T> {boolean supports(Metho…