innodb mvcc
所属分类 mysql
浏览量 1406
MVCC Mutli Version Concurreny Control,多版本并发控制
一致性非锁定读 不加锁 快照读
MVCC 主要应用于 Read Commited 和 Repeatable read 两个事务隔离级别
innoDB 表空间 数据段,索引段,回滚段。
B+Tree 非叶子节点 索引导航 ,叶子节点存储数据行,
回滚段用于存储undoLog,undoLog中记录多版本数据,用于快照读和事务失败后的数据回滚,在合适的时机清理undoLog
MVCC的实现依赖每行的隐藏字段,DB_TRX_ID,DB_ROLL_PTR,删除标记位,还有read_view
DB_TRX_ID 事务id
占6 字节,表示这一行数据最后插入或修改的事务id。删除在内部也被当作一次更新,在行的特殊位置添加一个删除标记
DB_ROLL_PTR 回滚指针
占7字节,回滚指针指向 Rollback segment中的undoLog记录,行数据被更新的时候,undoLog 会记录该行修改前内容到undoLog。
DB_ROW_ID 行ID
占7字节,如果表中不存在主键 或者 唯一索引,采用DB_ROW_ID生成聚簇索引,否则DB_ROW_ID不会出现在索引中。
undo log 在 Rollback segment中 分为 insert 和 update undo log ,
insert 类型的undo log 仅仅用于事务回滚,事务一旦提交,insert undo log 就会被丢弃。
update的undo log 被用于 一致性的读和事务回滚,update undo log 的清理 是在 没有事务 需要对这部分数据快照进行一致性读的时候 进行清理。
undo log 的创建
对数据进行更新操作时,都会copy 当前数据,保存到undo log 中,并修改 当前行的 回滚指针指向 undo log 中的 旧数据行。
每开启一个新事务,事务版本号递增
可重读Repeatable reads事务隔离级别
SELECT时,读取创建版本号<=当前事务版本号,删除版本号为空或>当前事务版本号。
INSERT时,保存当前事务版本号为行的创建版本号
DELETE时,保存当前事务版本号为行的删除版本号
UPDATE时,插入一条新纪录,保存当前事务版本号为行创建版本号,同时保存当前事务版本号到原来删除的行
通过MVCC,每行记录需要额外的存储空间,更多的行检查工作以及一些额外的维护工作,但可以减少锁的使用,大多数读操作都不用加锁
上一篇
下一篇
内存映射文件
InnoDB锁机制之Gap Next-Key Record Lock
Mysql事务隔离级别
go http server
实用金融常识
jvm外挂工具揭秘