首页 > 其他分享 >一文读懂〖MVCC〗多版本并发控制

一文读懂〖MVCC〗多版本并发控制

时间:2023-12-07 23:03:46浏览次数:29  
标签:事务 并发 ReadView 读懂 版本 MVCC 数据 ID

MVCC即多版本并发控制(Multi-Version Concurrency Control),是一种用于数据库管理系统的技术,主要用于提高数据库系统在并发操作下的性能,同时保证事务的一致性和隔离性。其核心思想是为每个读取的数据库对象(如行或记录)提供其事务时间点的快照,而不是锁定数据以防止其他事务访问。

一、MVCC的实现

MVCC中重要的概念和结构,包括2个隐藏列(如事务ID 和 回滚指针)以及2个数据结构(如事务链表 和 ReadView)。

  1. 事务ID(Transaction ID) :
  • 这是一个隐藏列,存储在每行数据中,用来标识最后修改该行的事务。
  • 事务ID是一个唯一的标识符,它帮助数据库确定数据的版本。

回滚指针(Rollback Pointer) :

  • 另一个隐藏列,指向存储旧数据版本的回滚段。
  • 当发生更新时,旧的数据版本不会被覆盖,而是通过回滚指针链接到回滚段中。

事务链表(Transaction Linked List) :

  • 这是一个数据结构,用于维护当前活跃的所有事务。
  • 每个事务在开始时都会被加入到这个链表中,提交或回滚时则移除。

ReadView:

  • ReadView是一种数据结构,用于创建一致性读的快照。
  • 它基于事务链表生成,并包含了在特定时间点活跃的所有事务的信息。
  • ReadView确保事务能够看到在其开始之前提交的所有更改,同时不看到在其开始之后发生的更改。


二、MVCC的工作原理

  • 当事务读取数据时,它只会看到该事务开始时或之前的数据版本。
  • 当事务更新数据时,它不会覆盖旧数据,而是创建一个新版本。
  • 系统维护数据的多个版本,确保每个事务都可以访问适当的数据版本。


详细介绍:当一个事务尝试读取数据时,它会使用ReadView来决定应该读取哪个版本的数据。这取决于数据行的事务ID和当前活跃的事务(通过事务链表确定)。如果数据行的事务ID指示该数据是由当前ReadView中不存在的事务更新的(即更新发生在读取事务开始之后),那么这个数据版本对当前事务是不可见的。相反,如果数据行的事务ID对应于已提交的事务或读取事务开始之前的事务,那么这个数据版本就是可见的。

一文读懂〖MVCC〗多版本并发控制_MVCC

  • 小于最小id即事务id在图中1所指范围的可见
  • 大于最大id即事物id在图中2所指范围的不可见
  • 中间事务可见性即图中3所指的范围,由事务隔离级别决定。RR 事务提交不可见,RC 事务提交可见。


三、MVCC的优点

  1. 提高并发性能:不同事务可以同时读取同一数据的不同版本,减少了锁的需求。
  2. 避免写入阻塞:更新操作不会直接覆盖旧数据,减少了写入操作之间的冲突。
  3. 减少锁争用:因为读取操作通常不需要锁,所以降低了锁争用的机会。


四、MVCC的缺点

  1. 增加存储开销:因为要存储多个版本的数据,所以可能需要更多的存储空间。
  2. 可能的性能开销:管理多个数据版本可能会增加一些计算开销。
  3. 需要垃圾回收:随着时间的推移,旧版本数据需要被清理,这就需要有效的垃圾回收机制。


五、使用MVCC的数据库系统示例

  • PostgreSQL
  • MySQL(InnoDB存储引擎)
  • Oracle Database


标签:事务,并发,ReadView,读懂,版本,MVCC,数据,ID
From: https://blog.51cto.com/u_3383071/8728134

