-
MVCC(Multiversion Concurrency Control)多版本并发控制
-
MVCC的本质是采用乐观锁思想的一种方式
-
MVCC是为了解决读写冲突
-
MVCC的实现依赖于隐藏字段、Undo Log、Read View
-
隐藏字段
-
DB_TRX_ID:
-
记录最近修改这条记录的事务ID。这个字段用于标识插入或最后一次修改该行记录的事务。当一个新的事务尝试读取数据时,会根据这个ID与当前的Read View进行对比,以决定数据的可见性。
-
-
DB_ROLL_PTR:
-
回滚指针,指向这条记录的上一个版本。当一条记录被更新时,InnoDB不会直接修改原记录,而是创建一个新的版本,并通过这个回滚指针链接到旧版本。这样就形成了一个版本链,允许事务回滚到之前的状态,同时也支持历史数据的查询。
-
-
DB_ROW_ID:
-
隐含的自增ID,也称为隐藏主键。如果表结构没有指定主键,InnoDB会自动生成这样一个唯一键。它帮助维持记录的唯一性和索引结构,即便在无显式主键的表中也能保证MVCC机制的运作。
-
-
-
Read View:控制读取的是什么版本的历史记录
-
参数
-
creator_trx_id:创建这个 Read View 的事务 ID
-
trx_ids:表示在生成ReadView时当前系统中,活跃的(“活跃”指的就是,启动了但还没提交)事务id列表
-
up_limit_id:活跃的事务中最小的事务 ID
-
low_limit_id:最大事务id+1
-
-
规则
-
ReadView的规则
-
trx_id记录undo log版本链的事务id
-
如果被访问版本的trx_id属性值与ReadView中的creator_trx_id值相同,意味着当前事务在访问它自己修改过的记录,所以该版本可以被当前事务访问
-
如果被访问版本的trx_id属性值小于ReadView中的up_limit_id值,表明生成该版本的事务在当前事务生成ReadView前已经提交,所以 该版本可以被当前事务访问
-
如果被访问版本的trx_id属性值大于或等于ReadView中的low_limit_id值,表明生成该版本的事务在当前事务生成ReadView后才开启,所以该版本不可以被当前事务访问
-
如果被访问版本的trx_id属性值在ReadView的up_limit_id和 low_limit_id之间,那就需要判断一下trx id属性值是不是在 trx_ids 列表中
-
如果在,说明创建ReadView时生成该版本的事务还是活跃的(未提交),该版本不可以被访问
-
如果不在,说明创建ReadView时生成该版本的事务已经被提交,该版本可以被访问
-
-
-
-
-
Undo Log:保存历史快照
-
多个事务对同一个行记录进行更新会产生多个历史快照,这些历史快照保存在 Undo Log
-
-
什么是MVCC?
于 2024-04-15 18:06:25 首次发布