钜形不锈钢水箱 发表于 2024-10-27 02:57:12

MySQL 初阶——多版本控制 MVCC

一、版本链(undo 日志)

a. 什么是版本链

版本链就是一条以事务为节点的单链表。其 next 指针指向前一个版本的事务。
b. 版本链的增删

当一个事务被完成时,这个事务就会被加入到版本链里去;当要回滚时,版本链就会删除一些节点,使得头节点是回滚后的事务的上一个旧版本。而如果要更新 MySQL 中的表的内容时,更新前的内容会被拷贝一份并加入版本链内里,然后再改表的内容,末了把这个事务 ID 在原来的旧版本上加 1.
举个例子,如果如今已经有这个记载:
https://i-blog.csdnimg.cn/direct/4d784395582a4150a88f3b1c9c71c649.png
1. 我们如今要把这个记载中的名字改成 “李四” ,要颠末以下步调:
      https://i-blog.csdnimg.cn/direct/3ec3e15d087c43fb8003117bebf9ab34.png       步调一:标题把原记载拷贝一份到 undo 日志中(添加到版本历史链中)      
      https://i-blog.csdnimg.cn/direct/3ac7a3910266447f867e158b80fc55ad.png       步调二:修改 name,事务 ID 和回滚指针,使其这向上一个版本的记载       再举个例子,如果我们要接着把“李四”的那条记载里的年龄改成 38 岁,也还是继续以下操作:
   https://i-blog.csdnimg.cn/direct/1264b1a56d154a0daa5929c5e6d679af.png   步调一:把李四那条记载拷贝一份到 undo 日志中(添加到历史版本链里)      https://i-blog.csdnimg.cn/direct/73e0b37067434c25b5e8add2b278f7af.png   步调二:修改年龄、事务 ID和回滚指针的指向,使其指向上一个版本的记载   
二、如何通过版本链实现多版本控制

a. 如何实现回滚?

其实原理很简单,就是把上一个版本的记载从 undo 日志拿出来,覆盖到当前版本上就行了。举个例子,如果我要回滚到最开始那条记载:
      https://i-blog.csdnimg.cn/direct/4d784395582a4150a88f3b1c9c71c649.png       最开始的那条记载       此时历史版本链为如许:
https://i-blog.csdnimg.cn/direct/73e0b37067434c25b5e8add2b278f7af.png
 那么 MySQL 就会按一下步调运行:
   https://i-blog.csdnimg.cn/direct/cd7a05278429469d92ab10a76de71497.png   步调一:第一次回滚      https://i-blog.csdnimg.cn/direct/c9e86a31f1044173942ff8b95c9b3d5f.png   步调二:第二次回滚,回滚完成    b. 历史版本链如何存插入、删除操作的事务 

其实也很简单,在拷贝记载时,如果是插入操作,就把进入 undo 日志的那条记载标志为删除操作;如果是删除操作,就把进入 undo 日志的那条记载标志为插入操作。到时候回滚时直接按着所记载的操作运行就行了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MySQL 初阶——多版本控制 MVCC