什么是MVCC,为什么要设计间隙锁?

本篇文章带大家了解一下mvcc,介绍一下mvcc与隔离级别的关系,从设计的角度上,聊聊为什么要设计出mvcc,且rc和rr的隔离级别到底有什么不同。

MVCC作用

MVCC使得大部分支持行锁的事务引擎,不再单纯的使用行锁来进行数据库的并发控制,而是把数据库的行锁和行的版本号结合起来,只需要很小的开销,就可以实现非锁定读。从而提高数据库的并发性能。

MVCC是采用无锁的形式解决读-写冲突问题。这里的读是指的快照读。即MVCC实现的快照读!!!

什么是MVCC

多版本并发控制(MVCC)是一种解决读-写冲突的无锁并发控制。

每一行记录都有两个隐藏列:创建版本号和回滚指针。事务开启后存在一个事务id。多个并发事务同时操作某行,不同的事务对该行update操作会产生多个版本,然后通过回滚指针组成undo log链。而MVCC的快照读正是通过事务id和创建版本号从而实现的快照读。

MVCC与隔离级别的关系

MVCC是为了解决读-写问题。且通过不同的配置,也可以解决事务开启后,快照读不可重复读的问题。

不可重复读:同一个事务中读取某些数据已经发生改变,或某些记录已经删除。

幻读:一个事务按照相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足查询条件的新数据,这种现象被称为幻读。

RC和RR均实现了MVCC,但是为什么RR解决了RC不可重复读的问题?

你可以这样认为,RC之所以有不可重复读的问题,只是因为开发者有意设置的(设置多种隔离级别,用户可以根据情况设置)。本来数据都提交到数据库了,RC读取出来也没什么问题呀?况且Oracle数据库本身的隔离级别就是RC。

READ-COMMITTED(读已提交)
读已提交RC,在这一隔离级别下,可以在SQL级别做到一致性读,每次SQL语句都会产生新的ReadView。这就意味着两次查询之间有别的事务提交了,是可以读到不一致的数据的。

REPEATABLE-READ(可重复读)
可重复读RR,在第一次创建ReadView后,这个ReadView就会一直维持到事务结束,也就是说,在事务执行期间可见性不会发生变化,从而实现了事务内的可重复读。

MVCC和间隙锁

MVCC无锁解决了读-写冲突的问题。并且解决了不可重复读问题。从而实现了RC和RR两个隔离级别。

间隙锁本质上依旧是锁,会阻塞两个并发事务的执行。

那么RR为什么还要进入间隙锁,难道仅仅为了解决幻读的问题吗?

注意:只有RR隔离级别才存在间隙锁。

间隙锁在一定程度上可以解决幻读的问题,但是间隙锁的引入我觉得更多是为了处理binlog的statement模式的bug。

mysql数据库的主从复制依靠的是binlog。而在mysql5.0之前,binlog模式只有statement格式。这种模式的特点:binlog的记录顺序是按照数据库事务commit顺序为顺序的。

当不存在间隙锁的情况下,会有如下的场景:
master库有这么两个事务:

1、事务a先delete id<6,然后在commit前;
2、事务b直接insert id=3,并且完成commit;
3、事务a进行commit;
此时binlog记录的日志是:事务b先执行,事务a在执行(binlog记录的是commit顺序)

那么主库此时表里面有id=3的记录,但是从库是先插入再删除,从库里面是没有记录的。

这就导致了主从数据不一致。

为了解决这个bug,所以RR级别引入了间隙锁。

【相关推荐:mysql视频教程】

以上就是什么是MVCC,为什么要设计间隙锁?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/177091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月1日 05:42:09
下一篇 2025年11月1日 05:45:33

