了解MVCC的实现吗 ?(隐式字段,ReadView,undo log)

2024-03-05 23:20

本文主要是介绍了解MVCC的实现吗 ?(隐式字段,ReadView,undo log),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

MVCC即多版本并发控制,它的实现原理主要依赖于记录中的隐藏字段、undo log(回滚日志)以及Read View(读视图)

MVCC是数据库管理系统中用于处理并发操作的一项技术,它允许多个事务对同一数据进行读写操作而不互相干扰,每个事务都会认为自己是在独立地操作数据。这提高了数据库在高并发场景下的性能和数据的完整性。

MVCC的实现涉及到几个核心概念。

隐式字段,InnoDB存储引擎的每一行记录中会有两个隐藏列,分别记录数据的创建和删除时的时间戳,实际上这里记录的是事务ID。这两个字段配合使用能够追踪记录的版本信息。

DB_TRX_ID 和 DB_ROLL_PTR 是 InnoDB 存储引擎为实现 MVCC(多版本并发控制)而设计的隐藏列

  • DB_TRX_ID:这个隐藏列记录了插入或更新该行数据的最后一个事务的ID。它占用6个字节,每当数据行被插入或更新时,该字段都会记录那个事务的ID。在数据行被删除时,内部也将删除操作视为一次更新,并更新此字段。

  • DB_ROLL_PTR:这个隐藏列是一个回滚指针,占用7个字节,指向undo log中该行上一个版本的数据位置。当数据行发生更新时,undo log会记录更新前的数据,以便在需要时能够恢复到之前的状态。这个指针正是链接到那些旧版本数据的地址。

undo log,它不仅用于事务回滚,还是实现MVCC的关键组成部分。当数据发生更新或删除操作时,旧版本的数据并不会立即从磁盘上移除,而是通过undo log保留下来,使得旧版本的数据可以在需要时被检索到。

ReadView, 是MySQL中MVCC机制的核心组件,用于维护事务的一致性和隔离性

ReadView是MVCC在执行事务时的“视图”,它其实是一个数据结构,包含了当前活跃(未提交)事务ID列表等信息。当一个只读事务(例如SELECT查询)开始时,会生成一个ReadView。这个ReadView包含了在该时刻所有其他活跃的读写事务ID。通过这个ReadView,数据库可以判断哪些版本的数据对当前事务可见,从而避免了不同类型并发问题的发生。

ReadView在事务开始时创建,包含了以下几个关键参数:

  • creator_trx_id:当前事务的ID。

  • DB_TRX_ID与creator_trx_id相同 可以被当前事务访问

  • m_ids:表示在生成ReadView时系统中活跃的读写事务的ID列表。

  • DB_TRX_ID在min_trx_id和max_trx_id之间 如果trx_id在m_ids列表中 ,说明创建 ReadView 时生成该版本的事务是活跃的 不可以被访问 反之,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问。

  • min_trx_id:m_ids中的最小事务ID值。

  • DB_TRX_ID小于min_trx_id 可以被当前事务访问

  • max_trx_id:最大事务ID,也是下一个将要生成的事务ID。

  • DB_TRX_ID大于max_trx_id 不可以被当前事务访问

这些参数的作用是:

  • 避免脏读(Dirty Read):通过比较数据的事务时间戳与ReadView中的事务ID,确保事务不会读取到其他事务未提交的数据。如果数据由一个未出现在m_ids列表中的事务修改,那么这个修改对当前事务不可见。

  • 避免不可重复读(Non-Repeatable Read):即使在事务执行期间有其他事务提交修改了数据,ReadView也会保证同一个事务内多次读取的结果是一致的。因为ReadView在事务开始时创建,所以它看到的数据集在事务期间不会改变。

  • 避免幻读(Phantom Read):幻读是指在同一事务中,执行相同的查询,但第二次查询却返回了第一次查询中未出现的新数据。在可重复读的隔离级别下,InnoDB通过锁定将要访问的范围来防止幻读。

综上所述,ReadView是MVCC机制中的一个关键概念,它通过维护活跃事务的状态信息,使得数据库在高并发环境下能够保持数据的一致性和隔离性,同时提高性能。

这篇关于了解MVCC的实现吗 ?(隐式字段,ReadView,undo log)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/778152

相关文章

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

内核启动时减少log的方式

内核引导选项 内核引导选项大体上可以分为两类:一类与设备无关、另一类与设备有关。与设备有关的引导选项多如牛毛,需要你自己阅读内核中的相应驱动程序源码以获取其能够接受的引导选项。比如,如果你想知道可以向 AHA1542 SCSI 驱动程序传递哪些引导选项,那么就查看 drivers/scsi/aha1542.c 文件,一般在前面 100 行注释里就可以找到所接受的引导选项说明。大多数选项是通过"_

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、