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会给定一个时间点(一般为第一次查询的时间点),该时间点之前的数据都可读取到,如果另外一个事务在该时间点之后删除并提交,则不会被感知到,因此该事务看不到其他事务已经修改到的数据。
来源:CSDN
作者:我家璨璨真可爱
链接:https://blog.csdn.net/weixin_42379740/article/details/103710648