并发操作导致的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 ...
随机推荐
- 强化学习从基础到进阶-案例与实践[1]:强化学习概述、序列决策、动作空间定义、策略价值函数、探索与利用、Gym强化学习实验
强化学习从基础到进阶-案例与实践[1]:强化学习概述.序列决策.动作空间定义.策略价值函数.探索与利用.Gym强化学习实验 1.1 强化学习概述 强化学习(reinforcement learning ...
- PaddleHub实战篇{词法分析模型LAC、情感分类ERNIE Tiny}训练、部署【三】
相关文章: 基础知识介绍: [一]ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?_汀.的博客-CSDN博客_ernie模型 百度飞桨: ...
- HTTP请求头引发的注入问题 (SQL注入)
关于请求头中注入问题的演示,这里我写了一些测试案例,用来测试请求头中存在的问题.我们常见的会发生注入的点有 Referer.X-Forwarded-For.Cookie.X-Real-IP.Accep ...
- LeetCode刷题日记 2020/03/25
力扣刷题继续! 题目:计算三维形体表面积 题干 在 N * N 的网格上,我们放置一些 1 * 1 * 1 的立方体. 每个值 v = grid[i][j] 表示 v 个正方体叠放在对应单元格 (i ...
- 有用的sql笔记(工作总结)
1.查询当前月(数字为0表示当前月份,1表示上个月,-1表示下个月,以此类推) SELECT DATE_FORMAT((CURDATE() - INTERVAL [数字] MONTH), '%Y-%m ...
- 深入操作系统内核!细致剖析 MIT 6.S081 课程 Lab 2 : system calls - 1
本文细致的剖析了2021 FALL MIT 6.S081 课程的一项实验, Lab 链接 Lab: System calls (mit.edu) . 大家的点赞将会是我继续更新的巨大动力,对文中内容或 ...
- PHP中GD库
PHP中GD库 一.GD库的介绍 1.GD库是什么? Graphic Device,图像工具库,gd库是php处理图形的扩展库,GD库提供了一系列用来处理图片的API,使用GD库可以处理图片,或者生成 ...
- 使用DoraCloud构建远程办公桌面云
公司总部在上海.员工分布在各地.部分员工需要远程办公.为了实现远程办公,有几种备选方案. 方案1.在员工的PC上安装向日葵.ToDesk之类的远程工具. 方案2.公司总部提供VPN,员工通过VPN拨号 ...
- 如何修改OSW图表中显示的主机名称
本次测试的OSW版本:831 有人可能会说这种需求是吃饱了撑的吗,谁没事儿改这个名称干嘛啊? 其实并不是,因为有些生产案例非常典型,分享讲解时也需要配合OSW的趋势图来展示,但是出于保护客户隐私(哪怕 ...
- Python实现希尔排序、快速排序、归并排序
快速排序 快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sort),通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所 ...