什么是MVCC?

  • 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

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值