53 理解MVCC机制的前奏:undo log版本链是个什么东西?

本文深入讲解了MySQL中如何通过MVCC(多版本并发控制)机制实现事务隔离,确保在RR隔离级别下避免脏读、不可重复读和幻读。首先介绍了数据的隐藏字段trx_id和roll_pointer,以及它们在事务更新时如何变化。每个事务更新数据时,会创建undolog记录,并通过roll_pointer形成版本链,保证每个事务看到的数据一致性。文章以串行执行事务为例,逐步解析了数据版本链的建立过程,帮助读者理解MVCC的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天我们正式开始切入讲解MySQL中多个事务并发执行时的隔离到底是怎么做的,因为我们知道默认是 RR隔离级别,也就是说脏写、脏读、不可重复读、幻读,都不会发生,每个事务执行的时候,跟 别的事务压根儿就没关系,甭管你别的事务怎么更新和插入,我查到的值都是不变的,是一致的!

但是这到底是怎么做到的呢?

这就是由经典的MVCC多版本并发控制机制做到的,但是讲解这个MVCC机制之前,我们还得先讲讲 undo log版本链的故事,这是一个前奏,了解了这个机制,大家才能更好的理解MVCC机制。

简单来说呢,我们每条数据其实都有两个隐藏字段,一个是trx_id,一个是roll_pointer,这个trx_id就 是最近一次更新这条数据的事务idroll_pointer就是指向你了你更新这个事务之前生成的undo log, 关于undo log之前都讲过了,这里不用多说了。

我们给大家举个例子,现在假设有一个事务Aid=50),插入了一条数据,那么此时这条数据的隐藏字 段以及指向的undo log如下图所示,插入的这条数据的值是值A,因为事务Aid50,所以这条数据 的txr_id就是50roll_pointer指向一个空的undo log,因为之前这条数据是没有的。

接着假设有一个事务B跑来修改了一下这条数据,把值改成了值B,事务Bid58,那么此时更新之前 会生成一个undo log记录之前的值,然后会让roll_pointer指向这个实际的undo log回滚日志,如下图 所示。

大家看上图是不是觉得很有意思?事务B修改了值为值B,此时表里的那行数据的值就是值B了,那行数 据的txr_id就是事务Bid,也就是58roll_pointer指向了undo log,这个undo log就记录你更新之前 的那条数据的值。

所以大家看到roll_pointer指向的那个undo log,里面的值是值Atxr_id50,因为undo log里记录的 这个值是事务A插入的,所以这个undo logtxr_id就是50,我还特意把表里的那行数据和undo log的 颜色弄成不一样的,以示区分。

接着假设事务C又来修改了一下这个值为值C,他的事务id69,此时会把数据行里的txr_id改成69,然 后生成一条undo log,记录之前事务B修改的那个值

此时如下图所示,看起来如下。

我们在上图可以清晰看到,数据行里的值变成了值Ctxr_id是事务Cid,也就是69,然后roll_pointer 指向了本次修改之前生成的undo log,也就是记录了事务B修改的那个值,包括事务Bid,同时事务B 修改的那个undo log还串联了最早事务A插入的那个undo log,如图所示,过程很清晰明了。

所以这就是今天要给大家讲的一点,大家先不管多个事务并发执行是如何执行的,起码先搞清楚一点, 就是多个事务串行执行的时候,每个人修改了一行数据,都会更新隐藏字段txr_idroll_pointer,同时 之前多个数据快照对应的undo log,会通过roll_pinter指针串联起来,形成一个重要的版本链!

今天要让大家明白的,就是这个多个事务串行更新一行数据的时候,txr_idroll_pinter两个隐藏字段 的概念,包括undo log串联起来的多版本链条的概念!

略略略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值