MVCC实现原理

  • Post author:
  • Post category:其他




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

在这里插入图片描述



版权声明:本文为qq_45948401原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。