隐藏字段
DB_TRX_ID
创建或最后修改记录的事务ID
DB_ROW_ID
隐藏主键
DB_ROLL_PTR
回滚指针(Undolog)-当不同事务对通条记录作修改的时候Undolog会形成一个链表,链表头是最新记录,后面跟着历史记录。
问:当事务4来时,获取到的上面哪个值?
答:不一定是事务三,取决于Redview。
Readview
定义:事务在快照读取时产生的读视图。
TRX_LIST
系统活跃的事务ID
UP_LIST_ID
列表中事务最小的ID
LOW_LIMIT_ID
系统尚未分配的下一个事务ID
例子
问:能获取到事务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中。
两阶段提交
使用两阶段提交确保数据的一致性。