博客
关于我
事务到底是隔离的还是不隔离的?
阅读量:351 次
发布时间:2019-03-04

本文共 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 快照机制通过巧妙的设计,确保了高性能和数据一致性。理解这些机制对优化数据库应用至关重要。

    转载地址:http://zmer.baihongyu.com/

    你可能感兴趣的文章
    LeetCode - 字符串相乘
    查看>>
    二分查找与插入排序的结合使用
    查看>>
    892 三维形体的表面积(分析)
    查看>>
    40. 组合总和 II(dfs、set去重)
    查看>>
    16 最接近的三数之和(排序、双指针)
    查看>>
    1137 第 N 个泰波那契数(迭代、记忆性递归)
    查看>>
    279 完全平方数(bfs)
    查看>>
    865 具有所有最深结点的最小子树(递归)
    查看>>
    738 单调递增的数字(找出逆序的位置)
    查看>>
    410 分割数组的最大值(二分查找、动态规划)
    查看>>
    875 爱吃香蕉的珂珂(二分查找)
    查看>>
    450 删除二叉搜索树中的节点(递归删除节点)
    查看>>
    542 01 矩阵(单源bfs、多源bfs)
    查看>>
    python测试代码耗时
    查看>>
    桌面图标的自动排列图标
    查看>>
    第十一届蓝桥杯python组第二场省赛-数字三角形
    查看>>
    蓝桥杯四平方和(暴力)
    查看>>
    手机号码(数位dp-dfs)
    查看>>
    算法训练 Anagrams问题
    查看>>
    Linux-文件目录类常用指令3
    查看>>