对MVCC的理解

文章目录

MVCC即Mutil-Version Concurrency Control(多版本并发控制),用于保证并发快照读下的读已提交级别和可重复读级别。

快照读和当前读

1.快照读 :即普通的select语句

例如:select * from student

2.当前读

insert update delete

select ... for update

select ...lock in share mode

基于ubdo_log(回滚日志)的版本链

在每一行数据里有两个隐藏字段 :

1.trx_id 当前事务id

2.db_roll_ptr 指向上一个版本的指针

readview

readview是快照读时,提取哪一个数据版本的依据

  • m_ids :当前未提交的事务编号集合
  • min_trx_id:未提交的事务的集合里最小的事务编号
  • max_trx_id:预分配事务编号
  • creator_trx_id:创建者的事务编号

将每个版本的数据的事务id依次代入到判断规则当中来决定选取哪个版本的数据

判断规则:

1.首先判断数据的事务id和readview的制造事务id是否相等,等于则读取成功,不等于进入下一步

2.判断数据的事务id是否小于最小的未提交的事务的id,小于则表明这个数据已被提交,可以被访问,

3.判断数据的事务id是否大于预分配事务id,如果大于则表明这个数据还没提交,不可以访问

4.判断数据的事务id是否在未提交的事务集合里,如果不在,则表明已经提交,可以访问

5.若最终判断出这个数据不可以被访问,则通过指针找到上一个版本的数据,进行循环判断

在读已提交级别,每进行一次快照读都会生成一个readview,

在可重复读级别,每进行一次快照读都是同一个readview,以此来保证在同一个事务中,快照读到的数据是一致

在不可重复读的级别下,innodb不仅可以避免不可重复读,还可以避免幻读(不能完全避免)。

但是注意: 在两次快照读之中加入当前读会造成幻读

相关推荐
未秃头的程序猿2 分钟前
一次秒杀把服务打挂了,我用Sentinel规则配置化救了回来
java·后端·spring cloud
Zane19944 分钟前
明明没删字段,反序列化却报错:都是隐式 serialVersionUID 惹的祸
java·后端
0xBADCODE6 分钟前
动态DEX加载+反射+DES硬编码密钥:安卓三层逆向实战
android·java·python·安全·网络安全·逆向·ctf
被摘下的星星11 分钟前
Java 中 .length、.length() 以及 .size() 的区分
java·开发语言
代码不停16 分钟前
子数组问题
java·算法
geovindu23 分钟前
CSharp: State Pattern
开发语言·后端·c#·.net·状态模式·行为模式
IT小白杨28 分钟前
TikTok小店防封号浏览器实战:2026年多店铺环境隔离与账号安全运营技术解析
开发语言·数据库·安全·php·chrome devtools·指纹浏览器
信誓旦旦的程序猿31 分钟前
【零依赖量化数据实战 #25】北交所技术指标与基本面
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
2601_9669496533 分钟前
Python 量化开发为什么适合使用金融数据 SDK?从数据获取到策略研究的工程化实践
开发语言·python·数据分析·量化交易·股票数据·quantdash
万年咸鱼35 分钟前
Java ArrayList 详解:原理、用法与实战
java·开发语言·windows