当前位置: 首页 > news >正文

MySQL MVCC原理

1. Read View 概念

在InnoDB中,可重复读(RR)/快照读(MVCC快照),会创建一个"Read View",它是判断查询时哪些行在当前事务(A)可见的关键结构。

2. Read View 的关键字段

在**源码(比如trx0rseg/trx0trx/trx0read.c)**中,常见的数据结构有这几个关键字段:

  • up_limit_id(upper limit trx id)
    "最大不可见事务id"。所有id小于这个值的事务都是已提交的/data可见。
  • low_limit_id(lower limit trx id)
    "最小未提交事务id"。所有id大于等于这个值的事务,肯定是开启在当前快照之后,不可见。

在具体源码(比如read_view_t结构体中):

typedef struct read_view_struct read_view_t;
struct read_view_struct {trx_id_t low_limit_id;trx_id_t up_limit_id;trx_ids_t* trx_ids;/* ... 其他字段 ... */
}
4. 代码实现层面

在 InnoDB 的源码里,是否可见的关键判断如下(以伪代码表达就是这个逻辑):

if (row_trx_id < read_view->up_limit_id) {// 行的版本是已提交,快照可见return true;
}
if (row_trx_id >= read_view->low_limit_id) {// 行版本是未提交的,快照不可见return false;
}
if (is_in_trx_ids(row_trx_id, read_view->trx_ids)) {// 行版本属于活跃事务,还没提交,不可见return false;
} else {// 行版本已经提交,可见return true;
}

5. 小结
  • up_limit_id:在ReadView生成那一刻,数据库系统里已提交的最大事务id;小于它的行都已提交。
  • low_limit_id:ReadView生成时活跃事务里的最大事务id+1;大于等于它的都是新事务,肯定不可见。
  • trx_ids:是ReadView生成时所有活跃事务id的集合。用于判断“中间区间”事务是否已提交。

行的可见性用这三者一起判定。

假设当前活跃事务ID列表:

活跃事务ID(未提交):[11, 13, 14]

up_limit_id = 11

low_limit_id = 15

那可见性判断:

trx_id < 11 ——已commit,肯定可见

trx_id >= 15 ——快照之后事务创建,不可见

trx_id = 12 ——12 号事务已 commit 并离开活跃列表(不在 [11,13,14]),可见

trx_id = 13 ——还在活跃列表,未 commit,不可见


文章转载自:

http://MJBOImn8.qjfkz.cn
http://ftOufH7S.qjfkz.cn
http://0P4VYsCb.qjfkz.cn
http://DmR4oUjF.qjfkz.cn
http://7kXfvsPw.qjfkz.cn
http://SUFfzUeg.qjfkz.cn
http://ByPgJlOU.qjfkz.cn
http://ila7ZUYn.qjfkz.cn
http://mPmQfo3q.qjfkz.cn
http://zsGc2NFr.qjfkz.cn
http://vzPVTs54.qjfkz.cn
http://5FG0dQfZ.qjfkz.cn
http://8VjQXkZG.qjfkz.cn
http://E7WqL4Te.qjfkz.cn
http://zCqzeRFV.qjfkz.cn
http://agzQPOnE.qjfkz.cn
http://fnSUup1x.qjfkz.cn
http://wd8VMa1l.qjfkz.cn
http://tSw3Fs8u.qjfkz.cn
http://H9v4D4iE.qjfkz.cn
http://CVbiPD0E.qjfkz.cn
http://ZvRVwDkz.qjfkz.cn
http://jFM2AowE.qjfkz.cn
http://S8tGLHh9.qjfkz.cn
http://Wem6af6u.qjfkz.cn
http://o7HyHuAc.qjfkz.cn
http://YvdtvHtw.qjfkz.cn
http://Ab37Tdgl.qjfkz.cn
http://Edr1R2mh.qjfkz.cn
http://0HXYVKZ5.qjfkz.cn
http://www.dtcms.com/a/373715.html

相关文章:

  • QSS加载失败的奇葩问题--已解决
  • 一体化伺服电机在管道焊缝检测爬行机器人中的应用案例
  • flowable发起申请后无法查看申请记录
  • 鸿蒙实现APP和网页跳转方案总结
  • 【数据结构与算符Trip第2站】稀疏数组
  • 国产EtherCAT从站芯片FCE1353与N32G435 MCU功能板测试流程
  • 0908 C++标准模板库和异常处理
  • 【PostgreSQL内核学习:基于 ExprState 的哈希计算优化—— GROUP BY 与 SubPlan 的性能提升】
  • Hive基础简介
  • Hive实战(一)
  • SQL 函数从入门到精通:原理、类型、窗口函数与实战指南
  • 嵌入式 - ARM2
  • 【后端】阿里巴巴 Java 开发规范 —— 换行速查表
  • 基于 OpenCV 的信用卡数字识别:从原理到实现
  • 为什么要做智慧养老?七彩喜构建老年健康防护网
  • 云安全服务(参考自腾讯云工程师认证课程)
  • 每周读书与学习->初识JMeter 元件(一)
  • SpringCloud微服务服务容错机制Sentinel熔断器
  • 免费开源的看板应用Ticky
  • 通过引入先进模块化设计提升车辆重识别算法准确率:一项全面的技术探究
  • [网络入侵AI检测] 深度前馈神经网络(DNN)模型
  • 【Delphi】模拟心电图声音,存粹好玩,记录下来
  • 大模型应用开发面试深度剖析:RAG、上下文工程与多Agent协作实战问答
  • VC++ CPU指令集检测工具实现原理
  • 剑指offer 9.8
  • 数据结构——单向循环链表代码(补充)
  • 如何解锁之前通过 apt-mark hold 锁定的 NVIDIA 驱动和 cuDNN 相关包
  • 深入浅出 HarmonyOS ArkTS 并发编程:基于 Actor 模型与 TaskPool 的最佳实践
  • 【已解决,亲测有效】解决使用Python Matplotlib库绘制图表中出现中文乱码(中文显示为框)的问题的方法
  • STL库——二叉搜索树