事务到底是隔离的还是不隔离的?
发布日期:2021-05-07 21:24:29 浏览次数:9 分类:精选文章

本文共 985 字,大约阅读时间需要 3 分钟。

事务启动方式及 MySQL MVCC 快照机制解析

一、事务的启动方式

在 MySQL 中,begin/start transaction 命令并非事务的起点。只有在执行第一个针对 InnoDB 表的语句时,事务才会真正启动。如果需要立即启动一个事务,可以使用 start transaction with consistent snapshot 命令。

二、一致性视图的概念

MySQL 中涉及两个主要的“视图”概念,均无物理结构,用于定义“我能看到什么数据”:

  • 视图(View)

    • 通过查询语句定义的虚拟表。
    • 调用视图时执行查询并生成结果,与直接查询表的方式无异。
    • 语法为 create view ...,支持类似表的查询方式。
  • 一致性读视图(Consistent Read View)

    • InnoDB 在实现多版本并发控制(MVCC)时使用的视图类型。
    • 支持 RC(Read Committed)和 RR(Repeatable Read)隔离级别。
  • 三、快照机制在 MVCC 中的工作原理

    InnoDB 的 MVCC 机制基于以下原理:

  • 事务 ID 管理

    • 每个事务分配唯一的事务 ID(transaction id),按申请顺序严格递增。
    • 数据行也包含多个版本(row),每个版本记录对应的事务 ID(row trx_id)。
  • 数据版本管理

    • 在事务更新数据时,生成新版本并保留旧版本。
    • 新版本记录当前事务 ID,旧版本则保留相关信息。
  • 一致性视图的构建

    • 在事务启动时,构建一致性读视图(read-view)。
    • 该视图基于事务 ID 数组,包含当前“活跃”事务 ID。
    • 数组中的最小值为低水位,最大值加一为高水位。
  • 快照机制的实现

    • 数据版本的 row trx_id 可能落在以下区域:
      • 绿色区域:已提交事务或本事务生成,可见。
      • 红色区域:未来事务生成,不可见。
      • 黄色区域:需进一步判断:
        • row trx_id 在事务 ID 数组中,表示未提交事务生成,不可见。
        • 若未在数组中,表示已提交事务生成,可见。
  • 性能优化

    • InnoDB 利用数据多版本机制实现“秒级创建快照”的能力。
    • 通过事务 ID 数组和高水位机制,有效维护一致性视图。
  • 四、总结

    MySQL 的事务机制和 MVCC 快照机制通过巧妙的设计,确保了高性能和数据一致性。理解这些机制对优化数据库应用至关重要。

    上一篇:普通索引和唯一索引,应该怎么选择?
    下一篇:行锁功过:怎么减少行锁对性能的影响?

    发表评论

    最新留言

    逛到本站,mark一下
    [***.202.152.39]2025年03月23日 23时07分17秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章