当前位置: 首页 > news >正文

谈一谈MVCC

一 MVCC的定义
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库管理系统(DBMS)中的并发控制方法,它允许数据库读写操作不加锁地并发执行,从而提高了数据库系统的并发性能。MVCC 主要是通过维护数据的多个版本来实现这一点的,每个事务在执行时都会基于数据的某个版本进行操作,这样即使多个事务同时操作同一数据,也不会相互干扰。

二 MVCC 的主要特点
★非锁定读:在MVCC的支持下,读操作(SELECT)不会阻塞写操作(INSERT、UPDATE、DELETE),同时写操作也不会阻塞读操作。这是因为读操作可以读取数据的旧版本,而写操作则会在旧版本的基础上创建新版本。
★一致性读:事务在执行过程中,无论其他事务如何修改数据,该事务读取的数据版本都是一致的,即事务开始时数据的状态。这保证了事务的隔离性。
★写操作的可见性控制:写操作(更新或删除)会创建数据的新版本,并且这些新版本对其他事务的可见性受到事务隔离级别的控制。
三 MVCC 的实现机制
MVCC 的具体实现依赖于数据库的内部结构和事务管理策略,但通常包括以下几个关键组件:

★版本链:每个数据项(如表中的一行)都可能有多个版本,这些版本通过某种方式(如指针或时间戳)链接起来,形成版本链。
★隐藏列:在数据项中增加额外的隐藏列来存储版本信息,如创建时间戳、删除时间戳(对于已删除的数据项)等。
★读视图:每个事务在开始时都会创建一个读视图,该视图定义了事务可以看到的数据版本范围。事务只能看到在这个范围内创建或未删除的数据版本。
★事务ID和版本号:每个事务都有一个唯一的事务ID和版本号,用于标识事务的先后顺序和数据版本的新旧。

四 MVCC为数据库解决的问题
(一)数据库的三种并发场景
读读并发:不会产生并发问题,也不需要并发控制。
读写并发:会造成事务隔离性问题,脏读、幻读和不可重复读的问题。
写写并发:可能出现数据更新丢失的问题。

(二)MVCC可以为数据库解决以下三个方面的问题:

第一 并发读写数据。在并发读写数据库时,提高数据库的并发读写的处理能力,不用阻塞写操作;写操作也不用去阻塞读操作,从而去提高数据库的并发读写的处理能力。

第二:实现读一致性,解决脏读、幻读、不可重复读等事务隔离问题,但它不能解决数据更新的丢失问题。
第三:采用乐观锁或者悲观锁用来解决写和写的冲突,提高数据库的并发性能。

(三)MVCC机制下的数据库读写
在这里插入图片描述

五 MVCC 的优势与劣势
★优势:

提高并发性能:通过减少锁的使用,MVCC 可以显著提高数据库的并发处理能力。
简化事务管理:MVCC 使得事务的提交和回滚操作更加简单和高效。
★劣势:
存储空间占用:由于需要存储数据的多个版本,MVCC 会增加数据库的存储空间需求。
复杂性增加:MVCC 的实现相对复杂,需要数据库管理系统在内部进行更多的版本管理和可见性控制。
六 常见的MVCC数据库
1 PostgreSQL
2 MySQL(InnoDB存储引擎)
3 Oracle
4 SQL Server(在某些配置和版本下)

这些数据库系统通过不同的方式实现了MVCC,但基本原理是相似的。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 基于 Konva 实现Web PPT 编辑器(二)
  • .Net Core 笔试1
  • C++入门基础篇
  • GO语言快速入门(比较乱)
  • Ansible变量与模板的高级使用技巧
  • 2024 RustChinaConf 赞助商介绍
  • 线程可见性问题?还是编译优化问题?
  • golang fmt.Printf中 %q
  • 【React】Vite 构建 React
  • Zustand 状态调试以及持久话
  • SpringBoot与Minio的极速之旅:解锁文件切片上传新境界
  • pytorch torch.matmul函数介绍
  • 基于SpringBoot的宠物服务系统+uniapp小程序+LW参考示例
  • 【redis】redis的特性和主要应用场景
  • 码上君量化互助社群介绍
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • httpie使用详解
  • PHP 7 修改了什么呢 -- 2
  • Python打包系统简单入门
  • 反思总结然后整装待发
  • 仿天猫超市收藏抛物线动画工具库
  • 每天一个设计模式之命令模式
  • 前端面试之CSS3新特性
  • 嵌入式文件系统
  • 少走弯路,给Java 1~5 年程序员的建议
  • 线性表及其算法(java实现)
  • 一个普通的 5 年iOS开发者的自我总结,以及5年开发经历和感想!
  • 阿里云API、SDK和CLI应用实践方案
  • ‌U盘闪一下就没了?‌如何有效恢复数据
  • #Datawhale X 李宏毅苹果书 AI夏令营#3.13.2局部极小值与鞍点批量和动量
  • #Js篇:单线程模式同步任务异步任务任务队列事件循环setTimeout() setInterval()
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (delphi11最新学习资料) Object Pascal 学习笔记---第2章第五节(日期和时间)
  • (MTK)java文件添加简单接口并配置相应的SELinux avc 权限笔记2
  • (zt)最盛行的警世狂言(爆笑)
  • (八十八)VFL语言初步 - 实现布局
  • (二)fiber的基本认识
  • (附源码)计算机毕业设计SSM教师教学质量评价系统
  • (附源码)小程序 交通违法举报系统 毕业设计 242045
  • (九)One-Wire总线-DS18B20
  • (九)信息融合方式简介
  • (转)jdk与jre的区别
  • (转)Oracle 9i 数据库设计指引全集(1)
  • . Flume面试题
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .NET/C# 将一个命令行参数字符串转换为命令行参数数组 args
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .NET中两种OCR方式对比
  • ;号自动换行
  • @RequestBody与@RequestParam
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [2010-8-30]