`
后来我们都老了
  • 浏览: 34535 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

深入了解MVCC

阅读更多

背景

MySQL的InnoDB引擎实现了多版本控制MVCC,其对RR和RC隔离级别提供了支持,RR和RC可以在快照读取数据,那InnoDB是如何支持快照读的呢?

MVCC 是如何操作的

童话里是这么说的

Select

InnoDB只查找版本小于或等于当前事务版本的数据行。确保事务读取到的行,要么是事务开始前就存在的,要么是事务自身插入或者修改的。
行的删除版本要么未定义,要么大于当前事务的版本。确保事务读取到的行,在事务开始之前未被删除。 

Insert

InnoDB为新插入的每一行保存当前系统版本号作为行版本号

Delete 

InnoDB为删除的每一行保存当前系统版本号作为行删除标识

Update

InnoDB会插入一行新记录保存当前系统版本号作为行版本号,同时保存当前系统的版本号到原来的行作为行删除标识

 

思考:如果每创建一个事务,都保存当前时刻一份全量的快照的话,不考虑数据库能不能抗的住,上面这些操作有何意义?

MVCC的数据结构

MVCC两个基本的数据结构

行记录

Innodb引擎会为每一行添加3个字段实现的,DATA_TRX_ID、DATA_ROLL_PTR与DELETED_BIT:

DATA _TRX_ID表示产生当前记录项的事务ID(每开启一个新的事务,其对应的事务id会自动递增);
DATA_ROLL_PTR一个指向此条记录项的undo信息的指针,undo信息是指此条记录被修改前的信息;
DELETED_BIT位,用于标识该记录是否被删除。

 

read view

RR读:每个事务在开始都会根据当前系统的活跃事务链表创建一个read_view,read_view是用来检索行的可见性的。 
RC读:事务中,每个语句都会创建read_view。
假设当前的活跃事务链表如下所示:current-trx —> trx7 —> trx5 —> trx3 —> trx1;

 

Read View中的的变量则按如下方式初始化:

read_view->creator_trx_id = current-trx;                       当前的事务id
read_view->up_limit_id = trx1;                                      当前活跃事务的最小id
read_view->low_limit_id = trx7;                                     当前活跃事务的最大id
read_view->trx_ids = [trx1, trx3, trx5, trx7];                   当前活跃的事务的id列表
read_view->m_trx_ids = 4;                                            当前活跃的事务id列表长度

 

 以上是read view中变量组成,下面来分析一下快照的形成过程
low_limit_id,即当时活跃事务的最大id,如果读到row的data_trx_id>=low_limit_id,说明这些数据在当前事务开始时都还没有提交,如注释中的描述,这些数据都不可见。

up_limit_id,即当时活跃事务列表的最小事务id,如果row的data_trx_id<up_limit_id,说明这些数据在当前事务开始时都已经提交,如注释中的描述,这些数据均可见。

data_trx_id在up_limit_id和low_limit_id之间的row,如果这个data_trx_id在trx_ids的集合中,就说明开启当前的事务的时候,这个data_trx_id还处于活跃状态,即还未提交,那么这个row是不可见的;如果这个data_trx_id不在trx_ids的集合中,就说明开启当前的事务的时候,这个data_trx_id已经提交,那么这个row是可见的。
 这样我们在要在事务中获取数据行,我们就能根据数据行的data_trx_id 和当前事务的read_view来判断此版本的数据在事务中是否可见。可见包括两层含义:
记录可见,且Deleted bit = 0;当前记录是可见的有效记录。
记录可见,且Deleted bit = 1;当前记录是可见的删除记录。此记录在本事务开始之前,已经删除。
 如果数据不可见我们需要去哪里找上一个版本的数据呢?
通过数据行的DB_ROLL_PTR字段去undo log信息中找到上一个版本的记录,再判断这个版本的数据是否可见,以此类推。
到这里,大概已经清楚了快照读中的"快照"是怎么生成的。

RC、RR区别

RR级别支持语句级别binlog,事务级创建read_view,gap锁导致不满足查询条件的锁不能提前释放。
 RC级别不支持语句级别binlog,语句级创建read_view,没有gap锁开销小,支持半一致读。
分享到:
评论

相关推荐

    07-VIP-深入理解MVCC与BufferPool缓存机制.pdf

    "理解MVCC与BufferPool缓存机制" 本节课主要讲解了MySQL中的MVCC(Multi-Version Concurrency Control)机制和BufferPool缓存机制。 一、MVCC机制 MVCC机制是一种多版本并发控制机制,用于保证事务的隔离性。在可...

    深入理解MVCC与BufferPool缓存机制

    ### 深入理解MVCC与BufferPool缓存机制 #### 一、MVCC多版本并发控制机制 **MVCC**(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库事务处理的重要技术,它允许读取操作和写入操作在不相互...

    深入理解PostgreSQL的MVCC并发处理方式

    当你使用PostgreSQL来设计高并发的应用时,理解它的MVCC是怎么实现的很重要。它事实上是复杂问题的一种非常优雅和简单的解法。 MVCC如何工作 在Postgres中,每一个事务都会得到一个被称作为 XID 的事务ID。这里说的...

    行业-53 理解MVCC机制的前奏:undo log版本链是个什么东西?l.rar

    本文将深入探讨undo log版本链的概念、作用以及它在MVCC中的具体应用。 首先,我们需要理解undo log。在数据库系统中,undo log是一个记录事务对数据进行修改之前状态的日志。当事务回滚或需要提供读一致性时,undo...

    pg_activity-master_made_python_pg_

    标题 "pg_activity-master_made_python_pg_" 暗示我们关注的是一个与PostgreSQL数据库相关的项目,...通过深入理解MVCC的工作原理和使用Python的`psycopg2`库,开发者和DBA可以更好地理解和维护他们的PostgreSQL环境。

    mysql官方资料_第三版.rar

    在"mysql官方资料_第三版.rar"这个压缩包中,包含了一份详细的MySQL官方文档,尤其是对于想要深入理解MVCC(多版本并发控制)以及MySQL的底层机制的读者来说,这份资料是不可多得的资源。 MVCC是数据库并发控制的一...

    mvcc-rust:在 Rust 中试验 MVCC

    - 对于并发控制和数据库系统开发者,它可以作为理解MVCC工作原理和实现细节的实践平台。 - 对于任何希望提升并发编程技能的人来说,研究这个项目将有助于理解和掌握并发控制策略。 通过深入研究这个项目,你可以...

    MySQL-5.1.18-src

    3. 并发控制和事务处理:深入理解MVCC(多版本并发控制)在InnoDB中的工作方式,以及MySQL如何处理事务的ACID属性。 4. 索引结构:研究B树、哈希索引等数据结构,以及它们在查询优化中的作用。 5. 网络通信:MySQL...

    MySQL高级理论-MVCC提交查询相关(版本链)

    MySQL的多版本并发控制(MVCC)是一种用于...通过理解以上概念,我们可以深入理解MVCC的工作原理,以及它如何在MySQL中支持高并发和事务一致性。在实际应用中,理解这些细节对于优化数据库性能和解决并发问题至关重要。

    MVCC PostgreSQL实现事务和多版本并发控制的精华1

    这些字段对于理解MVCC的工作机制至关重要: - `xmin`:在创建tuple时,记录插入该tuple的事务的XID。表示此数据版本是由哪个事务生成的。 - `xmax`:默认值为0,表示tuple未被删除。当tuple被删除时,`xmax`会被...

    InnoDB-undo-log与MVCC1

    分析这两个系统之间的异同,可以帮助我们更深入地理解数据库并发控制的原理。 undo log有两种格式:insert undo log和update undo log。前者只在插入数据时生成,而后者在更新数据时生成,且更受关注,因为它涉及到...

    面试官:什么是MySQL 事务与 MVCC 原理?.doc

    面试官:什么是 MySQL 事务与 MVCC 原理? 本文主要讲解了 MySQL 中的事务(Transaction)...本文通过详细的解释和实例,帮助读者深入了解 MySQL 中的事务和 MVCC 原理,并提供了实际应用中可能遇到的问题和解决方案。

    阿里大牛何sir 深入MySQL加锁处理分析

    在深入分析MySQL加锁处理之前,首先需要了解MySQL数据库的基本架构以及锁机制的相关概念。MySQL是一个支持插件式存储引擎的数据库系统,其中InnoDB存储引擎因其支持事务处理和外键约束而被广泛使用。本文将重点讨论...

    深入浅出INNODBMVCC机制与原理.docx

    【深入浅出INNODB MVCC机制与原理】 在数据库管理系统中,MVCC(多版本并发控制)是一种用于提高并发性能的技术,尤其在事务性存储引擎如InnoDB中被广泛应用。本文将深入探讨MVCC的基本概念,实现原理,并通过实例...

    深入理解MySQL核心技术

    《深入理解MySQL核心技术》这本书是数据库管理员和开发人员掌握MySQL技术的重要参考资料。...通过学习本书,读者不仅能掌握MySQL的基本操作,还能深入了解其底层机制,从而更好地设计、优化和管理数据库系统。

    Oracle编程艺术-深入数据库体系结构

    通过阅读《Oracle编程艺术-深入数据库体系结构》,读者不仅能掌握Oracle数据库的基础知识,还能深入了解其复杂的运行机制,从而在实践中更有效地管理和优化数据库系统。这本书是Oracle DBA和开发者提升专业能力的...

    深入解析Oracle 盖国强 高清版

    6. **并发控制与事务管理**:Oracle使用多版本并发控制(MVCC)来实现事务的隔离级别,书中有望深入讨论行级锁定、死锁检测及解决策略。 7. **高可用性与灾难恢复**:介绍RAC(Real Application Clusters)、数据...

    深入理解Mysql事务隔离级别与锁机制.zip

    总的来说,深入理解MySQL的事务隔离级别和锁机制对于优化数据库性能、保证数据一致性以及解决并发问题具有重要意义。通过灵活运用这些知识,我们可以更好地设计和维护数据库系统,确保其稳定、高效地运行。

Global site tag (gtag.js) - Google Analytics