MVCC实现原理

MVCC是什么

        MVCC,Multi-version Concurrency Control多版本并发控制。是一种用来解决读写冲突的无锁并发控制。他通过为事务分配单项增长的时间戳,为每个修改保存一个版本。版本与事务时间戳相关联。读操作只读该事务开启之前的数据库的快照。所以MVCC可以为数据库解决以下问题:
        1、在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作时也不用阻塞读操作。提高了数据库并发读写的性能。
        2、能够解决脏读、不可重复读,以及一定程度的幻读等事务隔离性问题。但是不能够解决数据更新丢失的问题以及不能完全解决幻读的问题。

        MVCC只在事务隔离级别为RC和RR的时候生效。

MVCC主要依赖于三个隐藏字段,undolog和read view来实现的。

MVCC中存在三个隐藏字段:

在这里插入图片描述
事务每次开启前都会有从数据库获得一个自增长的事务id trx_id,MVCC通过事务的id判断事务的先后顺序。

undolog日志

        undolog日志记录了数据被修改前的信息。在表记录修改之前,会先把数据拷贝到undo log里,如果事务回滚,即可以通过undo log来还原数据

undo log细分为两种,insert时产生的undo log、update,delete时产生的undo log。

在Innodb中insert产生的undo log在提交事务之后就会被删除,因为新插入的数据没有历史版本,
所以无需维护undo log。

update和delete操作产生的undo log都属于一种类型,在事务回滚时需要,而且在快照读时也需要,
则需要维护多个版本信息。只有在快照读和事务回滚不涉及该日志时,对应的日志才会被purge线程统一删除。

原文链接:https://blog.csdn.net/jinwufeiyang/article/details/119578180

在这里插入图片描述

read view

        用来保证多个并行的事务之间能否读取到彼此的数据。

        当一个事务执行读操作时会产生一个读视图。这里的视图分为两种情况。RC(读已提交)会在每一次读操作时都会生成一个新的读视图,RR(可重复读)只会在第一次查询时生成读视图,之后的查询都是根据第一次查询的视图返回结果。

Read View是如何保证可见性判断的呢?Read View是如何保证可见性判断的呢?
        Read View中存在三个全局属性:
                1、trx_list:一个数值列表,用来维护ReadView生成时刻正在活跃的事务id
                2、up_limit_id:记录trx_list中的最小的事务id
                3、low_limit_id:生成时刻,系统尚未分配的下一个事务的id
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值