MySQL中MVCC机制的实现原理
前言
MVCC全称为Multi Version Concurrency Control
,直译为多版本并发控制
,是MySQL中一种并发控制的方法,他主要是为了提高数据库的读写性能,用更好的方式去处理读写冲突。
什么是当前读和快照读?
在讲述MVCC机制实现原理之前,我们先了解一下当前读和快照读
当前读:
其实也很容易理解,当前读指的就是读取的是最新的记录,读取的时候还需要保证其他事务不能修改当前记录,所以会对读取的记录进行加锁处理
例如:select for update 、update、insert、delete这些操作都是当前读
快照读:
而快照读也就是不加锁的select,不过需要注意的是快照读的前提是隔离级别不能是serializable(可串行化),之所以出现快照读,是基于提高并发性能的考虑
其实可以简单理解成MVCC就是为了实现读写冲突的时候不去加锁
MVCC的实现原理
其实在MySQL中每一条记录都会有一些隐藏字段,而在MVCC机制中,用处最大的就是trx_id
,roll_pointer
分别代表着操作这条记录的事务的事务ID,和回滚指针(指向当前记录行的undo log信息),倘若这条记录没有主键,还包含一个隐含的主键ID
在每一个事务开启之前,都会先从数据库中拿到一个自增的事务ID
对于undo log
很明显这就是一个日志文件,记录着insert、update、delete,我们在进行删除的时候,其实innodb引擎并没有真正的删除,其实是将一个记录的一个隐含字段修改了,让我们去搜索的时候搜索不到,所以我们可以知道在undo log中只存在两种日志,一种是insert undo log
,一种是update undo log
undo log的作用就是为了保存版本链,而前面我们说的roll_pointer
这个字段就是指向的这里
为了保证可见性,当事务发起快照读的时候,就会产生一个Read View(读视图),Read View 保存了当前事务开启时所有活跃的事务列表,或者可以理解为保存了其他事务的ID列表
Read View有几个重要属性:
- trx_ids:当前系统中活跃的事务ID
- low_limit_id:目前出现的最大的事务ID+1,也就是下一个将被分配的事务ID
- up_limit_id:活跃事务列表中最小的id
- creator_trx_id:当前事务的ID
而对于Read View的可见性规则:
- 如果访问版本事务id = creator_trx_id 那么证明该事务操作的就是自己修改过的记录
- 如果访问版本事务id < up_limit_id 那么证明生成该版本的事务已经提交
- 如果访问版本事务id > low_limit_id,那么表示生成该版本的事务还没有提交不能被访问
- 如果访问版本事务id > up_limit_id 且 id < low_limit_id,那么判断该事务id是否在活跃列表中,如果在证明还未提交不能被访问,反之亦然
到此这篇关于MySQL中MVCC机制的实现原理的文章就介绍到这了,更多相关MySQL MVCC机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
MySQL中dd::columns表结构转table过程及应用详解
MySQL的dd表是用来存放表结构和各种建表信息的,客户端建的表都存在mysql.table和mysql.columns表里,还有一个表mysql.column_type_elements比较特殊,用来存放SET和ENUM类型的字段集合值信息,对mysql dd::columns表结构相关知识感兴趣的朋友一起看看吧2022-09-09解决MySQL启动报错:ERROR 2003 (HY000): Can''t connect to MySQL serv
这篇文章主要介绍了解决MySQL启动报错:ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061),本文解释了如何解决该问题,以下就是详细内容,需要的朋友可以参考下2021-07-07win10 安装mysql 8.0.18-winx64的步骤详解
这篇文章主要介绍了win10 安装mysql 8.0.18-winx64的步骤,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下2019-11-11
最新评论