MySQL是如何实现MVCC的
原理
基于 (隐藏字段 + undolog
+ readView
)来实现MVCC
的
undolog
:修改数据时,将该记录写入到版本链中,
undolog
, 每次放在头部。行隐藏字段:
db_trx_id
:事务ID,全局唯一roll_pointer
版本链指针
ReadView
中的统计值:
m_ids
当前活跃的事务集合(所有未提交的事务)min_trx_id
m_ids
中最小的。即最小的活跃事务IDmax_trx_id
版本链头的事务+1。max_trx_id
并不是m_ids
中的最大值,事务ID是递增分配的。比方说现在有id
为1,2,3这三个事务,之后id
为3的事务提交了。那么一个新的读事务在生成ReadView
时,m_ids
就包括1和2,min_trx_id
的值就是1,max_trx_id
的值就是4creator_trx_id
当前创建这个视图的事务ID
根据上图,当前事务ID为201时,统计值如下:
m_ids
= [90,100, 200]min_tx_id
= 90max_tx_id
= 200 + 1 = 201creator_trx_id
= 201
判断规则
从undolog
链表头部开始遍历
伪代码如下:
1 | if (该记录trx_id == 当前自己的事务id) { |