浅谈MVCC

一、什么是MVCC

mvcc是mysql的多版本控制器,主要用来处理mysql的多并发问题。

二、能解决什么问题

读读:本身不会有冲突,所以也不需要进行并发管理。
读写:有线程安全性的问题,容易造成是事务隔离性的问题,从而出现幻读、脏读、不可重复读。
写写:有线程安全性的问题,会出现数据的更新丢失问题。

mvcc主要解决的是读写和写读的冲突问题,
mvcc+悲观锁/乐观锁,其中mvcc解决读写冲突,悲观锁/乐观锁解决写写冲突。

三、两种读方法

当前读:对该记录进行加锁后的读
快照读:使用mvcc概念进行的对记录的读取,此时如果有事务写入,不会影响写入的记录,可以把mvcc理解为行锁的一种特殊情况。不可读当前行事务开启后事务的修改信息。(另一种说法是通过 undo log + 数据行获取到事务开启时的原始数据的过程,称为快照读,表述不一样而已,这种说法更显专业)

四、MVCC实现原理

mvcc的实现原理主要是依靠记录中的3个隐藏字段、undo日志、read view。

1、隐藏字段

3个隐藏字段:DB_trx_id、DB_row_id、DB_roll_ptr。

DB_trx_id:事务id是用来控制事务的版本迭代的。
DB_row_id:主键id是用来识别行数据的。
DB_roll_ptr:回滚指针主要是用来记录上一次版本号。

2、undo日志

undo日志主要分为两种:
1)在插入时产生的undo日志,主要用来对事务进行回滚,提交事务后就可以丢弃。
2)在删除或修改时产生的undo日志,除了事务回滚,在快照读时也需要,只有前两者不再涉及此类日志时,才会由purge线程进行清理。

在更新或者删除时,只会将deleted_bit值设为true,并不会马上清理,只有到达innodb_purge_batch_size值或innodb_max_purge_lag_delay值时才会去清理。
在不同事务或者相同事务对同一记录进行修改时,会使undo日志成为一个链表,表首为最新的数据,表尾为最旧的数据。

3、read view

事务在进行快照读时产生的读视图。主要是对DB_trx_id字段的值作比较,以便取出最新的记录。

trx_list:一个数值列表,主要是维护read view此时正活跃的事务id
up_limit_id:记录列表中最小的id
low_limit_id:记录read view生成时的下一个id

read view流程:
首先DB_trx_id<up_limit_id进行比较,如果成立,则当前事务可以查看DB_trx_id所在的记录,否则进入下一判断。
然后DB_trx_id >= low_limit_id进行比较,若成立,表示DB_trx_id所在的记录是在read view生成之后才出现的,那对当前事务不可见,否则进入下一判断。
判断DB_trx_id是否在活跃事务中,如果在,表示当前事务还未commit,当前修改无法看到,如果不在表示已经commit,当前事务可以取到已修改的值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值