相关文章

  • c# 高并发必备技巧(三)
    前面两篇文章主要是介绍了如何解决高并发情况下资源争夺的问题。但是现实的应用场景中除了要解决资源争夺问题,高并发的情况还需要解决更多问题,比如快速处理业务数据等,本篇文章简要罗列一下与之相关的更多技术细节。1、异步编程:使用async和await关键字进行异步编程,这可以避免阻塞......
  • [3分钟]GO:不要错误的使用并发
    七、并发由于Go语言的并发功能,经常被选作项目编程语言。Go语言团队已经竭尽全力以廉价(在硬件资源方面)和高性能来实现并发,但是Go语言的并发功能也可以被用来编写性能不高同时也不太可靠的代码。这里有一个二分法;Go语言的最大特点是简单、轻量级的并发模型。作为一种产品......
  • 并发设计类分析(Guava/Netty)
    1.限流器1.1限流器常见限流算法:计数器算法计数器算法是一种简单的限流方法,通过对请求进行计数,当请求达到一定的阈值时,进行限制。这种方法适用于简单场景,但不够灵活。容易出现临界时间点限流失效问题。滑动窗口算法滑动窗口算法维护一个时间窗口内的请求数量,通过动态调......
  • 【揭秘】并发情况下如何巧妙加锁
    单体架构下锁的实现方案ReentrantLock全局锁ReentrantLock(可重入锁),指的是一个线程再次对已持有的锁保护的临界资源时,重入请求将会成功。简单的与我们常用的Synchronized进行比较:ReentrantLockSynchronized锁实现机制依赖AQS监视器模式灵活性支持响应超时、中断......
  • 使用 maven 自动将源码打包并发布
    maven-source-plugin作用:在构建过程中将项目的源代码进行打包,并作为一个jar文件附着在主构件上,在pom.xml中添加如下内容,使用maven生成jar的同时生成sources包在pom中配置如下:<build><plugins><plugin><groupId>org.apache.maven.plugins</g......
  • Java并发编程进阶
    并发编程是现代软件开发中的一个关键技能。在Java中,java.util.concurrent包提供了一系列构建块,可以帮助开发者编写并发代码。这篇文章将深入探讨线程池、并发集合、同步器,以及Java内存模型。线程池线程池是一种资源池,它管理着一组可复用的线程。使用线程池可以减少在创建和销毁线程......
  • 无缝集成|一文读懂Salesforce外部服务(External Services)
    外部服务(ExternalServices)是一种Salesforce集成方法,无需代码即可将外部Web服务无缝连接到Salesforce组织。外部服务通过使用OpenAPI等行业标准以声明方式将外部API和计算集成到Salesforce中,从而促进跨多个平台和服务的集成体验。帮助客户在信用评分、支付、地图绘制、全渠道......
  • 数据库的锁和MVCC机制
    数据库的锁机制,是数据库为了保证数据的一致性和完整性,使各种共享资源在被并发访问时变得有序所设计的一种规则。之前讲到过事务,提到事务的ACID原则和隔离的级别一条SQL的背后故事(三)目前较为常见的三种并发控制机制:分别是悲观并发控制(锁)、乐观并发控制(乐观锁)和多版本并发......
  • 亿级访问高并发下如何进行估算和调优
    Java全能学习+面试指南:https://javaxiaobear.cn这篇主要讲解如何在大流量高并发场景下进行估算和调优。我们知道,垃圾回收器一般使用默认参数,就可以比较好的运行。但如果用错了某些参数,那么后果可能会比较严重,我不只一次看到有同学想要验证某个刚刚学到的优化参数,结果引起了线上G......
  • 什么是 MVCC
    又双叒叕被面试官问倒了...MVCC(Multi-VersionConcurrencyControl)是一种数据库并发控制机制,主要用于处理多个事务同时访问和修改数据库时的并发问题:定义:MVCC允许数据库在事务并发执行时维护不同版本的数据,而不是简单地锁定数据。每个事务在执行时看到的数据版本基于事务开......