首页 > 其他分享 >日常Bug排查-偶发性读数据不一致

日常Bug排查-偶发性读数据不一致

时间:2024-05-20 09:10:00浏览次数:24  
标签:隔离 读数据 偶发性 排查 RC t1 级别 Bug

日常Bug排查-偶发性读数据不一致

前言

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

Bug现场

业务场景

先描述这个问题出现的业务场景。这是一个支付的场景,如果支付成功了,我们就把支付状态置为success(主单据更新)同时写入支付成功时间戳为t1(子单据更新)。支付成功之后,我们还需要做其它的动作,做这个动作的时候我们需要刚才的支付成功时间戳t1。那么,我们正常的请求顺序即为:

Bug现场

奇怪的是,线上运行时候,会有极小的概率(大概是几亿分之一)获取的这个时间戳为0!也即在读到主单为success的时候,看到的子单时间戳是0!由于时间戳为0,所以调用下游RPC传参错误导致了调用失败。
如下图所示:

思路

因为在请求1中,我们是在事务内更新的,数据应该始终保持一致才对。那很直观的第一个思考点就是:
思路1: 是不是事务没生效?笔者看了下源代码,使用没有问题,也不存在类内方法互相调用的情况。再者说,如果事务没生效,概率不至于这么低。
思路2:稍加思索一下,好像这个是事务隔离级别的原因。在这个Case里面,看上去数据库采用的RC隔离级别,也就是读已提交。如下图所示:

t1时刻,请求2查询到的子单据时间戳为0
t2时刻,请求1提交,这时候将子单据时间戳更新为t1,主单据状态为success
t3时刻,请求2由于RC隔离级别,能看到请求1的提交,主单状态为success,所以判定可以进行下游RPC的调用,但是由于在t1时刻获取到的时间戳为0,导致调用失败

矛盾点

数据库隔离级别是RC应该能非常好的解释出现Bug时的行为。于是笔者查了一下隔离级别,发现是RR,这就陷入了矛盾!但由于RC这个隔离级别解释这个Bug非常的靠谱,所以笔者看了下业务的数据库配置,发现它有100个库。那么就自然有了下一步猜想:这100个库中有的是RR的,有的是RC的。出问题的那个库正好就是RC的。

指定库查询隔离级别

于是笔者就根据业务的shardKey到了指定的库查询隔离级别,发现它果然是RC级别的,真相大白!这100个库中大概有1/3的库是RC隔离级别。

后续修复

这个问题是由于DBA在换库的过程中采用了默认的配置,导致原来设置为RR级别的库在换了大容量机器后被默认改成了RC隔离级别。DBA找了个时间将隔离级别切换回RR后问题就消失了,并编写了相应的巡检脚本防止此类问题再次发生。

总结

隔离级别是比较微妙的,相关问题大多只在高并发大流量下才会有偶发性的显现,分库分表集群中不同DB的隔离级别由于种种原因导致的不一致会加大问题的排查难度。有时候遇到无法解释问题时可以考虑下底层组件的设置问题。

标签:隔离,读数据,偶发性,排查,RC,t1,级别,Bug
From: https://www.cnblogs.com/alchemystar/p/18200156

相关文章

  • 解决VSCode中Debug和运行路径不一致的
    哈喽,大家好,我是木头左!背景介绍在VisualStudioCode(简称VSCode)中进行开发时,经常需要使用到调试(Debug)功能。然而,有时候会发现,当尝试调试程序时,程序的运行路径与预期不符。这通常会导致程序无法正确读取文件或访问资源,从而影响调试过程。为了解决这个问题,可以在launch.json文件......
  • ./configure --with-debug --prefix=/Users/root/opt/nginx/debug_nginx
    %./configure--with-debug--prefix=/Users/root/opt/nginx/debug_nginxcheckingforOS+Darwin21.6.0x86_64checkingforCcompiler...found+usingClangCcompiler+clangversion:14.0.0(clang-1400.0.29.202)checkingfor-Wl,-Eswitch...notfoundchec......
  • jenkins docker 开启debug 简单说明
    jenkinsdocker镜像为了方便调试,已经内置了一个环境变量可以方便的开启基于jdwp协议的debug处理,以下是一个简单使用参考配置docker-compose文件services:jenkins:image:jenkins/jenkins:ltsenvironment:-DEBUG=trueports:......
  • npm install bug集
    报错信息gypERR!configureerrorgypERR!stackError:`gyp`failedwithexitcode:1gypERR!stackatChildProcess.onCpExit(/usr/local/lib/node_modules/npm/node_modules/node-gyp/lib/configure.js:351:16)gypERR!stackatChildProcess.emit(event......
  • docker debug记录
    Error1:failedtoregisterlayer:open/data1/Installer/dockerInstallDir/docker/overlay2/5ee088aebf668f13b34c528c8009e67fe6aec5592f692dc5425c3e0d32bc4427/.tmp-committed2657031997:nosuchfileordirectory$dockersystemprune-a$systemctlstopdocker......
  • 远程debug
    1、首先配置idea点击右上角的编辑配置.2、配置jvm将刚才idea生成的jvm指令复制下来,就是如下内容(注意要从你的idea中复制)-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005在粘贴之前,要拼接上java-jar命令,还有server=y,suspend=y命令,最后拼接......
  • 我发现了字节OpenApi接口的bug!
    本文记录我在对接字节旗下产品火山云旗下云游戏产品OpenApi接口文档时遇到的坑,希望能帮助大家(火山云旗下云游戏产品的文档坑很多,我算是从零到一都踩了一遍,特此记录,希望大家引以为鉴)。1.文档问题很经典的开局一张图,对接全靠问,这里给大家强调下,当要跟第三方产品对接时,一定要......
  • debug技巧之远程调试
    一、前言大家好啊,我是summo,今天给大家分享一下我平时是怎么调试代码的,不是权威也不是教学,就是简单分享一下,如果大家还有更好的调试方式也可以多多交流哦。当我们的应用发布到线上之后,就不能随意启停了,但如果线上出现了BUG怎么办呢?大多数时候我们会借助线上打印的日志进行排查问......
  • Bug搬运工-support of DACL on 9800 WLC platform.
    supportofDACLon9800WLCplatform.CSCvv16183 Symptom:noneConditions:9800runninganycodeandanymodelofAP.Workaround:noneFurtherProblemDescription:dACLwasaddedinrelease17.10 Requestfor9800tosupportDACLCSCvw89561 Symptom:......
  • JavaScript object array sort by string bug All In One
    JavaScriptobjectarraysortbystringbugAllInOnebug//purestringsarray,sortOK✅letarr=["banana","strawberry","apple"];JSON.stringify(arr.sort());//'["apple","banana","strawbe......