首页 > 其他分享 >日常Bug排查-MVCC和for update混用导致读数据不一致

日常Bug排查-MVCC和for update混用导致读数据不一致

时间:2024-06-03 09:12:36浏览次数:11  
标签:update 读数据 排查 MVCC Bug Select

日常Bug排查-MVCC和for update混用导致读数据不一致

前言

日常Bug排查系列都是一些简单Bug的排查。笔者将在这里介绍一些排查Bug的简单技巧,同时顺便积累素材。

Bug现场

又是喜闻乐见的读数据不一致的问题。这次的问题是这样,业务在一个事务中更新A和B两个表的两个数据。但是在另一个事务中只看到了A的更新,而B依旧是更新之前的值。说好的原子性感觉又被打破了。如下图所示:

思路

在将这两个请求的SQL按照时序画出来的时候,笔者立马就明白了相关问题所在。核心就在于数据库是RR隔离级别的,同时业务在查询A的时候使用的是Select for update,在查询B的时候使用的是普通的Select。这么使用的原因可能是觉得所有的查询都需要先查A再查B,那么只需要对A加锁就行,减少了数据库锁的数量。
但是,这里是有一个问题的,就是对B表的查询用的是普通的Select,也就是使用了MySQL的MVCC机制。而MySQL MVCC的默认创建时刻就是事务的第一个不带for update的普通Select(具体原理见笔者的博客https://my.oschina.net/alchemystar/blog/1927425)。那么我们就可以从上面的SQL顺序可以看到,在事务1开始之前就已经创建了视图,此时的视图是A1和B1。那么由于RR,查询B表的普通Select看到的自然是B1,而select for update不走MVCC,于是看到的是A2。如下图所示:

解决方案

让业务对B表的查询也用Select for update即可,相比于不一致增加的一点非热点行锁的性能可以忽略不计。

总结

MVCC和数据库锁两者采用了不同的机制,如果不清楚其中的原理可能会导致不一致的现象出现。同时,在这次的问题中业务对于B表不用锁这样的优化实际上是一个负优化。这再次提醒我们,不要过早优化!

标签:update,读数据,排查,MVCC,Bug,Select
From: https://www.cnblogs.com/alchemystar/p/18227012

相关文章

  • twrp 刷机包 刷入magisk.zip 构造原理 关键词:META-INF update-binary updater-script
    https://blog.csdn.net/yuleslie/article/details/8718385  #MAGISK##############################################MagiskFlashScript(updater-script)#bytopjohnwu############################################################Preparation#########......
  • MySQL中UPDATE JOIN
    在MySQL数据库中,UPDATE语句用于修改表中现有的记录。有时,我们需要根据另一个相关联表中的条件来更新表中的数据。这时就需要使用UPDATEJOIN语句。最近我们遇到了这样的需求:我们有一张历史记录表,其中一个字段记录了用,连接的多个用户账号。现在,我们添加了一列,需要将这些账号翻译为......
  • etcd MVCC 存储结构及流程
    什么是MVCCMVCC是Multi-VersionConcurrencyControl的缩写,即多版本并发控制。它是一种并发控制的方法,用于在数据库系统中实现事务的隔离性。MVCC是一种乐观锁机制,它通过保存数据的多个版本来实现事务的隔禽性。在etcd中,MVCC是用于实现数据的版本控制的。而且可以查看历......
  • 详解MVCC以及尽可能解决幻读的两种方案
    MVCC通过「版本链」来控制并发事务访问同一个记录时的行为并行事务问题+隔离级别幻读:在一个事务内多次查询某个符合查询条件的「记录数量」,如果出现前后两次查询到的记录数量不一样的情况,就意味着发生了「幻读」现象。脏读:读到其他事务未提交的数据;不可重复读:前后读取......
  • VMware vCenter Server 7.0 Update 3q 下载 - 集中管理 vSphere 环境
    VMwarevCenterServer7.0Update3q下载-集中管理vSphere环境请访问原文链接:https://sysin.org/blog/vmware-vcenter-7-u3/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgVMwarevCenterServer是一款高级服务器管理软件,提供了一个集中式平台来控制vSphere......
  • VMware vSphere 7 Update 3q 下载
    VMwarevSphere7Update3q下载vCenterServer&ESXi,Dell,HPE,Cisco,LENOVO,FUJITSU,NEC,Inspur,HitachiCustomImage请访问原文链接:https://sysin.org/blog/vmware-vsphere-7-u3/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org服务器虚拟化软件vSphe......
  • VMware vSphere 8.0 Update 2c 下载 - 企业级工作负载平台
    VMwarevSphere8.0Update2c下载-企业级工作负载平台ESXi8.0U2&vCenterServer8.0U2请访问原文链接:https://sysin.org/blog/vmware-vsphere-8-u2/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.org企业级工作负载平台vSphere将云计算的优势引入本地部署工作......
  • GeneralUpdate .Net5 WPF、Winfrom、控制台应用自动更新组件
    https://www.bilibili.com/video/BV1aX4y137dd/?vd_source=43d3e66cc2ad46bac54dfb0c6a3a0a23    GeneralUpdate教程2022.4.23 https://www.bilibili.com/video/BV1FT4y1Y7hV/?vd_source=43d3e66cc2ad46bac54dfb0c6a3a0a23   https://mp.weixin.qq.com/s/pR......
  • [999] Update table values in a geodatabase using arcpy
    Toupdatevaluesinafeatureclasswithinageodatabaseusingacrpy,wecanuseanUpdateCursor.UsinganUpdateCursorYoucanusean arcpy.da.UpdateCursortoiteratethroughtherowsofyourfeatureclassandupdatespecificfields.Hereisanexample......
  • 问microdnf update命令安装新包,而不仅仅是更新现有的包。
    我的Dockerfile使用基本映像registry.access.redhat.com/ubi8/ubi-minimal,它有microdnf包管理器。当我在docker文件中包含以下代码片段以获得现有包的最新更新时,代码语言:javascript复制RUNtrue\&&microdnfcleanall\&&microdnfupdate--nodocs\......