谈谈对MVVC理解

定义

MySQL的MVVC(Multi-Version Concurrency Control,多版本并发控制)是一种用于实现数据库的并发访问和事务隔离级别的技术,特别适用于InnoDB存储引擎。

MVVC的核心思想

是在不使用传统锁或尽量减少锁使用的情况下,通过维护数据的不同版本来提供对同一数据项的并发访问,同时保证事务的隔离性。以下是MVVC机制的主要原理和组件:

1. 版本链与行格式

版本链:在InnoDB中,每个数据行都有可能对应多个版本(历史版本)。这些版本按照时间顺序链接在一起形成一个版本链。每当事务对数据行进行修改时,都会创建一个新的版本,并将其加入到版本链中。新版本成为当前版本,旧版本继续保留在链中,直至不再被任何活跃事务需要。

行格式:InnoDB中的数据行除了包含实际数据外,还附加了一些额外信息以支持MVCC。这些信息通常包括:

  • 事务ID(Transaction ID, trx_id):记录创建或修改该行的事务ID。对于插入或更新操作,trx_id表示创建该版本的事务;对于删除操作,trx_id记录的是删除该行的事务。

  • 回滚指针(Roll Pointer, roll_ptr):指向该行在回滚段(Undo Log)中的undo记录。通过回滚指针可以获取到该行的前一个版本或恢复到之前的某个状态。

  • 可见性标识(如删除标记、创建/删除时间戳等):用于判断该行版本对某个事务是否可见。

2. 事务视图与快照读

事务视图:每个事务在启动时都会获得一个唯一的事务ID,并根据其隔离级别构建一个视图(read view)。事务视图记录了当前事务能看到哪些版本的数据:

  • 最小事务ID(min_trx_id):小于这个ID的事务在当前事务启动前已经提交,其修改对当前事务可见。

  • 最大事务ID(max_trx_id):大于这个ID的事务在当前事务启动后才开始,其修改对当前事务不可见。

  • 未提交事务列表(trx_ids):处于活跃状态且在当前事务启动时尚未提交的事务ID列表。这些事务的修改对当前事务不可见。

快照读:在MVCC下,普通的SELECT查询(非锁定读,如SELECT ... FROM ... WHERE ...)被称为“快照读”,它们读取的是事务视图创建时的数据版本。快照读不会阻塞其他事务的写操作,也不受其他事务未提交的写影响。

3. 可见性判断

当事务执行快照读时,对于查询到的每一行数据,MVCC依据以下规则判断该行版本是否对当前事务可见:

  • 如果该行版本的trx_id小于当前事务视图的min_trx_id,则认为该版本在当前事务启动前已经提交,可见。
  • 如果该行版本的trx_id大于当前事务视图的max_trx_id,则认为该版本在当前事务启动后才创建,不可见。
  • 如果该行版本的trx_id在min_trx_idmax_trx_id之间,且不在未提交事务列表中,可见。
  • 否则,不可见。

如果当前版本不可见,MVCC会沿着版本链回溯,寻找下一个符合条件的可见版本供当前事务使用。

4. 更新与删除操作

对于更新操作,InnoDB并不直接在原数据行上修改,而是创建一个新的版本并将新版本链入版本链中。原版本的可见性由MVCC判断规则决定。

对于删除操作,实际上是对数据行打上删除标记,并创建一个删除版本。物理删除(从数据页中真正移除)会在清理阶段(purge)由后台线程异步进行,确保在事务提交后其他事务仍能看到其之前版本的行。

5. 回滚与清理

回滚:当事务需要回滚时

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MVVC(Model-View-ViewModel)是一种软件架构模式,它在MVC(Model-View-Controller)和MVP(Model-View-Presenter)模式的基础上演化而来。MVVC框架是用于构建Android应用程序的一种软件架构模式。它将应用程序的不同部分分离,使代码更具可读性、可维护性和可测试性。MVVC框架通过将数据、界面和业务逻辑分离,帮助开发者更好地组织和管理复杂的应用程序。该框架的基本概念是将应用程序分为三个主要组成部分:模型(Model)、视图(View)和视图模型(ViewModel)。模型负责处理数据和业务逻辑,视图负责显示用户界面,而视图模型则作为模型和视图之间的中介,处理用户输入并更新视图。这种分离使得应用程序的不同部分可以独立开发和测试,并且能够更好地实现界面和数据的解耦。因此,采用MVVC框架可以提高Android应用程序的可维护性和可测试性,同时也有助于提高开发效率。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [前端开发框架篇--MVVC框架](https://blog.csdn.net/weixin_44715733/article/details/130647393)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [android 最新公司开源框架](https://download.csdn.net/download/a36953695/9983559)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值