并发操作导致的BUG-解决方案
一、问题由来
上周五项目发布新版本之后,生产环境一直没有出现什么问题,大家也都开开心心,平平安安的开始新需求的开发。
可是刚稳定运行没几天,负责人突然在群里面发了一个截图,从图片中的信息可以看到,有一个SQL语句报错。这就不
太好了,这才上线没多久呢,就出这样的问题,不是太好。既然已经出现问题,我们就需要去解决问题,修复BUG。
二、问题分析
从图片中的错误信息来看,报错的SQL语句是一个新增的操作,报错的原因一目了然,唯一索引冲突。这就尴尬了,
怎么会出现这种问题呢?某张表中的某几个字段建立了唯一组合索引,这是最后一道屏障,用来确保表中不出现业务上
重复的数据。在表的设计上这样处理,也算是一个兜底操作,前面的一大波操作都没有起效果,最后一步还是拦住了。
从这个角度来说,这也算是一件好事,如果这一步都没有拦住,那就真的是很尴尬的事情,说明整个设计存在问题。自己
仔细去排查报错的地方,代码不是自己写的,可是也需要一起进行排查,毕竟大家都是同一个项目组的,有问题大家一起
解决,总比自己单打独斗强。现在帮忙排查问题,以后自己遇到问题了,相信同事也会出手相助的。
经过仔细排查,发现在同步某个MQ信息的时候,在判断某条数据是否重复的时候出现问题,判断的方式为先根据几个
字段查询某条数据是否存在,这几个字段就是上面创建唯一组合索引的字段。如果存在则进行更新操作,如果不存在则
进行新增操作。并且在执行这个方法之前,还是使用了redis锁操作。锁的方法很复杂自己看了大半天都没看懂,很
长一段代码。其他地方使用redis锁的代码是没问题的,自己之前测试的时候,亲自遇到过,会不会是加锁的方式不对呢?
经过和同事的讨论,最终确认是加锁的方式不对导致的问题,由于刚好不巧,多条数据通过MQ过来的时候,消费数据时
导致出现问题。
三、解决方案
既然问题已经找到了,那么如何解决问题呢?第一种解决方案是,修改redis加锁的key,这个key必须要包含上面建立
唯一组合索引的几个字段,这样才能够真正的锁住代码,不然锁就会失效。负责人了解到我们排查到问题后,给出了另外一个
解决方案,那就是将新增操作和修改操作抽取为一个SQL语句,语句中判断条件就是创建的唯一组合索引,这样就很好的解决了
并发修改问题。由于使用的postgresql,可以做这种操作,mysql不知道有没有同样的操作。修改好代码后,立即反反复复地
进行测试,都未在出现相同的问题,因此判定这个并发修改问题已经解决。有其他思路的小伙伴,欢迎留言讨论。
并发操作导致的BUG-解决方案的更多相关文章
- C# 异步并发操作,只保留最后一次操作
在我们业务操作时,难免会有多次操作,我们期望什么结果呢? 绝大部分情况,应该是只需要最后一次操作的结果,其它操作应该无效. 自定义等待的任务类 1. 可等待的任务类 AwaitableTask: // ...
- MySQL中char(36)被认为是GUID导致的BUG及解决方案
MySQL中char(36)被认为是GUID导致的BUG及解决方案 有时候在使用Toad或在程序中,偶尔会遇到如下的错误: System.FormatException GUID 应包含带 4 个短划 ...
- 请慢慢移动……由于操作快慢导致的bug
最近的工作中,遇到一个由于操作快慢不同导致的bug,原因是,操作慢的时候程序接收到了停止操作,继续处理正确,而快速操作的时候程序来不及处理操作停止的动作,导致需要传入的数据值已经改变,程序报错.这种缺 ...
- jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案
jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案 2014年8月30日 3233次浏览 相信很多前端朋友都用过jqueryeasyUI,jqueryeasyUI ...
- VS·调试过程中某个操作导致调试突然退出之解决方案
阅文时长 | 0.11分钟 字数统计 | 232字符 主要内容 | 1.引言&背景 2.声明与参考资料 『VS·调试过程中某个操作导致调试突然退出之解决方案』 编写人 | SCscHero 编 ...
- 解决方案-问题001:物理机、虚机等等Linux操作系统/usr/bin目录权限误操作,导致无法切换root
导语:平常运维人员会误操作一些目录权限,导致一些问题,那么如何恢复呢? 问题:物理机.虚机等等Linux操作系统/usr/bin目录权限误操作,导致无法切换root? 实验环境: ip地址 是否目录正 ...
- 客服端调用自定义宿主的WCF报错"没有终结点在侦听可以接受消息的http://localhost:8085/mex。这通常是由于不正确的地址或者 SOAP 操作导致的错误"的解决方案。
没有终结点在侦听可以接受消息的http://localhost:8085/mex.这通常是由于不正确的地址或者 SOAP 操作导致的错误. 这个错误是由于没有启动元数据交换终结点(MEX)导致的.在宿 ...
- php中并发读写文件冲突的解决方案(文件锁应用示例)
PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...
- 关于web资金系统提现安全保护,防止极快的重复并发请求导致重复提现的解决思路
关于WEB金融系统中的提现安全问题很多人没有深入思想,导致有漏洞,常常会遇到有些人遇到被攻击到导资金损失的麻烦, 其实要彻底解决重复并发请求 导致重复提现问题,是需要花点心思的,并没有看起来的 ...
- CMU-15445 LAB2:实现一个支持并发操作的B+树
概述 经过几天鏖战终于完成了lab2,本lab实现一个支持并发操作的B+树.简直B格满满. B+树 为什么需要B+树 B+树本质上是一个索引数据结构.比如我们要用某个给定的ID去检索某个student ...
随机推荐
- NLP领域任务如何选择合适预训练模型以及选择合适的方案【规范建议】【ERNIE模型首选】
1.常见NLP任务 信息抽取:从给定文本中抽取重要的信息,比如时间.地点.人物.事件.原因.结果.数字.日期.货币.专有名词等等.通俗说来,就是要了解谁在什么时候.什么原因.对谁.做了什么事.有什么结 ...
- 7.1 C/C++ 实现动态数组
动态数组相比于静态数组具有更大的灵活性,因为其大小可以在运行时根据程序的需要动态地进行分配和调整,而不需要在编译时就确定数组的大小.这使得动态数组非常适合于需要动态添加或删除元素的情况,因为它们可以在 ...
- MySQL 存储过程与函数(精简笔记)
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品.MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RD ...
- hydra 密码爆破工具入门
Hydra(九头蛇海德拉)是希腊神话之中的一个怪兽,以九个头闻名于世,在Kali中hydray(hai der rua) 是默认被安装的,该工具是密码破解的老司机,可以破解各种登录密码,非常怪兽,但是 ...
- 协程(Python)
一.gevent #__author__:Kelvin #date:2020/5/13 13:34 from gevent import monkey monkey.patch_all() impor ...
- 洛谷P2415 集合求和(数学问题,使用集合子集求和公式)
可以知道对于一个有n个数据的集合,其子集个数有2^n个 至于证明可以这样理解,对于n个数据,其子集就是对数据进行组和,而对于每个位置上的数据,组合时仅有两种状态即有此数据或无此数据,也就是有两种可能, ...
- qwb2023落荒而逃版
前言 qwb2023 .12.15 被打废了,N1决赛和qwb,有一个pwn可以做的但是已经在做misc看都不看--无语了. Pyjail ! It's myFILTER !!!|SOLVED|N1n ...
- CF1850H The Third Letter
题目链接 题解 知识点:贪心,图论建模. 考虑对约束 a b d 建边 \(a \mathop{\to}\limits^d b\) 与 \(b \mathop{\to}\limits^{-d} a\) ...
- NVME(学习笔记七)—Atomicity Operation
5.21.1.10 Write Atomicity Normal 这个特性控制AWUN和NAWUN参数的操作.设置的属性值在set Feature命令的Dword 11中表明. 如果提交Get Fea ...
- Js将字符串转数字的方式
Js将字符串转数字的方式 Js字符串转换数字方方式主要有三类:转换函数.强制类型转换.弱类型隐式类型转换,利用这三类转换的方式可以有5种转换的方法. parseInt() parseInt()和Num ...