隐藏字段

DB_TRX_ID

创建或最后修改记录的事务ID

DB_ROW_ID

隐藏主键

DB_ROLL_PTR

回滚指针(Undolog)-当不同事务对通条记录作修改的时候Undolog会形成一个链表,链表头是最新记录,后面跟着历史记录。

例子图示.png

问:当事务4来时,获取到的上面哪个值?
答:不一定是事务三,取决于Redview。

Readview

定义:事务在快照读取时产生的读视图。

TRX_LIST

系统活跃的事务ID

UP_LIST_ID

列表中事务最小的ID

LOW_LIMIT_ID

系统尚未分配的下一个事务ID

例子

例子图示png

问:能获取到事务4修改的update值吗?
答:不一定,取决于事务2开启的时机。

TRX_LIST: 1 2 3
UP_LIST_ID : 1
LOW_LIMIT_ID: 5
DB_TRX_ID:4

因为DB_TRX_ID > UP_LIST_ID
因为DB_TRX_ID < LOW_LIMIT_ID
因为DB_TRX_ID不存在TRX_LIST
所以 修改的结果就是可见的。

MVCC核心规则

1.比较DB_TRX_ID和UP_LIMIT_ID如果小于,则当前事务能看到DB_TRX_ID的记录,如果大于和等于则进入下一个判断。

2.比较DB_TRX_ID和LOW_LIMIT_ID如果大于等于则代表DB_TRX_ID的记录在redaview生成后出现的,那么对当前事务不可见,如果小于,则进入下一个判断。

3.判断DB_TRX_ID是否在活跃事务中,如果在代表redview生成时,事务还是在活跃状态,修改的数据当前的事务是看不到的,如果不在说明事务在redview之前就commit了,那么修改的结果就是可见的。

幻读

问:RR下是每次都是读取第一次快照读时的数据吗?
答:不是,可能会出现幻读

幻读:同一事务中,不同的时间,两次相同的查询获取到的数据不同。

redolog

定义:用来保证事务的持久性,保证数据不会缺失。

问:既然有了redolog,为什么还需要binlog呢?
答:redolog时特有在innodb中,而binlog存在server中。

两阶段提交

使用两阶段提交确保数据的一致性。

两阶段提交图示.png

最后修改:2023 年 11 月 30 日
如果觉得我的文章对你有用,请随意赞赏