相关推荐

  • 如何用Python源码开发追剧提醒系统 Python源码定时任务与接口集成

    要开发python追剧提醒系统,关键步骤如下:1.选择数据库存储信息,小型项目用sqlite,大型用mysql;2.调用视频源api或使用爬虫获取更新数据,注意频率限制和合规性;3.使用schedule或apscheduler实现定时任务,前者适合简单任务,后者支持复杂调度;4.通过邮件、短信或微信…

    2025年12月14日 好文分享
    000
  • 如何使用Python构建注塑产品的尺寸异常检测?

    构建注塑产品尺寸异常检测系统,首先要明确答案:通过python构建一套从数据采集到异常识别再到预警反馈的自动化系统,能够高效识别注塑产品尺寸异常。具体步骤包括:①从mes系统、csv/excel、传感器等来源采集数据,使用pandas进行整合;②清洗数据,处理缺失值与异常值,进行标准化;③结合工艺知…

    2025年12月14日 好文分享
    000
  • Python如何操作MongoDB?NoSQL数据库实战

    python操作mongodb的核心依赖pymongo库,其核心步骤包括:1. 安装pymongo;2. 建立与mongodb的连接;3. 选择数据库和集合;4. 执行增删改查操作;5. 使用聚合和批量操作提升性能;6. 关闭连接。mongodb作为文档型数据库,与传统关系型数据库相比,具有灵活的无…

    2025年12月14日 好文分享
    000
  • 连接 MySQL 5.1 数据库的 Python 教程

    本文档旨在指导开发者如何使用 Python 连接到 MySQL 5.1 数据库。由于 MySQL 5.1 较为古老,现代的 MySQL 连接器可能存在兼容性问题。本文将介绍如何使用 mysql-connector-python 驱动,并配置相应的参数,以成功建立连接。同时,本文也强烈建议升级 MyS…

    2025年12月14日
    000
  • Python连接MySQL 5.1:克服旧版认证与字符集兼容性挑战

    本教程详细阐述了如何使用Python 3和mysql.connector库成功连接到老旧的MySQL 5.1数据库。文章重点介绍了解决旧版认证协议和字符集兼容性问题的关键配置,特别是use_pure=True和charset=’utf8’的重要性,并提供了可运行的代码示例。同…

    2025年12月14日
    000
  • Python如何做自动化爬虫?Scrapy框架指南

    scrapy是当前最成熟、功能最强大的python自动化爬虫框架,其核心优势在于提供从请求发起到数据存储的完整解决方案。1. scrapy基于异步io实现高并发,提升爬取效率;2. 其模块化设计支持清晰架构与高度扩展性;3. 中间件系统灵活应对反爬策略;4. 内置item与pipeline实现数据结…

    2025年12月14日 好文分享
    000
  • 如何实现Python与数据库的批量数据交互?高效IO方案

    优化python数据库操作的核心在于减少交互次数和高效利用io。1.使用批量操作避免单条sql循环执行,如psycopg2的execute_batch或pymysql的executemany;2.通过连接池管理连接,减少频繁创建销毁连接的开销,并根据数据库性能、并发量合理设置连接池大小;3.采用异步…

    2025年12月14日 好文分享
    000
  • Python如何实现网络爬虫?Scrapy框架教程

    要实现网络爬虫,python 中最常用、功能强大的框架之一是 scrapy。1. 安装 scrapy 并创建项目:使用 pip install scrapy 安装,并通过 scrapy startproject myproject 创建项目;2. 编写第一个爬虫:在 spiders 目录下新建 py…

    2025年12月14日 好文分享
    000
  • 怎样用Python构建端到端异常检测流水线?完整架构

    数据预处理在异常检测中扮演提升数据质量、统一数据尺度、提取有效信息和适配模型输入四大核心角色。1. 提升数据质量:处理缺失值、异常值和噪声,避免模型学习错误模式;2. 统一数据尺度:通过标准化或归一化消除特征量纲差异,确保模型公平对待所有特征;3. 提取有效信息:进行特征工程,如创建滞后特征、滚动统…

    2025年12月14日 好文分享
    000
  • Python中如何实现并发编程?asyncio协程详解

    asyncio和协程是python中处理i/o密集型任务的高效并发方案,其核心在于通过事件循环实现单线程内的合作式多任务调度。1. 协程由async def定义,通过await暂停执行并释放控制权给事件循环;2. 事件循环负责监控和调度就绪的协程,避免阻塞;3. 使用asyncio.run()启动事…

    2025年12月14日 好文分享
    000
  • Python中如何实现定时任务?APScheduler详细配置

    实现python定时任务的核心工具是apscheduler,其使用步骤如下:1. 安装apscheduler;2. 根据应用场景选择调度器,如backgroundscheduler适合后台运行;3. 配置调度器,包括时区、任务存储、执行器及任务默认属性;4. 使用add_job()方法添加任务,并指…

    2025年12月14日 好文分享
    000
  • Python如何连接MySQL数据库?PyMySQL详细使用教程

    %ignore_a_1%是python连接mysql数据库的首选工具。1.安装pymysql:使用pip install pymysql命令安装;2.连接数据库:通过pymysql.connect()方法建立连接,并使用cursor执行sql语句;3.使用连接池:通过dbutils.pooled_d…

    2025年12月14日 好文分享
    000
  • 如何用Python制作爬虫?Scrapy框架入门

    scrapy是python爬虫开发的利器,因其功能完备、高效稳定且模块化设计而广受欢迎。它封装了异步请求处理、数据提取工具(如css选择器和xpath)、以及强大的中间件机制(包括下载器和spider中间件),极大简化了并发控制、异常处理与反爬应对。其结构化项目布局提升开发效率,通过定义item明确…

    2025年12月14日 好文分享
    000
  • 怎样用Python操作SQLite?轻量数据库使用指南

    python操作sqlite数据库的核心是使用内置的sqlite3模块,其流程包括:1. 导入模块;2. 使用sqlite3.connect()建立数据库连接(可为文件或内存);3. 创建游标对象;4. 执行sql命令进行增删改查;5. 通过commit()提交更改或rollback()回滚事务;6…

    2025年12月14日 好文分享
    000
  • 怎样用Python开发数据管道?ETL流程实现

    用python开发数据管道的关键在于理解etl流程并选择合适的工具。1. etl流程包括三个阶段:extract(从数据库、api等来源抽取数据)、transform(清洗、格式化、计算字段等)、load(将数据写入目标存储)。2. 常用工具包括pandas(处理中小型数据)、sqlalchemy(…

    2025年12月14日 好文分享
    000
  • 如何使用Python操作HBase?分布式数据库

    要使用python操作hbase,主要依赖thrift服务和happybase库。1. 安装并启用hbase thrift服务,使用命令安装thrift并启动hbase thrift;2. 使用happybase连接hbase,通过pip安装后可创建表、插入数据及查询;3. 处理中文或编码问题,写入…

    2025年12月14日 好文分享
    000
  • 怎样用Python操作JSON文件?读写性能优化方案

    python操作json文件的核心是使用内置json模块进行序列化与反序列化,读写性能受文件大小和应用场景影响。1. 小文件处理通常无需优化,直接使用json.load()和json.dump()即可;2. 大文件需采用流式解析库如ijson,按需读取以降低内存占用;3. 写入大量数据时避免格式化、…

    2025年12月14日 好文分享
    000
  • Python csv.writer 写入数据时额外引号问题的解析与解决方案

    本文旨在解决使用 Python csv 模块的 csv.writer 写入数据时,因数据源结构不当导致输出字段被额外引号包裹的问题。当从数据库(如 MySQL)获取的数据集每行是一个包含预先逗号分隔字符串的单元素元组时,csv.writer 会将其视为单个字段并添加引号。教程将详细分析问题成因,并提…

    2025年12月14日
    000
  • 如何用Python构建数据监控—异常检测报警系统

    1.明确监控对象与异常定义,如数据来源、监控频率及异常判断标准;2.采集并预处理数据,包括获取数据源和清洗格式化;3.实现异常检测逻辑,可采用统计方法或时间序列模型;4.设置报警通知机制,如邮件、企业微信等。系统构建流程为:确定监控目标、采集清洗数据、应用检测算法、触发通知,同时需确保数据源稳定、规…

    2025年12月14日 好文分享
    000
  • Python怎样操作MySQL数据库?PyMySQL连接方法

    pymysql连接mysql数据库的核心步骤包括导入库、建立连接、创建游标、执行sql、事务处理及关闭连接。1. 导入pymysql模块;2. 使用pymysql.connect()建立连接,传入数据库配置参数;3. 通过with conn.cursor()创建并自动管理游标;4. 使用cursor…

    2025年12月14日 好文分享
    000

发表回复

登录后才能评论
关注微信