
事务到底是隔离的还是不隔离的?
发布日期: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秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
1月份2月份GitHub上最热门的23个Java开源项目
2019-03-05
maven安装
2019-03-05
2020第十五届全国大学生智能汽车竞赛——4X4矩阵键盘+Flash调参系统
2019-03-05
最长无重复子串
2019-03-05
合并两个有序数组
2019-03-05
C++学习笔记3--程序内存分配方式
2019-03-05
Ubuntu 环境下使用中文输入法
2019-03-05
小白学习Vue(?)--model选项的使用(自定义组件文本框双向绑定)
2019-03-05
聊聊我的五一小假期
2019-03-05