MySQL事务中MVCC和锁机制共同作用的分析

文章探讨了在MySQL中,MVCC(多版本并发控制)和锁机制如何在事务中协同工作。实验表明MVCC的快照读(普通SELECT)与加锁操作(SELECTFORUPDATE)互不干扰,加锁不会影响MVCC。UPDATE和DELETE会修改事务ID,而SELECT则不会。这导致当前读和快照读可能返回不同结果,体现了MVCC和锁的并发控制特性。
摘要由CSDN通过智能技术生成

    大家一定都可以单独理解MVCC和锁机制,但是当在一个事务中在MVCC下使用加锁语句后,MySQL的查询语句是怎么处理的呢?

​    这个问题一直困扰我很久,久久不能释怀,这里我做了一个实验,得出了结论:

  • 1、MVCC和锁机制是互不干扰的,当我们在事务中对记录使用了加锁操作,并不会影响我们后面使用快照读(普通SELECT)走MVCC(即即使当前读和快照读的数据不一致,也不会把快照读的数据刷新到MVCC中改变快照读的数据)。
  • 2、在一个事务中,UPDATE、DELETE语句会修改最新记录上的最后操作事务ID值,而SELECT语句,不管是SELECT FOR SHARE还是SELECT FOR UPDATE都不会修改最新记录上的最后操作事务ID值。

这样听起来有点抽象,所以以下使用演示的方式:

  • 验证1的正确性:

在这里插入图片描述

总结:结合6和7的结果,可以看出即使使用了当前读select for update加锁操作(不会修改记录的最新修改事务ID),后面的快照读select语句依旧走的是MVCC,导致当前读和加锁读的数据是不一样的,没有把我们前面的当前读缓存下来或者说更新到MVCC中去。

  • 验证2的正确性:

在这里插入图片描述

总结:结合8、9、10(图片标错了)可以得出,8的update语句不仅修改了记录的值,还修改了记录上的最新修改事务的ID值,所以快照读select语句走MVCC得到的数据 和 当前都select for update语句得到的数据是一样的。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值