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

本文深入探讨了RR隔离级别的数据库事务特性,确保无脏读、不可重复读和幻读的发生。通过介绍MVCC(多版本并发控制)机制,阐述了如何实现事务间的独立性和数据一致性。此外,详细解析了undolog版本链的工作原理,每个数据行包含的trx_id和roll_pointer字段在事务更新过程中的作用,以及如何通过undolog回滚日志保持数据的历史状态。
摘要由CSDN通过智能技术生成

RR隔离级别,也就是说脏写、脏读、不可重复读、幻读,都不会发生,每个事务执行的时候,跟别的事务压根儿就没关系,甭管你别的事务怎么更新和插入,我查到的值都是不变的,是一致的!这就是由经典的MVCC多版本并发控制机制做到的。

什么是undo log版本链呢?

简单来说呢,每条数据其实都有两个隐藏字段,一个是trx_id,一个是roll_pointer,这个trx_id就是最近一次更新这条数据的事务id,roll_pointer就是指向了你更新这个事务之前生成的undo log。

举个例子,现在假设有一个事务A(id=50),插入了一条数据,那么此时这条数据的隐藏字段以及指向的undo log如下图所示,插入的这条数据的值是值A,因为事务A的id是50,所以这条数据的txr_id就是50,roll_pointer指向一个空的undo log,因为之前这条数据是没有的。
在这里插入图片描述
接着假设有一个事务B跑来修改了一下这条数据,把值改成了值B,事务B的id是58,那么此时更新之前会生成一个undo log记录之前的值,然后会让roll_pointer指向这个实际的undo log回滚日志,如下图所示:在这里插入图片描述
事务B修改了值为值B,此时表里的那行数据的值就是值B了,那行数据的txr_id就是事务B的id,也就是58,roll_pointer指向了undo log,这个undo log就记录你更新之前的那条数据的值。roll_pointer指向的那个undo log,里面的值是值A,txr_id是50,因为undo log里记录的这个值是事务A插入的,所以这个undo log的txr_id就是50。

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值