mysql的视图机制
mysql的事务隔离级别分为4个:
读未提交:
没有做视图控制,会出现脏读
读提交:
- 可重复读:
- 串行化
MVCC 数据一致性视图机制
聚簇索引有一个隐藏列trx_id,每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列,这个id代表的是这条记录的数据版本编号,当数据版本发生变化的时候,mysql会保存回滚操作,因此同一行记录可能会拥有好几个数据版本,而数据版本之间的切换就是依赖的回滚操作,这个就是多版本控制的机制(什么时候删除掉这些回滚日志呢?答案是当不需要的时候,就是当系统里没有比这个回滚日志更早的 read-view 的时候);
在实现上, InnoDB 为每个事务构造了一个数组,用来保存这个事务启动瞬间,当前正在“活跃”的所有事务 ID。“活跃”指的就是,启动了但还没提交。数组里面事务 ID 的最小值记为低水位,当前系统里面已经创建过的事务 ID 的最大值加 1 记为高水位。这个视图数组和高水位,就组成了当前事务的一致性视图(read-view)。
一言以蔽之,当前事务只能看到该事务启动瞬间已经提交了的数据版本!!
**
- 对于可重复读,查询只承认在事务启动前就已经提交完成的数据;
- 对于读提交,查询只承认在语句启动前就已经提交完成的数据;
二者的区别在于视图创建的时机不一样,可重复读是在事务启动前创建,读提交是在查询语句前创建