GBase 8a
其他
文章

传统事务-MVCC详解

发表于2025-07-02 15:17:2052次浏览1个评论

MVCC

当前读

读取的是记录的最新版本,读取时还要保证并发事务不能修改当前记录,会对读取的记录进行加锁,比如:select.. lock in share mode(共享锁)、select .. for update、update、delete、insert(排他锁)都是一种当前读。

在RR隔离级别下,是看不到其他事务已经提交的数据

0

使用当前读就可以读取到已提交的数据

0

快照读

简单的select(不加锁)就是快照读,快照读读取的是记录数据的可见版本,有的是历史数据,不加锁是非阻塞读。

不同隔离级别下快照读不同:

RC:每一个select,都会产生一次快照读。因此会出现不可重复读

RR:开启事务后的第一个select语句才会产生一个快照读,之后的每次读取都是读取的这个快照,因此它可以解决不可重复读的问题

Serializable:快照读会变更为当前读

MVCC介绍

全称Multi-Version Concurency Control,多版本并发控制。指维护一个数据的多版本,快照读为MSQL实现MVCC提供了一个非阻塞读功能,使读写操作没有冲突。MVCC的具体实现,还依赖于数据库记录中的三个隐式字段、undo log日志、readView。

隐藏字段

0

每张表都会有三个隐藏字段,mysql8.0以后提供了ibd2sdi工具可以解析查看ibd文件,可以看到三个隐藏字段

0

0

0

undo log 版本链

当执行insert时,产生的undo log日志,只在回滚时需要,事务提交后就没用了,可立即删除

update和delete,产生的undo log日志,在回滚时和快照读的时候都需要,不会立即删除

undo log版本链:不同事务或相同事务对同一条记录进行修改会导致该记录的undo og生成一条版本记录链表,链表的头部是最新的旧纪录,链表的尾部是最早的旧纪录。

0

readView(读视图)

readView(读视图)是快照读SQL执行时MVCC提取数据的依据,记录并维护系统当前活跃的事务(未提交的)id。readView中包含四个核心字段

0

0

生成快照读的时候就会生成readview

评论

登录后才可以发表评论
崔哥发表于 2个月前
胜日寻芳泗水滨,无边光景一时新。等闲识得东风面,万紫千红总是春。