MVCC与事务总结

MVCC与事务的个人总结

undo_log(回滚日志)作用:用于回滚记录和MVCC(多版本并发控制)中构成undo_log(回滚日志)版本链
redo_log(重做日志):由redo_log_buffer(重做日志缓冲)和redo_log_file(重做日志文件)构成,前者在内存,后者在磁盘中。
作用:事务执行时,未提交之前,将修改的数据放入redo_log_buffer(重做日志缓冲),事务提交后,再将内存中的redo_log_buffer(重做日志缓冲)中的数据写入到磁盘的redo_log_file(重做日志文件)中。用以解决当内存缓冲区中的脏页刷新到物理磁盘出错时,通过redo_log_file(重做日志文件)进行数据回复,保证了事务的持久性。

MVCC个人总结:由三个隐藏字段+undo_log(回滚日志)版本链+readview(读视图)构成
解析如下:

三个隐藏字段
1.最近事务id字段:此行记录的最近一次执行的事务(已提交的事务)的id
2.回滚指针:指向此记录的上个历史版本地址
3.主键id,如果此表没有设置主键,系统默认设计隐藏主键id(对于MVCC没啥影响,无关紧要的隐藏字段)

undo_log(回滚日志)版本链
在执行并发事务的过程中,生成的关于历史记录版本的链条。链表头部指向最近一次的旧记录版本,尾部指向最早的旧纪录版本。

(活动事务表示在此表中的未提交的事务)
readview(读视图):由四个字段组成,如下:
1.活动事务集合
2.最小活动事务id
3.预分配事务id(就是最大活动事务id+1)
4.创建者事务活动id(表示当前的readview由哪个事务创建的)。

readview(读视图)的产生有两种情况
1.在隔离等级为RC(读已提交)的隔离等级下,每一次快照读(普通的不加锁的读就是快照读),都会产生一个readview(读视图)
2.在隔离等级为RR(可重复读)的隔离等级下,当前的事务中只有在第一条查询(快照读)时产生一个readview(读视图),后面的快照读复用第一次快照读时产生的readview

readview(读视图)的具体作用:根据当前记录的隐藏字段中的最近事务id字段,找到此次执行查询(快照读)操作的当前事务id,然后根据当前事务id找到在undo_log(回滚日志)版本链中的某个历史版本记录,然后将查询到的版本记录返回,此次返回的历史版本纪律就是快照读所查询的结果。

readview(读视图)根据当前事务id,查找回滚日志版本链中某条历史版本纪录的机制(规则):
1.当前事务id==创建者事务活动id,则可以访问该版本,说明数据就是由当前这个事务更改的
2.当前事务id<最小活动事务id,则可以访问该版本,说明数据已提交
3.当前事务id>预分配事务id,不可访问该版本,说明当前这个事务是在readview生成后才开启的
4.最小活动事务id<=当前事务id <=预分配事务id,同时如果当前事务id不在readview(读视图)的活动事务集合中,说明数据已提交,可以访问该版本

事物的四种特性
1.原子性:操作不可分割的最小单位,undo_log(回滚日志)保证了事务的原子性。
2.持久性:事务回滚或事务提交后,对数据的改变是永久的,redo_log(重做日志)保证了事务的持久性。
3.一致性:事务执行前后数据必须保持一致,即如果事务回滚则要与修改前的数据保持一致,如果事务提交则要保持与修改后的数据一致
undo_log(回滚日志)和redo_log(重做日志)共同保证了事务的一致性
4.隔离性:事务在不受外部并发操作影响的独立环境下运行,通过MVCC+锁保证了事务的隔离性。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值