mvcc(多版本并发控制)

mvcc:多版本并发控制,指的是一条记录会有多个版本,当数据发生改变时,会记录版本修改前的记录,多个版本穿成一个版本链,事务可以无锁的获取每一个版本的事物。

实际上InnoDB不会真的存储多个版本,只是借助了undolog记录了每次写操作的的反向操作,所以索引上之后有一个版本,即最新版本。只不过是因为undolog记录了每次写操作的反向操作所以看起来像多版本。

mysql的隔离级别有四个:读未提交,读已提交,可重复读和串行读。

mvcc用来实现读已提交和可重复读。如果隔离级别是读未提交的话是允许脏读的直接读最新的数据就好了,串行读的隔离级别会将所有事务都排好队了,不存在都线程并发所以也不需要用到mvcc。

要实现mvcc,mysql使用了隐藏字段,undo-log和readview三个方面。

隐藏字段

row_id:对于InnoDB引擎来说,由于其表的数据是按照聚簇索引来存储的。所以通常都会使用主键来作为聚簇,然后基于主键字段来构建索引树。但是如果表中没有主键则会使用一个非空且唯一的字段来构建索引树。如果以上两个条件都无法满足的时候,InnoDB就会隐式的创建一个顺序递增的row_id来作为聚簇索引列。这个列只是给InnoDB构建索引树使用,外部无法使用。

Deleted_Bit(删除标示):当我们删除掉某一条数据时,mysql并不是把他真的删除掉了,而是在Deleted_Bit字段进行了维护,删除标示修改为了1/true。后续当我们查询的时候mysql检索到了该条数据发现Deleted_Bit的字段已经修改为了1/true所以并不会把该条数据放在结果集里。设计该字段的是由于删除任何一条数据都可能改变树的结构,造成叶子节点合并,并且在回滚事务的时候也不会造成叶子节点分裂。当然,这些数据也不是会一直不删除的,purger线程会自动清理Deleted_Bit=1/true的行数据。

TRX_ID(事务id):全称transaction_id,翻译过来就是事务id。mysql会为每一个事务分配一个事务id,递增的。

ROLL_TR:回滚指针,当一个事务进行操作之后,mysql会将其存在undo-log中,该字段维护的就是旧版本的一个地址指针。

undo-log:

        就是一条数据会有多个版本,通过回滚指针进行关联。就是文章开头说的多版本组成一个版本链,最新的数据会加入到链头。

read_view:

        当一个事务尝试读取一行数据的时候,mvcc根据当前mysql的运行状态生成的一个快照,也称为读视图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值