当前位置:网站首页>MVCC多版本并发控制
MVCC多版本并发控制
2022-07-17 21:15:00 【何以解忧,唯有..】
一、概要
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读。
MVCC的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突,它的实现原理主要是依赖记录中的 3个隐式字段,undo log ,read view 来实现的。
二、3个隐式字段
每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段
1、DB_TRX_ID
6byte,最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务ID
2、DB_ROLL_PTR
7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment里)
3、DB_ROW_ID
6byte,隐含的自增ID(隐藏主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引
DB_ROW_ID是数据库默认为该行记录生成的唯一隐式主键,DB_TRX_ID是当前操作该记录的事务ID,而DB_ROLL_PTR是一个回滚指针,用于配合undo日志,指向上一个旧版本。


三、undo log
undo log主要分为两种:
1、insert undo log
代表事务在insert新记录时产生的undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃。
2、update undo log
事务在进行update或delete时产生的undo log; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被purge线程统一清除。
purge线程:
从前面的分析可以看出,为了实现InnoDB的MVCC机制,更新或者删除操作都只是设置一下老记录的deleted_bit,并不真正将过时的记录删除。
为了节省磁盘空间,InnoDB有专门的purge线程来清理deleted_bit为true的记录。为了不影响MVCC的正常工作,purge线程自己也维护了一个read view(这个read view相当于系统中最老活跃事务的read view);如果某个记录的deleted_bit为true,并且DB_TRX_ID相对于purge线程的read view可见,那么这条记录一定是可以被安全清除的。
对MVCC有帮助的实质是update undo log ,undo log实际上就是存在rollback segment中旧记录链。
四、read view
什么是Read View,说白了Read View就是事务进行快照读操作的时候生产的读视图(Read View),在该事务执行的快照读的那一刻,会生成数据库系统当前的一个快照,记录并维护系统当前活跃事务的ID(当每个事务开启时,都会被分配一个ID, 这个ID是递增的,所以最新的事务,ID值越大)
所以我们知道 Read View主要是用来做可见性判断的, 即当我们某个事务执行快照读的时候,对该记录创建一个Read View读视图,把它比作条件用来判断当前事务能够看到哪个版本的数据,既可能是当前最新的数据,也有可能是该行记录的undo log里面的某个版本的数据。
Read View遵循一个可见性算法,主要是将要被修改的数据的最新记录中的DB_TRX_ID(即当前事务ID)取出来,与系统当前其他活跃事务的ID去对比(由Read View维护),如果DB_TRX_ID跟Read View的属性做了某些比较,不符合可见性,那就通过DB_ROLL_PTR回滚指针去取出Undo Log中的DB_TRX_ID再比较,即遍历链表的DB_TRX_ID(从链首到链尾,即从最近的一次修改查起),直到找到满足特定条件的DB_TRX_ID, 那么这个DB_TRX_ID所在的旧记录就是当前事务能看见的最新老版本。
边栏推荐
- Tke mounts CFS across cloud networking
- Pyside2嵌入Matplotlib的绘图
- ShanDong Multi-University Training #3
- Luo Gu: p3092 [usaco13nov]no change G
- 通达信开户是真的吗?通达信开户安全吗?
- 洛谷:P3092 [USACO13NOV]No Change G(状压+二分,独特的状态定义,不写会后悔一辈子的题)
- Overview report of Chinese AI medical imaging industry in 2022
- [dynamic programming] - longest ascending subsequence model
- Redis source code and design analysis -- 3 Dictionaries
- The manual is not complete. How to manually dig out the monitoring information of tongweb?
猜你喜欢

(with source code) a variety of machine learning models (knn\lr\rf\ada\xg\gbdt...) Model training in precipitation downscaling under

Keil环境下STM32定位hardfault位置方法和遇到的情况

O'Neill's RPS curve compilation method (original by Dr. Tao)

Silent AI: how does shengteng AI solve the problem of sign language learning with large models?

暑期rhcsa培训第一天作业

Redis source code and design analysis -- 2 Linked list

STM32 positioning hardfault location method and encountered situation in keil environment

matplotlib绘制多折线图(解决matplotlib中文无法显示问题)

Tongweb production system emergency treatment plan
![Optimal biking strategy [DP + two points]](/img/04/b4efa6af3ddc1efd8bca85da76c151.png)
Optimal biking strategy [DP + two points]
随机推荐
Can ping command still play like this?
Luogu p3512 [poi2010] PIL pilots problem solution
Tree and bipartite graph [thinking]
Opencv template
第二届「绿树杯」数学竞赛排名与评析
009 execution sequence of SQL statement of interview questions
看一看try{}catch{}
华为无线设备配置智能漫游
How to quickly calculate the FID, is, sfid, precision, recall and other key evaluation indicators of the generated model?
无声的AI:昇腾AI如何用大模型破解手语学习的难题?
Initial understanding of functions - next
Chrome plug-ins for information collection
同一宿主机不同容器网络通信流程分析
4 a company has branches in six cities C1, C2, C3... C6. The connection between cities Ci and CJ (I, j=1,2,3,... 6) and the cost are listed in the following weighted adjacency matrix C
Prefix Equality 【DP | 哈希】
Unity realizes UI backpack equipment dragging function
Huawei wireless device configuration intelligent roaming
C # read and write text and generate QR code
matplotlib绘制多折线图(解决matplotlib中文无法显示问题)
Robotics at google:laura Graesser | i-sim2real: strengthen the learning robot strategy in the close human-computer interaction cycle