【MVCC、Undolog、Redolog】

目录

前言

一、MVCC是什么?

1.MVCC实现三个要素

二、Undolog

三、Redolog

总结



前言

MVCC与Undolog、Redolog这几种曾让我很困惑,最近看了好多文章,结合自己理解,记录下来,好记性不如烂笔头


提示:以下是本篇文章正文内容,下面案例可供参考

一、MVCC是什么?

MVCC(Multiversion Concurrency Control),即多版本并发控制技术,它使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,取而代之的是把数据库的行锁与行的多个版本结合起来,只需要很小的开销,就可以实现非锁定读,从而大大提高数据库系统的并发性能。

个人理解:当前事务读取时,不必加锁,根据规则读取可以显示的版本记录,也就是快照读

1.MVCC实现三个要素

  隐藏字段、undolog、readvidw

- 隐藏字段

每一行数据中有创建者自己设置的字段,还有mysql自动给增加的隐藏字段,主要是DATA_TRX_ID(事务id)和DATA_ROLL_PTR(旧版本undolog指针)

id name age DATA_TRX_ID DATA_ROLL_PTR
1 小明 18 3 0x123fff
2 小刚 20 2 0x434fff

DATA_TRX_ID:指的是当前记录的事务id

DATA_ROLL_PTR:指向undolog的上一版本的地址

- undolog 

undolog会记录事务前老版本数据,然后行记录中回滚指针会指向老版本位置,如此形成一条版本链。因此可以利用undo log实现回滚,保证原子性,同时用于实现MVCC版本链。

个人理解:数据操作时,会将之前记录存入到undolog里,然后用指针进行连接起来的一个链表,这样可以保证事务失败时可以进行回滚,保证事务的原子性,还有可以通过事务id根据算法找到当前可以读的版本,也就是快照读

比如:数据更新,将age从18变成20,旧记录就会存入undolog,存储的地址为0xffff,事务id会新增,多个版本会以链表进行存入undolog日志中。

【MVCC、Undolog、Redolog】_第1张图片

 - readview

前面提到的判断某一个快照读能读到哪些版本,按照某种算法,这个readView就是该算法的关键。有以下几个变量。

  • m_ids:表示在生成ReadView时当前系统中活跃的读写事务的事务id列表(未提交的事务)。

  • min_trx_id:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id,也就是m_ids中的最小值。

  • max_trx_id:表示生成ReadView时系统中应该分配给下一个事务的id值。

    小贴士: 注意max_trx_id并不是m_ids中的最大值,事务id是递增分配的。比方说现在有id为1,2,3这三个事务,之后id为3的事务提交了。那么一个新的读事务在生成ReadView时,m_ids就包括1和2,min_trx_id的值就是1,max_trx_id的值就是4。

  • creator_trx_id:表示生成该ReadView的事务的事务id

具体算法:

               【MVCC、Undolog、Redolog】_第2张图片

 参考连接:MVCC ReadView介绍 - IUNI_JM - 博客园

二、Undolog

详见上面

三、Redolog

MySQL作为一个存储系统,为了保证数据的可靠性,最终得落盘。但是,又为了数据写入的速度,需要引入基于内存的"缓冲池"。既然数据是先缓存在缓冲池中,然后再以某种方式刷新到磁盘,那么就存在因宕机导致的缓冲池中的数据丢失,为了解决这种情况下的数据丢失问题,引入了redo log。保证了数据的持久性

redolog的大小是固定的,在mysql中可以通过修改配置参数innodb_log_files_in_group和innodb_log_file_size配置日志文件数量和每个日志文件大小,redolog采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。

【MVCC、Undolog、Redolog】_第3张图片


write pos->checkpoint之间的部分是redo log空着的部分,用于记录新的记录,

checkpoint->write pos之间是redo log待落盘的数据修改记录

参考连接:mysql日志系统之redo log和bin log - 简书


总结

以上是我对这三者的一个学习的记录,多写一点可能更熟悉一点。

你可能感兴趣的:(mysql,数据库)