本文横向对比主流数据库的 MVCC 实现:PostgreSQL 采用堆表追加式、由旧到新的版本链,InnoDB 采用 undo 增量、由新到旧的版本链,TiKV 将版本编码进键。三者可见性规则等价,但快照隔离会放过写偏斜;PostgreSQL 用 SSI 在线检测危险结构实现可串行化,代价是误杀。长事务会拖住回收水位,导致版本膨胀。
介绍MySQL事务隔离级别设置和MVCC原理,可通过修改启动参数或SET语句改变隔离级别,MVCC通过版本链和ReadView实现,ReadView包含活跃事务的事务id列表、最小事务id、下一个事务id和生成该ReadView的事务id。ReadView的可见性规则总结如下:trx_id = creator_trx_id时,该版本可以被当前事务访问;trx_id < min_trx_id时,该版本可以被当前事务访问;trx_id ≥ max_trx_id时,该版本不可以被当前事务访问;min_trx_id ≤ trx_id ≤ max_trx_id之间,需要判断trx_id属性值是不是在m_ids列表中,如果在,该版本不可以被访问;如果不在,该版本可以被访问。
完成下面两步后,将自动完成登录并继续当前操作。