MySQL、MVCC、多版本并发控制

=^^=

下面是《榴芒客服系统》的介绍,欢迎下载试用:

https://blog.csdn.net/look4liming/article/details/164755808

版权声明:本文为CSDN博主「滕州市燕猫虎计算机科技工作室个体工商户」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/look4liming/article/details/168133175

MVCC是InnoDB实现高并发读写、支撑"读已提交"和"可重复读"隔离级别的核心机制。它让普通的SELECT查询无需加锁就能读取到一致性快照,从而避免读写互相阻塞。

核心原理:三个隐藏字段与版本链

InnoDB在每一行数据背后都维护了三个隐藏字段:、

1、DB_TRX_ID(6字节):记录最近一次插入或更新该行的事务ID。

2、DB_ROLL_PTR(7字节):回滚指针,指向Undo Log中该行的上一个历史版本。

3、DB_ROW_ID(6字节):隐藏行ID,仅在表没有主键时作为聚簇索引使用。

每次对行进行更新时,旧数据会被写入Undo Log,并通过回滚指针串联起来,形成一条版本链。链头是最新数据,链尾是最旧的历史数据。

如何判断该看哪个版本:ReadView有了版本链,事务在查询时需要知道哪个版本对自己是"可见"的。这由ReadView(读视图)决定。ReadView主要包含当前系统中活跃(未提交)事务的ID列表等信息。

可见性判断规则(简化版):

1、当查询遍历版本链时,取出版本对应的DB_TRX_ID:

2、如果等于当前事务自己的ID,可见(自己改的自己能看见)。

3、如果小于ReadView中的最小活跃事务ID,说明该版本在快照生成前已提交,可见。

4、如果在活跃事务列表中,说明修改它的事务还没提交,不可见,顺着指针找上一个版本。

5、如果大于最大事务ID,说明是快照生成后才开启的事务修改的,不可见。

隔离级别下的差异,MVCC在不同隔离级别下的核心区别在于ReadView生成的时机:

·

读提交(RC):每次执行SELECT时都生成新的ReadView。因此,你能看到其他事务在本次查询前刚刚提交的数据(可能导致不可重复读)。

可重复读(RR):只在第一次执行SELECT时生成ReadView,整个事务期间复用。因此,无论其他事务何时提交,你看到的始终是第一次查询时的快照(保证了可重复读)。

·

补充说明:

·

快照读vs当前读:普通的SELECT是快照读(走MVCC)。而UPDATE、DELETE、SELECT...FOR UPDATE等是当前读,读取最新数据并加锁,不走MVCC的可见性判断。

清理机制:旧版本由后台的Purge线程清理。如果存在长事务一直不提交,导致ReadView一直不释放,Undo Log就无法被清理,可能会撑大表空间。

相关推荐
明航咨询-陈老师2 小时前
ITSS运行维护服务能力成熟度认证技术纵深:标准模型、等级路径、2026审核趋势与CS/CMMI对比
服务器·数据库·cmmi
缓慢更新3 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能
AI小百科4 小时前
向量数据库:AI 的「记忆仓库」是怎么工作的
数据库·人工智能·oracle
煎饼皮皮侠4 小时前
【设计】设计一个Web版数据库管理平台(之七):多数据库类型易扩展
数据库
Nturmoils4 小时前
MongoDB迁移之后,Spring Data 和 Hibernate 各自接哪类请求
数据库
画中有画4 小时前
在自动化脚本中操作本地数据库
数据库·oracle·自动化
Decay__4 小时前
09_MySQL 闪回与时间点恢复 —— binlog 回放、mysqlbinlog、PITR 与误删恢复
运维·数据库·sql·mysql·架构
太理摆烂哥4 小时前
MySQL用户管理
数据库·mysql
梦影_6 小时前
MySQL进阶教程(五)—— SQL调优(下)
android·大数据·数据库·后端·sql·mysql·database