MySql MVCC实现原理

一、MVCC 是什么?

MVCC(Multi-Version Concurrency Control,多版本并发控制) 是一种用于数据库管理系统的并发控制技术,主要用于处理读 / 写冲突,在保证事务隔离性的同时提高数据库的并发性能。
核心思想:通过为数据行维护多个版本,使读操作(快照读)无需阻塞写操作,写操作也无需阻塞读操作,从而避免传统锁机制带来的性能开销。

隐藏字段

undolog

undolog版本链

第一次进行事务

这条记录第一次进行事务 可以看到事务ID为1

回滚指针为null 因为是第一次事务 所以没有prev指针

select * from users)时,会产生一个读视图(read view),这个readview一旦产生就不能修改,包括了这一瞬间的状态,全部活跃事务ID、活跃最小事务ID、下一版本的事务ID、创建这个读视图的ID(就是当前事务ID)。

然后MySQL会根据这个readview去undo log版本链里面从上往下(从新往旧)对比,

首先看最新的undo log数据的事务ID和creator_trx_id是否相同,相同就直接读出来,结束。其实就是看当前事务有没有更新数据,因为同一个事务里面即使没有提交也应该看到修改后的数据,不然你都不知道自己有没有修改成功。

然后再看这条undo log数据的事务ID是否小于read view中的最小活跃事务ID,如果相同则读出来,结束。因为活跃事务就是没有commit提交的事务,如果都小于最小的没有提交的事务了,那说明这条数据就是已经commit提交的稳定数据了。

其他情况,如果这条undo log数据包含在活跃事务ID里面,因为未提交的事务是不稳定的数据,或者事务ID大于下一版本事务ID,而高于当前版本的事务也是不应该被读到的,因为属于未来的状态了,那么都不应该被读到。然后就顺着链表到下一条链,也就是更旧的版本对比,直到找到可以读出来的数据。

总结

MVCC核心就是使用隐藏字段事务ID和回滚指针来构建undo log版本链表,然后在快照读时这一瞬间产生read view,根据readview去版本链表里面从新往旧一一对比,对比成功直接读出数据。这一机制让 InnoDB 在不加锁的情况下实现了事务隔离性

隐藏字段构建版本链 → 快照读生成 ReadView → 按规则遍历版本链

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值