mysql实现中MVCC简介


前言

MVCC是多版本并发控制。MVCC在Mysql InnoDB中实现主要是为了提高数据库并发性能,用户更好的方式去处理文件读写冲突,做到即使有读写冲突是,也能做到不加锁,进行非阻塞并发读。


一、当前读

像select locak in share mode(共享锁),select for update,update ,insert,delete(排它锁)这些操作都是当前读。
什么事当前读,就是读取记录的最新版本,读取是还要保证其他并发事务不能修改记录,会对读取的记录进行加锁。

二、快照读

  1. 不加锁的select操作就是快照读,就是不加锁的非阻塞读。
  2. 快照读的前提事务隔离级别不是串行,串行级别下就会变成当前读。
  3. 快照读之所以出现就是基于多版本并发控制(MVCC),提高并发性能的考虑。
  4. MVCC是行级锁的变种,可以避免加锁操作,降低开销。
  5. 可能读取不是当前最新版本,有可能是的历史版本。

三、当前读、快照读、MVCC关系

MVCC多版本并发控制指的是维持一个数据的多个版本,使读写操作没有冲突,快照读是mysql为实现MVCC的一个非阻塞功能。MVCC模块在mysql中的具体实现是由三个隐式字段,undo 日志、read view 三个组件来实现。

四、MVCC解决的问题

MVCC是一种用来解决读写冲突的无锁并发控制,也就是为事务分配单项增长的时间戳,为每个修改保存一个版本,版本与事务时间戳关联,读操作只读该事务开始前的数据库的快照,所以MVCC可以数据库以下解决问题:

  1. 在并发读写数据库时,可以做到在读操作时不用阻塞写操作,写操作也不用阻塞读操作,提高了数据库并发读写的性能。
  2. 解决脏读、幻读、不可重复读等事务隔离问题,但不能解决更新丢失问题(写写)。

五、MVCC实现原理

MVCC实现原理依赖于记录中的三个隐式字段,undo log、read view 三个组件来实现
隐藏字段:每行记录除了我们自定义的字段外,还有数据库隐式定义的DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID等字段。
DB_TRX_ID:6字节,最新修改的事务ID,记录创建这条记录或最后一次修改该记录的事务ID。
DB_ROLL_PTR:7字节,回滚指针,指向这条记录的上一个版本,用户于配合undolog ,指向上一个旧版本
DB_ROW_ID:6字节,隐藏的主键,如果数据表没有主键,那么innodb会自动生成一个唯一键。

隐藏字段

如图所示,可以看到的隐藏字段字段可以通过的undoLog查询的历史数据,可以做到事务的回滚,并发版本的控制。

在这里插入图片描述

Read view

三个全局属性:

trx_list:一个数值列表,用来维护read view 生成此刻系统正活跃的事务ID
up_limit_id:记录trx_list列表中最小事务ID
low_limit_id:read view生成的下一个事务ID

本质:

其实read view 的最大作用是用来做可见性判断,也就是说当某个事务再执行快照读的时候,对该记录的read view的视图进行记录,把它当做条件去判断当前事务能看到那个版本的数据,可能是最新的数据,可能是undo log里面的数据。
read view遵循的可见性算法主要将被修改的数据的最新记录中DB_TRX_ID(当前事务ID)取出,与系统当前活跃事务ID去比较,如果DB_TRX_ID跟Read view 的属性进行比较,不符合可见性,那么就通过DB_ROLL_PTR去undolog中的DB_TRX_ID做比较,找到当前事务最新的老数据。

比较规则
1、首先比较 DB_TRX_ID< up_limit_id 
		true  当前事务能看到DB_TRX_ID的记录
		false 进入下个判断
2、判断 DB_TRX_ID >= low_limit_id:read 
		true 说明当前的DB_TRX_ID 是在read view 生成之后,应该不可见。
		false 进入下个判断
3、DB_TRX_ID在不在trx_list(活跃事务)中
		true 说明DB_TRX_ID代表的事务还没有commit(提交),对应当前事务不可见。
		false 这个事务在read view 之前已经提交,可以看到记录数据。

六、RC、RR级别下的InnoDB快照读不同点

因为read view 生成的时机不同,就会导致的RC(读已提交)和RR(可重复度)级别下快照读的结果不同。
在RC隔离级别下,每个快照读都会产出并获取最新的read view ,而在RR隔离级别下,则同一个事务中的第一个快照读才会创建read view ,之后的快照读获取的都是同一个read view .

mysql面试总结

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值