ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

MVCC 的一些总结

2022-06-30 19:00:25  阅读:184  来源: 互联网

标签:总结 加锁 快照 Read trx MVCC 一些 View


解决问题

  1. MVCC(Multiversion Concurrency Control),多版本并发控制。MVCC 的目的是为了提高数据库并发性能,用更好的方式去处理读-写冲突、同时做到不加锁非阻塞并发读写
  2. MVCC 可以解决脏读、不可重复读,MVCC 使用快照读解决了部分幻读问题,而在当前读时还存在幻读问题,是通过临键锁解决的。
  3. 在 InnoDB 中 MVCC 本质是采用乐观锁思想的一种方式,而当前读是一种加锁的操作,是悲观锁的实现。

 

设计思路

  1. 使用 READ UNCOMMITTED 隔离级别的事务,由于可以读到未提交事务修改过的记录,所以直接读取记录的最新版本。
  2. 使用 SERIALIZABLE 隔离级别的事务,InnoDB 规定使用加锁的方式来访问记录。
  3. 使用 READ COMMITTED 和 REPEATABLE READ 隔离级别的事务,核心问题就是需要判断一下版本链中的哪个版本是当前事务可见的,这是 Read View 要解决的主要问题。

总结:只有在事务隔离级别 READ COMMITTED 和 REPEATABLE READ 下使用 MVCC

 

实现思路

MVCC 的实现依赖于:隐藏字段Undo logRead View

B+ 树上对应的记录只会有一个最新版本,但 InnoDB 可以根据 undo log 得到数据的历史版本,从而实现多版本控制。
那么每条行记录如何去找到关于它的 undo long 呢?
InnoDB 存储引擎中每条行记录都拥有两个隐藏的字段:trx_id 和 roll_pointer。trx_id 是最近更新这条行记录的事务 ID,roll_pointer 指向之前生成的 undo_log。

每次修改行记录都会更新 trx_id 和 roll_pointer 这两个隐藏字段,之前的多个数据快照对应的 undo log 会通过 roll_pointer 指针串联起来形成版本链。
Read View 包含四个字段:m_ids,min_trx_id,max_trx_id,creator_trx_id。

 

快照读与当前读

MVCC 主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读,而这个读指的就是快照读,而非当前读

快照读:快照读又叫一致性读,读取的是快照数据,不加锁的简单的 SELECT 都属于快照读

当前读:当前读读取的是记录的最新版本,加锁的 SELECT,或者对数据进行增删改都会进行当前读。需要注意的是,当前读是通过 next_key lock 锁防止幻读的

 

Read View 的获取

  1. 在隔离级别为读已提交(Read Committed)时,一个事务中的每一次 SELECT 查询都会重新获取一次 Read View。如果 Read View 不同,就可能产生不可重复读或者幻读的情况。
  2. 当隔离级别为可重复读(REPEATABLE READ)时,一个事务只在第一次 SELECT 的时候会获取一次 Read View,而后面所有的 SELECT 都会复用这个 Read View。

 

 

标签:总结,加锁,快照,Read,trx,MVCC,一些,View
来源: https://www.cnblogs.com/zyb993963526/p/16428083.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有