Mysql的多版本并发控制记录
MVCC实现机制
mvcc的实现依赖于几个字段
-
表中的隐藏列:
- row_id:行id,没有主键和唯一列时默认生成的一个隐藏主键,有的话不生成 6字节
- trx_id:修改该行的事务id、
- roll_pointer:回滚指针,指向undo log 版本链
-
ReadView字段:creator_trx_id、m_ids、min_trx_id、max_trx_id
- creator_trx_id:生成该ReadView的事务id。
- m_ids:在生成该ReadView时,仍然活跃未提交的事务的id列表。
- min_trx_id:m_ids中的最小值。
- max_trx_id:创建ReadView时当前数据库给下一事务的id值。
访问机制:
- 如果记录的 trx_id<min_trx_id,说明这个版本的记录在创建ReadView前已经提交的事务生成的,所以该版本记录对当前事务可见。
- 如果记录的 tex_id>=max_trx_id,说明这个版本的记录时在创建ReadView之后的事务生成的,所以改版记录对当前事务不可见。
- 如果记录的 tex_id在 min_trx_id 和 max_trx_id 之间:
- 如果 tex_id 在 m_ids中:表示生成该版本记录的事务仍然活跃,所以该版记录对当前事务不可见。
- 如果 **tex_id 不在 m_ids中:**表示生成该版本记录的事务已经提交,所以该版记录对当前事务可见。