MySQL InnoDB引擎 MVCC并发控制

首先,我们来介绍一下什么是MVCC,为什么要使用MVCC,MVCC的原理,然后结合MySQL的事务隔离级别来说一下MVCC的实现。


1.MVCC定义

MVCC全称Mutli Version Concurreny Control,多版本并发控制,也可称之为一致性非锁定读;它通过行的多版本控制方式来读取当前执行时间数据库中的行数据。实质上使用的是快照数据。


2.为什么要使用MVCC

  • 消除锁的开销;这个较好理解,如果要保证数据的一致性,最简单的方式就是对操作数据进行加锁,但是加锁不可避免的会有锁开销。所以,如果有能避免进行加锁的方式当然是最好的。
  • 提高并发度,这个我们先不在这说明,看完MVCC的原理以后你自然就明白了。

3.MVCC与事务隔离级别

在InnoDB事务隔离级别“读已提交”“可重复读”下 ,InnoDB存储引擎使用MVCC机制(非锁定一致性读)。在“读已提交”事务隔离级别下,对于快照数据,MVCC读总是读取被锁定行的最新的快照数据。而“可重复读”读到的总是读取事务开始时的行数据版本


4.MVCC原理

对于“可重复读”读到的总是读取事务开始时的行数据版本,那MVCC机制是如何保证可重复读的?其实就是在每一行记录的后面增加两个隐藏列,记录创建事务ID(创建版本号)和删除事务ID(删除版本号),在每次执行新的事务时,都会更新并且递增唯一的事务ID.

4.1 Insert事务

提交插入数据事务,此时创建事务ID为1.

idnamecreate versiondelete version
1a1undefined
2b1undefined
3c1undefined

4.2 Select事务

重点:select事务查询的记录需要同时满足以上两条规则:

  1. 查询行的事务创建/修改事务ID <= 当前执行事务ID(在当前事务之前被创建的行)
  2. 删除事务ID > 当前执行事务ID (已删除行不会被查到,在当前事务后删除的行会被查到)

此时执行事务ID=2的查询事务

idname
1a
2b
3c

4.3 Delete事务

直接把该行的被删除事务ID设置为当前事务版本号,相当于标记删除,不是实际删除;例如删除id=1行

idnamecreate versiondelete version
1a13
2b1undefined
3c1undefined

执行事务ID=4的查询事务,查询结果:

idname
2b
3c

4.4 Update事务

在更新操作的时候,采用的是先标记旧的那行记录为已删除,并且删除版本号是事务版本号,然后插入一行新的记录的方式。 例如 更新id=2行的name=d

idnamecreate versiondelete version
1a13
2b15
3c1undefined
2d5undefined

执行事务ID=6的查询事务,查询结果:

idname
3c
2d

5.为什么可重复读是我们经常使用到的事务隔离级别?

其实这个问题还是比较好理解的,在读已提交的事务隔离级别下,从形成事务的ACID特性来说,读已提交违反了事务ACID特性中的隔离性。
隔离性:每个事务的读写事务对象对其他事务的操作对象能相互分离。事务之间的操作是相对独立的,事务提交前对其他事务不可见


参考:

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
多版本并发控制(MVCC)是MySQL中的一种技术,它通过维护数据的多个版本,以实现读写操作的并发控制MVCC通过在每行记录后面保存两个隐藏的列(一个保存行的创建时间,一个保存行的删除时间)来实现。当一个事务读取数据时,它会根据事务开始的时间戳和行的版本信息来确定可见的数据版本。这种机制在InnoDB存储引擎中被广泛使用,可以提供一致性读操作的保证。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQLInnoDB存储引擎-MVCC](https://blog.csdn.net/qq_53267860/article/details/125073612)[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_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [MySQL数据库多版本并发控制MVCC](https://blog.csdn.net/iuu77/article/details/129132863)[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_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [mysql多版本并发控制MVCC的实现](https://download.csdn.net/download/weixin_38607195/14907745)[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_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值