英文网站域名注册,九一人才网找工作赣州官网,公司网站建设精品,网站建设经费什么是MVCC#xff1f;
MVCC#xff0c;即Multi-Version Concurrency Control #xff08;多版本并发控制#xff09;。它是一种并发控制的方法#xff0c;一般在数据库管理系统中#xff0c;实现对数据库的并发访问#xff0c;在编程语言中实现事务内存。 通俗的讲
MVCC即Multi-Version Concurrency Control 多版本并发控制。它是一种并发控制的方法一般在数据库管理系统中实现对数据库的并发访问在编程语言中实现事务内存。 通俗的讲数据库中同时存在多个版本的数据并不是整个数据库的多个版本而是某一条记录的多个版本同时存在在某个事务对其进行操作的时候需要查看这一条记录的隐藏列事务版本id比对事务id并根据事物隔离级别去判断读取哪个版本的数据。 数据库隔离级别读已提交、可重复读 都是基于MVCC实现的相对于加锁简单粗暴的方式它用更好的方式去处理读写冲突能有效提高数据库并发性能。
MVCC实现的关键知识点
事务版本号
事务每次开启前都会从数据库获得一个自增长的事务ID可以从事务ID判断事务的执行先后顺序。这就是事务版本号。
隐式字段
对于InnoDB存储引擎每一行记录都有两个隐藏列trx_id、roll_pointer如果表中没有主键和非NULL唯一键时则还会有第三个隐藏的主键列row_id。 undo log
undo log回滚日志用于记录数据被修改前的信息。在表记录修改之前会先把数据拷贝到undo log里如果事务回滚即可以通过undo log来还原数据。 可以这样认为当delete一条记录时undo log 中会记录一条对应的insert记录当update一条记录时它记录一条对应相反的update记录。
undo log有什么用途呢
事务回滚时保证原子性和一致性用于MVCC快照读
版本链
多个事务并行操作某一行数据时不同事务对该行数据的修改会产生多个版本然后通过回滚指针roll_pointer连成一个链表这个链表就称为版本链。如下 其实通过版本链我们就可以看出事务版本号、表格隐藏的列和undo log它们之间的关系。我们再来小分析一下。 1.假设现在有一张core_user表表里面有一条数据,id为1名字为孙权 2.现在开启一个事务A 对core_user表执行update core_user set name 曹操 where id1,会进行如下流程操作
首先获得一个事务ID100把core_user表修改前的数据,拷贝到undo log修改core_user表中id1的数据名字改为曹操把修改后的数据事务Id101改成当前事务版本号并把roll_pointer指向undo log数据地址。 快照读和当前读
快照读
读取的是记录数据的可见版本有旧的版本。不加锁,普通的select语句都是快照读,如
select * from core_user where id 2;
当前读
读取的是记录数据的最新版本显式加锁的都是当前读
select * from core_user where id 2 for update;
select * from account where id2 lock in share mode;
Read View
Read View是什么呢 它就是事务执行SQL语句时产生的读视图。实际上在innodb中每个SQL语句执行前都会得到一个Read View。Read View有什么用呢 它主要是用来做可见性判断的即判断当前事务可见哪个版本的数据~
Read View是如何保证可见性判断的呢我们先看看Read view 的几个重要属性
m_ids:当前系统中那些活跃(未提交)的读写事务ID, 它数据结构为一个List。min_limit_id:表示在生成ReadView时当前系统中活跃的读写事务中最小的事务id即m_ids中的最小值。max_limit_id:表示生成ReadView时系统中应该分配给下一个事务的id值。creator_trx_id: 创建当前read view的事务ID
Read view 匹配条件规则如下
如果数据事务ID trx_id min_limit_id表明生成该版本的事务在生成Read View前已经提交(因为事务ID是递增的)所以该版本可以被当前事务访问。如果trx_id max_limit_id表明生成该版本的事务在生成ReadView后才生成所以该版本不可以被当前事务访问。如果 min_limit_id trx_id max_limit_id,需腰分3种情况讨论 1.如果m_ids包含trx_id,则代表Read View生成时刻这个事务还未提交但是如果数据的trx_id等于creator_trx_id的话表明数据是自己生成的因此是可见的。2如果m_ids包含trx_id并且trx_id不等于creator_trx_id则Read View生成时事务未提交并且不是自己生产的所以当前事务也是看不见的3.如果m_ids不包含trx_id则说明你这个事务在Read View生成之前就已经提交了修改的结果当前事务是能看见的。 MVCC实现原理分析
查询一条记录基于MVCC是怎样的流程
获取事务自己的版本号即事务ID获取Read View查询得到的数据然后Read View中的事务版本号进行比较。如果不符合Read View的可见性规则 即就需要Undo log中历史快照;最后返回符合规则的数据
InnoDB 实现MVCC是通过 Read View Undo Log 实现的Undo Log 保存了历史快照Read View可见性规则帮助判断当前版本的数据是否可见。