加入收藏 | 设为首页 | 会员中心 | 我要投稿 南京站长网 (https://www.025zz.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 移动互联 > 通讯 > 正文

如何理解MySQL中的MVCC

发布时间:2021-12-20 10:57:46 所属栏目:通讯 来源:互联网
导读:这篇文章将为大家详细讲解有关怎么理解MySQL中的MVCC,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 关系数据库管理系统使用MVCC(Multiversion Concurrency Control多版本并发控制)来避免写操作堵塞读
这篇文章将为大家详细讲解有关怎么理解MySQL中的MVCC,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。
 
关系数据库管理系统使用MVCC(Multiversion Concurrency Control多版本并发控制)来避免写操作堵塞读操作的并发问题,MVCC也就是通过使用数据的多个版本保证并发读写不冲突的一种机制,不同的数据库有不同的实现,这也是数据库系统让人头疼的地方.
 
MVCC的两种不同实现方式
 
  第一种实现方式是将数据记录的多个版本保存在数据库中,当这些不同版本数据不再需要时,垃圾收集器回收这些记录。这个方式被PostgreSQL和Firebird/Interbase采用,SQL Server使用的类似机制,所不同的是旧版本数据不是保存在数据库中,而保存在不同于主数据库的另外一个数据库tempdb中/
 
  第二种实现方式只在数据库保存最新版本的数据,但是会在使用undo时动态重构旧版本数据,这种方式被Oracle和MySQL/InnoDB使用。
 
MVCC是为了解决什么问题?
 
做了简单修改,我们做一些简单的例子来说明。
 
1)、在插入操作时 :记录的创建版本号就是事务版本号。
 
比如插入一条记录, 事务id 假设是1,那么记录如下:也就是说,创建版本号就是事务版本号。
 
id   name   create version   delete version  
1 test   1
2)、在更新操作的时候,采用的是先标记旧的那行记录为已删除,并且删除版本号是事务版本号,然后插入一行新的记录的方式。 比如,针对上面那行记录,事务id为2 要把name字段更新,
 
update table set name= 'new_value' where id=1;
 
id  name  create version  delete version 
1   test   1 2        
1   new_value   2
3)、删除操作的时候,就把事务版本号作为删除版本号。比如
 
delete from table where id=1;
 
id   name   create version   delete version  
1 new_value 2 3  
4)、查询操作:
 
从上面的描述可以看到,在查询时要符合以下两个条件的记录才能被事务查询出来:
 
    (1) 删除版本号 大于当前事务版本号,就是说删除操作是在当前事务启动之后做的。
 
    (2) 创建版本号 小于或者等于 当前事务版本号,就是说记录创建是在事务中(等于的情况)或者事务启动之前。
 
这样就保证了各个事务互不影响。从这里也可以体会到一种提高系统性能的思路,就是: 通过版本号来减少锁的争用。
 
另外,只有read-committed和 repeatable-read 两种事务隔离级别才能使用MVCC,read-uncommited由于是读到未提交的,所以不存在版本的问题而serializable 则会对所有读取的行加锁。
 
   当然上面的内容都是二次吸收,做了一些过滤和简单总结,后续会持续总结和认真分析,对比一下Oracle和MySQL MVCC的异同,MVCC的缺陷等。
 
关于怎么理解MySQL中的MVCC就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

(编辑:南京站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读