MVCC
基本概念
当前读和快照读
当前读: 总是读到最新的数据
select * from lock in share mode
快照读: 读取的是历史版本的记录
select .....
隐藏字段 (每一行上包括几个用户不可见的字段)
-
DB_TRX_ID
:创建或者是最后一次的修改的ID,比如某一个被 事务1
,事务2
,事务3
,事务4
的顺序进行了修改,那么这个DB_TRX_ID
则会记录4
。 -
DB_ROW_ID
:隐藏主键。 -
DB_ROW_PTR
: 回滚指针,指向undolog
。
ReadView
事务在进行快照读的时候,产生的读视图
-
trx_list
系统活跃事务ID -
up_limit_id
列表中事务最小的ID -
low_limit_id
系统尚未分配的下一个事务ID
可见性判断的过程
-
首先判断
DB_TRX_ID
<up_limit_id
,如果小于,则当前事务能看到看到DB_TRX_ID
所在的记录,如果大于等于,则进入下一个判断。 -
接下来判断
DB_TRX_ID
>=low_limit_id
,如果大于等于代表DB_TRX_ID
所在的记录,在Read View
生成以后才出现,那么对于当前事务肯定是不可见的。如果小于,则进入下一步判断。 -
判断
DB_TRX_ID
是否在活跃事务中,如果在,那么表示,这个事务还在活跃中,还没有commit
,那么修改数据,当前事务是看不到的,如果不在,则说明这个事务在read View
生成之前就已经开始开始commit
了,那么修改的结果当然是可以看见的。