mysql mvcc的原理

先说明一下写这个文章的缘故吧,开始接触mvcc的时候,只是在脑海里面有个概念,知道这可重复读这个隔离级别的时候,使用mvcc解决多个事务下的数据行操作的冲突,这时候主要对比select、update以及insert的时候对数据的可见性,主要还是select在什么时候可以看到更新或者插入数据的操作。

经过各种文章的阅读,总算是明白了,明白了其实也简单了,就自己的理解进行说明一下mvcc是怎么回事。

 1 mvcc的概念

  MVCC全称是: Multiversion concurrency control,多版本并发控制,提供并发访问数据库时,对事务内读取的到的内存做处理,用来避免写操作堵塞读操作的并发问题。

首先说明mysql的隔离级别默认是可重复读,在这个情况下,对读加事务的操作下,不会影响到写和更新操作,只是更新和写的操作会影响到读的结果。

2 对比场景说明

要注意几个概念:

a 每行数据里面隐藏了两个字段,创建事务的版本,删除事务的版本。说明下,这两个概念开始让我感到很头疼,不知道是啥东西,最后还是结合了例子才明白这两个隐藏的字段是干什么的。

如果从命令上去理解这个过程,可能优点费劲,先从我们常用的场景来理解吧,现在的web应用一般分为三层,view,controller和service,在service里面处理业务逻辑,当涉及到和数据库交互的时候,我们会加入事务,这个事务会具体作用到数据库上,不管是读还是写,或者是更新删除,这些事务无一例外会记录到一张数据库表中,这个表叫做事务版本管理表information_schema.INNODB_TRX,会把每个事务根据id递增的方式创建一条记录,有个字段交tx_id,这个是事务ID,也可以称为是事务的版本号,这个表中增加的同时,也会相应的更新到记录行中的隐藏字段--创建事务的版本、删除事务的版本中,当然这个操作需要看你是什么操作,如果是insert,那么只更新创建事务的版本;

如果是update,则会先删除过去的记录,并将删除版本号存入,再创建一个新记录,新记录里面的创建版本号是本事务的版本号。

 

文字的描述是枯燥的,如果结合图那么可能会好些。

1 insert

2 delete

删除时先向事务表中创建一条记录,然后将delVer标志标记为对应的id号

3 update ,该操作是先del,再insert

4 read ,读取时,只能读取到事务id号小于createrVer或者delVer版本号的数据

以上1、2、3步的操作都是为了4做准备的,这样保持了数据的可重复读。

对于幻读,使用间隙锁和临键锁解决的。

比如一条查询

select * from user where age=10

这个简单的查询会将age=10的记录锁上,1、2、3操作会被阻止,直到该事务结束。

这块可以查看参考该篇文章

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值