MySQL多版本并发控制(MVCC)

为了提高并发性能MySQL、Oracle等数据库等关系型数据库都实现了多版本并发控制-MVCC(Multi-Version Concurrent Control),由于没有统一的实现标准,它们的实现机制并不相同。
可以认为MVCC是行级锁的一个变种,但是在大多数情况下避免了加锁,所以开销更低。虽然实现机制有所不同,但是大多实现了非阻塞的读操作,写操作也只是锁定了必要的行。
MVCC的实现,是通过保存数据某个时间点的快照来实现的。也就是说不管执行多长时间,每个事务看到的数据时一致的。根据事务开始时间的不通,每个事务对同一张表,同一时刻看到的数据可能是不一样的。
InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的。分别保存创建时间和过期时间。当然储存的不是实际的时间至,而是系统版本号(system version number)。每一个新事物开始,系统版本号都会自动递增。事务开始时刻的系统版本号会作为事务的版本号,用来和查询到的每行记录的版本号进行比较。下面看看REPEATABLE READ隔离级别下,MVCC具体是怎么操作的。

1. SELECT

InnoDB会根据一下两个条件检查每行记录:

  1. InnoDB只查找行的系统版本号小于或者等于事务的系统版本号,这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的
  2. 行的删除版本要么未定义,要么大于当前事务版本号。这可以确保事务读取到的行,在事务开始之前未被删除

只有满足以上两个条件,才能返回作为查询结果

2. INSERT

InnoDB为新插入的每一行保存当前系统版本号作为行版本号

3. DELETE

InnoDB为删除的每一行保存当前系统版本号作为删除标识

4. UPDADE

InnoDB为插入一行新纪录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标识

这也解释了为什么自增ID的数据删除后,新增数据后会跳过当前ID

保存这两个额外系统版本号,是大多数读操作可以不用加锁。使读操作性能好,操作简单,能保证符合标准的行。不足是每行记录需要额外的存储空间,需要做更多行检查工作,以及一些额外的维护工作。

MVCC只在REPEATABLE READ 和READ COMMITTED两个隔离级别下工作。其它两个级别不兼容,因为,READ UNCOMMITTED总是读取到最新的数据行,而不是符合当前事务版本的数据行。而SERIALIZABLE则对所有读取的行都加锁

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
版本并发控制(MVCC)是MySQL中的一种技术,它通过维护数据的多个版本,以实现读写操作的并发控制MVCC通过在每行记录后面保存两个隐藏的列(一个保存行的创建时间,一个保存行的删除时间)来实现。当一个事务读取数据时,它会根据事务开始的时间戳和行的版本信息来确定可见的数据版本。这种机制在InnoDB存储引擎中被广泛使用,可以提供一致性读操作的保证。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [MySQL之InnoDB存储引擎-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、付费专栏及课程。

余额充值