MySQL如何通过MVCC提升并发读性能_理解undo log版本链

快照读不用锁靠Undo Log版本链实现,SELECT通过ReadView沿DB_ROLL_PTR链追溯可见版本;ReadView用m_up_limit_id、m_low_limit_id和m_creator_trx_id三值判断版本可见性。快照读为什么不用锁?靠的是Undo Log版本链MySQL的SELECT不加锁,不是"放任不管",而是把一致性判断逻辑从"加锁阻塞"搬到了"按需追溯旧版本"。核心在于:每行数据通过DB_ROLL_PTR连成一条单向链表,链上的每个节点都是该行在某个事务修改前的快照,物理存储在Undo Log里。每次UPDATE或DELETE都会生成新版本,并把DB_TRX_ID设为当前事务ID,DB_ROLL_PTR指向上一个Undo Log记录读操作不查最新行,而是拿着自己的ReadView,沿着版本链往前找------第一个满足可见性规则的版本就是它该看到的数据这意味着:100个并发SELECT可以同时遍历同一条版本链,互不干扰;而UPDATE只管追加新版本,完全不碰旧版本的内存或磁盘位置ReadView怎么决定哪个版本"可见"?关键看三个IDReadView不是时间戳,也不是快照副本,而是一组事务ID边界值。它的判断逻辑直接决定你查到的是"刚提交的新值"还是"事务开始时的老值"。m_up_limit_id(低水位):小于它的事务ID,一定已提交 → 对当前事务可见m_low_limit_id(高水位):大于等于它的事务ID,一定未提交或正在运行 → 不可见m_creator_trx_id:当前事务自己的ID → 自己改的数据永远可见若某行的DB_TRX_ID落在中间区间,就顺着DB_ROLL_PTR继续往上翻版本链,直到找到一个DB_TRX_ID m_up_limit_id的节点,或链尾RC和RR隔离级别差异,全在ReadView创建时机同一个SQL,在READ COMMITTED下可能每次SELECT都看到新结果,在REPEATABLE READ下却始终不变------这不是缓存,是ReadView复用导致的版本链截断点不同。 标贝科技 标贝科技-专业AI语音服务的人工智能开放平台

相关推荐
iAm_Ike4 小时前
Go 中自定义类型与基础类型间的显式类型转换详解
jvm·数据库·python
iuvtsrt4 小时前
Golang怎么实现方法集与接口的匹配_Golang如何理解值类型和指针类型实现接口的区别【详解】
jvm·数据库·python
旦莫5 小时前
AI驱动的纯视觉自动化测试:知识库里应该积累什么知识内容
人工智能·python·测试开发·pytest·ai测试
tongluowan0076 小时前
MySQL中列数量及长度
数据库·mysql
-liming-6 小时前
单片机设计_串口调试工具
数据库·单片机·mongodb
鹿角片ljp6 小时前
从告警检测到智能研判:SQL 注入研判模型的设计与实践
数据库·sql
知识领航员6 小时前
蘑兔AI音乐深度实测:功能拆解、实测表现与适用场景
java·c语言·c++·人工智能·python·算法·github
小新同学^O^7 小时前
简单学习 --> Spring事务
数据库·学习·spring
前进的李工7 小时前
MySQL慢查询日志优化实战
数据库·mysql·性能优化
如何原谅奋力过但无声8 小时前
【灵神高频面试题合集06-08】反转链表、快慢指针(环形链表/重排链表)、前后指针(删除链表/链表去重)
数据结构·python·算法·leetcode·链表