InnoDB中的MVCC

断了今生、忘了曾经 提交于 2020-01-25 15:30:44

InnoDB的MVCC机制

InnoDB是一个多版本的存储引擎,它保存着已经改变的行的旧版本的信息,用来支持事务的性质例如并发和回滚。这些信息存储在一个称为回滚段(roolback segment)的数据结构中。InnoDB使用回滚段中的信息来执行事务回滚所需的撤销操作。还通过这些信息来构建行的早期版本,以便进行一致性读操作。一致性读是一种增强并发性的强大技术,允许查询在不等待其他事务释放锁的情况下继续进行。

一、InnoDB的行结构

innodb存储的最基本row中包含一些额外的存储信息 DATA_TRX_ID,DATA_ROLL_PTR,DB_ROW_ID,DELETE BIT
其中:
1、6字节的DATA_TRX_ID 标记了最新更新这条行记录的transaction id,每处理一个事务,其值自动+1。
2、7字节的DATA_ROLL_PTR 指向当前记录项的rollback segment的undo log记录,找之前版本的数据就是通过这个指针。
3、6字节的DB_ROW_ID,当由innodb自动产生聚集索引时,聚集索引包括这个DB_ROW_ID的值,否则聚集索引中不包括这个值
4、DELETE BIT位用于标识该记录是否被删除,这里的不是真正的删除数据,而是标志出来的删除。真正意义的删除是在commit的时候。

二、撤销日志

回滚段的undo logs撤销日志分为插入撤销日志和更新撤销日志。插入撤销日志只有在事务回滚时才需要,并且会在事务提交之后立即丢弃。更新撤销日志除了用于事务回滚之外,还用于一致性读之中。只有在一致性读取不需要更新撤销日志构建早期版本时,才会丢弃。因此我们需要定期提交事务,即使是只有一致性读操作的事务,否则回滚段就会过大而填满表空间。

对于InnoDB的多版本协议的删除语句,并不会立即对数据进行物理删除,只有当丢弃了该更新操作的更新撤销日志时才会进行删除,并且删除很快。

四、一致性非阻塞读(快照读)

一致性快照读只对RR或者RC隔离级别下的select语句有效。

一致性读又称快照读,读取某个时间点已经提交了的数据,但是不能读取稍后提交以及未提交的数据。*特例是本事务中对数据的修改,一致性读也可以看到。*对于读已提交和可重复读的隔离级别的区别就是,在读已提交的隔离级别下,一个事务可以读取到其他事务提交后的数据。这就导致了不可重复读的问题。在可重复读的隔离方式下,当进行一致性读的时候,InnoDB会给定一个时间点(一般为第一次查询的时间点),该时间点之前的数据都可读取到,如果另外一个事务在该时间点之后删除并提交,则不会被感知到,因此该事务看不到其他事务已经修改到的数据。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!