`
ncs123
  • 浏览: 103367 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

innodb隔离级别原理实现

阅读更多
mysql数据库文件
InnoDB 和 MyISAM的区别
Innodb隔离级别原理实现
InnoDB主备复制

一、MVCC



    InnoDB是一个多版本存储引擎:它保存关于已更改行的旧版本的信息,以支持诸如并发和回滚之类的事务特性.可以认为MVCC是行级锁的一个变种,但它在很多情况下避免了加锁操作,因此开销更低。



    innodb会为每一行添加三个字段:
  • 6-byte ID字段:隐含主键ID。
  • 6-byte DB_TRX_ID字段:记录创建时事务的版本,这个版本号随着事务的创建不断递增。
  • 7-byte DB_ROLL_PTR字段:记录了指向undo日志记录的指针。undo日志用于事物回滚。
    MCVV只在REPEATABLE READ和READ COMMITTED两个隔离级别下工作。

二、事务链表

    MySQL中的事务在开始到提交这段过程中,都会被保存到一个叫trx_sys的事务链表中,这是一个基本的链表结构:



    新建事务(当前事务)与commit 的事务不在活跃事务链表中。

三、undo log


    当事务1更改该行的值时,会进行如下操作:
  • 用排他锁锁定该行
  • 记录redo log
  • 把该行修改前的值Copy到undo log,即上图中下面的行
  • 修改当前行的值,填写事务编号,使回滚指针指向undo log中的修改前的行


四、ReadView

    有了前面隐藏列和事务链表的基础,接下去就可以构造MySQL实现MVCC的关键——ReadView。
    ReadView说白了就是一个数据结构,在事务开始的时候被创建。这个数据结构中包含了3个主要的成员:ReadView{low_trx_id, up_trx_id, trx_ids},在并发情况下,一个事务在启动时,trx_sys链表中存在部分还未提交的事务,那么哪些改变对当前事务是可见的,哪些又是不可见的,这个需要通过ReadView来进行判定,首先来看下ReadView中的3个成员各自代表的意思:
  • low_trx_id表示该事务启动时,当前事务链表中最大的事务id编号,也就是最近创建的除自身以外最大事务编号;
  • up_trx_id表示该事务启动时,当前事务链表中最小的事务id编号,也就是当前系统中创建最早但还未提交的事务;
  • trx_ids表示所有事务链表中事务的id集合。

    上述3个成员组成了ReadView中的主要部分,简单图示如下:




    InnoDB默认的隔离级别为Repeatable Read (RR),可重复读。InnoDB在开始一个RR读之前,会创建一个全局Read View。Read Commited (RC)在每次语句执行的过程中,重新在row_search_for_mysql函数中创建当前的一份read_view。Read View用于判断一条记录的可见性。Read View定义在read0read.h文件中。
具体的算法如下:

  1. 设该行的当前事务id为trx_id,read view中最早的事务id为up_trx_id, 最迟的事务id为low_trx_id。
  2. 如果trx_id< up_trx_id的话,那么表明该行记录所在的事务已经在本次新事务创建之前就提交了,所以该行记录的当前值是可见的。跳到步骤6。
  3. 如果trx_id>low_trx_id的话,那么表明该行记录所在的事务在本次新事务创建之后才开启,所以该行记录的当前值不可见,跳到步骤5。否则该行记录的当前值是可见的,跳到步骤6。
  4. 如果up_trx_id<=trx_id<=low_trx_id, 那么表明该行记录所在事务在本次新事务创建的时候处于活动状态,从up_trx_id到low_trx_id进行遍历,如果trx_id等于他们之中的某个事务id的话,那么不可见。跳到步骤5。
  5. 从该行记录的DB_ROLL_PTR指针所指向的回滚段中取出最新的undo-log的版本号,将它赋值该trx_id,然后跳到步骤2。
  6. 将该可见行的值返回。



五、事务隔离级别
  
    REPEATABLE READ(默认隔离级别)
    select:开始一个RR读之前,会创建一个全局Read View。会出现幻读
CREATE TABLE t (a INT NOT NULL, b INT) ENGINE = InnoDB;
INSERT INTO t VALUES (1,2),(2,3),(3,2),(4,3),(5,2);
UPDATE t SET b = 5 WHERE b = 3;

b字段是索引:只会锁住b=3的记录
b字段不是索引:会锁住全表记录

x-lock(1,2); retain x-lock
x-lock(2,3); update(2,3) to (2,5); retain x-lock
x-lock(3,2); retain x-lock
x-lock(4,3); update(4,3) to (4,5); retain x-lock
x-lock(5,2); retain x-lock


    READ COMMITTED
    select:每次语句执行的过程中,重新在row_search_for_mysql函数中创建当前的一份read_view。不可重复读
b字段是索引:只会锁住b=3的记录
b字段不是索引:会先锁住全表记录,然后释放b!=3的记录的锁

x-lock(1,2); unlock(1,2)
x-lock(2,3); update(2,3) to (2,5); retain x-lock
x-lock(3,2); unlock(3,2)
x-lock(4,3); update(4,3) to (4,5); retain x-lock
x-lock(5,2); unlock(5,2)


    READ UNCOMMITTED
    select:返回最新记录。脏读

    SERIALIZABLE
    select:InnoDB隐式地将所有普通SELECT语句转换为SELECT ... LOCK IN SHARE MODE。并且通过间隙锁(next-key locking)策略防止幻读的出现。

  • 大小: 9.3 KB
  • 大小: 15 KB
  • 大小: 26 KB
  • 大小: 19.5 KB
  • 大小: 42.1 KB
分享到:
评论

相关推荐

    InnoDB引擎MVCC实现原理.pptx

    InnoDB 引擎 MVCC 实现原理 InnoDB 引擎的 MVCC(Multi-Version Concurrency Control,多版本并发控制)机制是 MySQL 中的一种事务控制机制,它允许在高并发环境中实现高效、安全的数据访问。MVCC 机制的核心是实现...

    innodb如何巧妙的实现事务隔离级别详解

    理解并掌握这些事务隔离级别及其实现原理,对于编写能够处理大量并发请求的高效、健壮的代码至关重要。根据业务场景和数据一致性需求,选择合适的隔离级别可以平衡系统的并发性能和数据安全性。

    Mysql事务隔离级别原理实例解析

    在InnoDB存储引擎中,通过多版本并发控制(MVCC)实现的可重复读,可以防止在事务内部看到其他事务插入的新行,但仍然可能存在幻读问题,尤其是在范围查询时。 串行化是最高的隔离级别,它通过强制事务按照序列执行...

    mysql原理之隔离级别1

    MySQL 数据库中的事务隔离级别是确保数据库在高并发环境下数据一致性的重要机制。SQL 标准定义了四个隔离级别,它们分别是 Read Uncommitted、Read Committed、Repeatable Read 和 Serializable,每种级别都针对不同...

    MySQL技术内幕 InnoDB存储引擎.pptx

    InnoDB的工作机制包括事务管理、锁机制、并发控制、恢复机制等内容,让读者能够理解InnoDB在处理并发读写、事务隔离级别、崩溃恢复等方面的原理和机制。此外,本书还对InnoDB的性能优化进行了详细的分析,提出了很多...

    行业-55 Read Committed隔离级别是如何基于ReadView机制实现的?l.rar

    本文将深入探讨Read Committed隔离级别以及其背后的ReadView工作原理。 Read Committed隔离级别的核心思想是,一个事务在执行过程中,只会看到其他事务已经提交的修改,而不会看到中间状态的更改。这样可以避免脏读...

    InnoDB的多版本并发控制机制——MVCC

    InnoDB多版本并发控制机制MVCC的原理与实现,包括底层代码实现以及快照的构建原理。RR隔离级别和RC隔离级别的实现逻辑。

    innodb锁

    7. **事务隔离级别**:InnoDB支持四种事务隔离级别,它们对锁的使用有所不同: - 读未提交(Read Uncommitted):事务可以读取其他事务未提交的数据,可能导致脏读。 - 读已提交(Read Committed):事务只能看到...

    学习MySQL原理,InnoDB底层结构,锁,事务等实现原理.zip

    事务通过四种隔离级别(读未提交、读已提交、可重复读、串行化)来控制并发操作,防止脏读、不可重复读和幻读等问题。 **四、InnoDB锁** InnoDB提供了多种锁机制,包括行级锁、表级锁和间隙锁。行级锁提高了并发...

    InnoDB官方文档中文翻译版

    InnoDB的事务处理机制包括四种隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ,这是MySQL的默认级别)和串行化(SERIALIZABLE)。每种隔离级别都有其特定的并发...

    innodb_ruby-master.zip

    InnoDB支持ACID(原子性、一致性、隔离性和持久性)事务,提供四种隔离级别:读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ,MySQL默认级别)和串行化(SERIALIZABLE)。...

    面试刷题29:mysql事务隔离实现原理?

    mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务。 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败。...事务的隔离级别有4个层级,隔离级别依

    py_innodb_page_info.zip

    这些信息对于实现读已提交、可重复读和串行化等隔离级别至关重要。 7. **记录**:InnoDB中的记录包含了实际的数据字段,每个记录有自己的头信息,如记录长度、主键值等。记录在页内的布局直接影响查询性能。 8. **...

    py_innodb_page_info工具

    另一方面,undo log(回滚日志)则用于回滚事务和提供隔离级别。它记录了对数据的原始状态,使得在事务回滚或解决并发冲突时,可以恢复到事务开始前的状态。通过`py_innodb_page_info`,我们可以分析undo log的结构...

    Innodb存储引擎浅析—事务系统

    - **多版本控制协议**(MVCC):通过维护多个版本的数据,实现非阻塞读操作,并支持不同隔离级别的实现。 - **自动死锁检测**:能够自动检测并解决死锁情况。 - **自动崩溃恢复**:利用redo log等机制实现崩溃后的...

    MySQL技术InnoDB存储引擎_姜承尧_第2版

    书中会详细讲解四种隔离级别——读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED)、可重复读(REPEATABLE READ,MySQL默认级别)和串行化(SERIALIZABLE),以及它们在并发控制中的区别和应用场景。...

    关于Mysql隔离级别、锁与MVCC介绍

    总结来说,MySQL通过隔离级别、锁和MVCC这三大机制,实现了在高并发环境下的数据一致性、可靠性和并发性能。理解这些机制的原理和相互关系,有助于在实际应用中做出合适的配置选择,提升数据库的性能和稳定性。

Global site tag (gtag.js) - Google Analytics