MVCC(Multiversion Concurrency Control)

背景:对于InnoDb的数据库的引擎,基于一种行级锁的实现,当我们操作数据库的时候,为了保证读取数据的正确性,往往伴随锁,MVCC(多版本并发控制)使得使用锁的数据库,不再单纯的使用锁实现并发,利用行的多个版本和行锁结合起来,如此MVCC可以用多版本的非锁机制完成对数据库并发控制

原理

        MVCC只是一种机制,就是我们所谓的一种规范,接口,只是定义了概念,具体的实现看各种引擎(文章中我们着重以InnoDb引擎),通过保存 数据某一个时间点的快照。

        MVCC是一种行级锁的妥协,多线程事务读取时,避免使用锁,可以非堵塞的读,但是写操作时锁定必要的行

 典型的实现有乐观锁和非乐观锁

  乐观锁: 对于数据库的操作,保持一种拥抱的态度,等到问题的出现才上锁(InnoDb的数据库引擎)

  悲观所:对于数据库的操作,保持一种抵触的态度,就是觉得只要是操作都会出事,所以不管什么操作都上锁,其他的操作都要等该锁释放

InnoDB的MVCC的实现

    数据库中每一行保存的数据后面有两个隐藏列,当前列创建 的版本号和删除的版本号(删除的版本号可能没有),这里的版本号不是指的是时间,可以理解为事务的代号(便于理解我们就当当前的数据库为null,添加数据时,这时候我们理解版本号为1,以后的操作都会+1操作)

问题:什么叫多版本的控制?

每一次事务开启的时候,都会有一个唯一的递增的版本号

   以下的操作(参照大佬的博客https://www.cnblogs.com/dongqingswt/p/3460440.html)

1、在插入操作时 : 记录的创建版本号就是事务版本号。 

比如我插入一条记录, 事务id 假设是1 ,那么记录如下:也就是说,创建版本号就是事务版本号。

插入数据的时,先生成一个事务的id,创建的版本对于当前额事务id

id  name  create version  delete version  
1test  1

2、在更新操作的时候,采用的是先标记旧的那行记录为已删除,并且删除版本号是事务版本号,然后插入一行新的记录的方式。 

比如,针对上面那行记录,事务Id为2 要把name字段更新

update table set name= 'new_value' where id=1;

id    name  create version  delete version  
1  test  12        
1  new_value  2

3、删除操作的时候,就把事务版本号作为删除版本号。比如

delete from table where id=1; 

id  name  create version  delete version  
1new_value23  

4、查询操作: ( 创建的版本 <= 当前事务版本 < 删除的版本 )

从上面的描述可以看到,在查询时要符合以下两个条件的记录才能被事务查询出来: 

1) 删除版本号 大于 当前事务版本号,就是说删除操作是在当前事务启动之后做的。 

2) 创建版本号 小于或者等于 当前事务版本号 ,就是说记录创建是在事务中(等于的情况)或者事务启动之前。

这样就保证了各个事务互不影响。从这里也可以体会到一种提高系统性能的思路,就是: 

通过版本号来减少锁的争用。

总结:

         其实说的重点,所谓的多版本指的就是undo log的行,应用的场景就是并发非堵塞读

         

  • 每行数据都存在一个版本,每次数据更新时都更新该版本
  • 修改时Copy出当前版本随意修改,各个事务之间无干扰
  • 保存时比较版本号,如果成功(commit),则覆盖原记录;失败则放弃copy(rollback)

就是每行都有版本号,保存时根据版本号决定是否成功,听起来含有乐观锁的味道,而Innodb的实现方式是:

  • 事务以排他锁的形式修改原始数据
  • 把修改前的数据存放于undo log,通过回滚指针与主数据关联
  • 修改成功(commit)啥都不做,失败则恢复undo log中的数据(rollback)

二者最本质的区别是,当修改数据时是否要排他锁定

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值