一. MVCC 机制
Multi-version Concurrency Controller 简称 MVCC, 是为了进步数据库的并发读写能力,不加锁就能够让多个事物实现并发读写
Mysql 会为每一行记录生成两个字段,trx_id(事物 id), roll_pointer(回滚指针), 执行一个事务批改每一条数据的时候,会并将原来的数据复制一份,生成 undo log, 并批改原来数据相应的属性,将数据的 roll_pointer(回滚指针) 指向 undo log
undo log 指事务开始之前,在操作任何数据之前, 首先将需操作的数据备份到一个中央
mysql 在执行查问的时候,会生成一个一致性视图 read-view, 它由以下几个局部组成:
- 执行查问时所提交的 trx_id 数组
- 数组外面最小的 id(min_id)
- 已创立的最大事务 id(max_id)
查问的数据后果要依据 read-view 做比照从而失去快照后果,
当隔离级别为可反复读的时候:在同一个事物执行查问,会沿用事物刚开始的 read-view,
当隔离级别在度已提交的时候:每生成一条查问语句,会生成一个 read-view
mysql 会沿着以后数据往 undo log 找,
- 如果 trx_id 小于 min_id, 则事物在查问之前就曾经提交,数据可见
- 如果 trx_id 大于 max_id, 则事物在查问之前还没生成,数据不可见
-
若数据的 trx_id 在查问的未提交事物列表
- 如果数据的 trx_id 是以后事物,则数据可见
- 如果数据的 trx_id 不是以后事物,则数据不可见
对于删除数据的状况,会将版本链上最新的数据复制一份,而后将 trx_id 批改成删除操作的 trx_id, 同时在该记录的头信息(record_header)里的 delete flag 标记为写上 true, 示意以后记录曾经被删除,在依照上述规定查问的时候如果查到的 delete flag 标记为为 true 的时候,不返回数据