一、问题由来

  上周五项目发布新版本之后,生产环境一直没有出现什么问题,大家也都开开心心,平平安安的开始新需求的开发。

可是刚稳定运行没几天,负责人突然在群里面发了一个截图,从图片中的信息可以看到,有一个SQL语句报错。这就不

太好了,这才上线没多久呢,就出这样的问题,不是太好。既然已经出现问题,我们就需要去解决问题,修复BUG。

二、问题分析

  从图片中的错误信息来看,报错的SQL语句是一个新增的操作,报错的原因一目了然,唯一索引冲突。这就尴尬了,

怎么会出现这种问题呢?某张表中的某几个字段建立了唯一组合索引,这是最后一道屏障,用来确保表中不出现业务上

重复的数据。在表的设计上这样处理,也算是一个兜底操作,前面的一大波操作都没有起效果,最后一步还是拦住了。

从这个角度来说,这也算是一件好事,如果这一步都没有拦住,那就真的是很尴尬的事情,说明整个设计存在问题。自己

仔细去排查报错的地方,代码不是自己写的,可是也需要一起进行排查,毕竟大家都是同一个项目组的,有问题大家一起

解决,总比自己单打独斗强。现在帮忙排查问题,以后自己遇到问题了,相信同事也会出手相助的。

  经过仔细排查,发现在同步某个MQ信息的时候,在判断某条数据是否重复的时候出现问题,判断的方式为先根据几个

字段查询某条数据是否存在,这几个字段就是上面创建唯一组合索引的字段。如果存在则进行更新操作,如果不存在则

进行新增操作。并且在执行这个方法之前,还是使用了redis锁操作。锁的方法很复杂自己看了大半天都没看懂,很

长一段代码。其他地方使用redis锁的代码是没问题的,自己之前测试的时候,亲自遇到过,会不会是加锁的方式不对呢?

经过和同事的讨论,最终确认是加锁的方式不对导致的问题,由于刚好不巧,多条数据通过MQ过来的时候,消费数据时

导致出现问题。

三、解决方案

  既然问题已经找到了,那么如何解决问题呢?第一种解决方案是,修改redis加锁的key,这个key必须要包含上面建立

唯一组合索引的几个字段,这样才能够真正的锁住代码,不然锁就会失效。负责人了解到我们排查到问题后,给出了另外一个

解决方案,那就是将新增操作和修改操作抽取为一个SQL语句,语句中判断条件就是创建的唯一组合索引,这样就很好的解决了

并发修改问题。由于使用的postgresql,可以做这种操作,mysql不知道有没有同样的操作。修改好代码后,立即反反复复地

进行测试,都未在出现相同的问题,因此判定这个并发修改问题已经解决。有其他思路的小伙伴,欢迎留言讨论。

并发操作导致的BUG-解决方案的更多相关文章

  1. C# 异步并发操作,只保留最后一次操作

    在我们业务操作时,难免会有多次操作,我们期望什么结果呢? 绝大部分情况,应该是只需要最后一次操作的结果,其它操作应该无效. 自定义等待的任务类 1. 可等待的任务类 AwaitableTask: // ...

  2. MySQL中char(36)被认为是GUID导致的BUG及解决方案

    MySQL中char(36)被认为是GUID导致的BUG及解决方案 有时候在使用Toad或在程序中,偶尔会遇到如下的错误: System.FormatException GUID 应包含带 4 个短划 ...

  3. 请慢慢移动……由于操作快慢导致的bug

    最近的工作中,遇到一个由于操作快慢不同导致的bug,原因是,操作慢的时候程序接收到了停止操作,继续处理正确,而快速操作的时候程序来不及处理操作停止的动作,导致需要传入的数据值已经改变,程序报错.这种缺 ...

  4. jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案

    jqueryeasyUI dialog 弹出窗口超出浏览器,导致不能关闭的bug解决方案 2014年8月30日 3233次浏览 相信很多前端朋友都用过jqueryeasyUI,jqueryeasyUI ...

  5. VS·调试过程中某个操作导致调试突然退出之解决方案

    阅文时长 | 0.11分钟 字数统计 | 232字符 主要内容 | 1.引言&背景 2.声明与参考资料 『VS·调试过程中某个操作导致调试突然退出之解决方案』 编写人 | SCscHero 编 ...

  6. 解决方案-问题001:物理机、虚机等等Linux操作系统/usr/bin目录权限误操作,导致无法切换root

    导语:平常运维人员会误操作一些目录权限,导致一些问题,那么如何恢复呢? 问题:物理机.虚机等等Linux操作系统/usr/bin目录权限误操作,导致无法切换root? 实验环境: ip地址 是否目录正 ...

  7. 客服端调用自定义宿主的WCF报错"没有终结点在侦听可以接受消息的http://localhost:8085/mex。这通常是由于不正确的地址或者 SOAP 操作导致的错误"的解决方案。

    没有终结点在侦听可以接受消息的http://localhost:8085/mex.这通常是由于不正确的地址或者 SOAP 操作导致的错误. 这个错误是由于没有启动元数据交换终结点(MEX)导致的.在宿 ...

  8. php中并发读写文件冲突的解决方案(文件锁应用示例)

    PHP(外文名: Hypertext Preprocessor,中文名:“超文本预处理器”)是一种通用开源脚本语言.语法吸收了C语言.Java和Perl的特点,入门门槛较低,易于学习,使用广泛,主要适 ...

  9. 关于web资金系统提现安全保护,防止极快的重复并发请求导致重复提现的解决思路

    关于WEB金融系统中的提现安全问题很多人没有深入思想,导致有漏洞,常常会遇到有些人遇到被攻击到导资金损失的麻烦,     其实要彻底解决重复并发请求 导致重复提现问题,是需要花点心思的,并没有看起来的 ...

  10. CMU-15445 LAB2:实现一个支持并发操作的B+树

    概述 经过几天鏖战终于完成了lab2,本lab实现一个支持并发操作的B+树.简直B格满满. B+树 为什么需要B+树 B+树本质上是一个索引数据结构.比如我们要用某个给定的ID去检索某个student ...

随机推荐

  1. C# 静态与动态数组

    在C#中,有许多内置的方法可以处理字符和字符串.这些方法是非常有用的,可以帮助开发人员更方便.更高效地处理文本数据.无论是静态数组还是动态数组,都可以使用System.Array类中的各种方法对数组进 ...

  2. Hadoop3 No FileSystem for scheme "hdfs"

    Hadoop3 No FileSystem for scheme "hdfs" 异常信息: org.apache.hadoop.fs.UnsupportedFileSystemEx ...

  3. ASP.NET Core分布式项目实战(运行Consent Page)--学习笔记

    任务21:运行Consent Page 修改 Config.cs 中的 RequireConsent 为 true,这样登录的时候就会跳转到 Consent 页面 修改 ConsentControll ...

  4. Linux centos7.6 在线及离线安装postgresql12 详细教程(rpm包安装)

    一.在线安装 官网找到对应的版本 PostgreSQL:  https://www.postgresql.org/ 1.配置yum源 sudo yum install -y https://downl ...

  5. 从零开始的react入门教程(二),从react组件说到props/state的联系与区别

    壹 ❀ 引 在从零开始的react入门教程(一)一文中,我们搭建了第一个属于自己的react应用,并简单学习了jsx语法.jsx写法上与dom标签高度一致,当然我们也知道,本质上这些react元素都是 ...

  6. NC210520 Min酱要旅行

    题目链接 题目 题目描述 从前有个富帅叫做Min酱,他很喜欢出门旅行,每次出门旅行,他会准备很大一个包裹以及一大堆东西,然后尝试各种方案去塞满它. 然而每次出门前,Min酱都会有个小小的烦恼.众所周知 ...

  7. NC19158 失衡天平

    题目链接 题目 题目描述 终于Alice走出了大魔王的陷阱,可是现在傻傻的她忘了带武器了,这可如何是好???这个时候,一个神秘老人走到她面前答应无偿给她武器,但老人有个条件,需要将所选武器分别放在天平 ...

  8. Keil MDK STM32系列(十) Ubuntu下的PlatformIO开发环境

    Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...

  9. spring boot2.0集成mybatis-plus实战

    说明: 本例演示spring boot2.0如何集成mybatis-plus 如何使用代码生成器 项目源码: https://gitee.com/indexman/mybatis-plus-demo ...

  10. Python之猜数字游戏

    说明: 本例改编自<Python编程快速上手>.例子很简单我就不多说了 直接上代码,给初学python练手用. 给你6次机会猜对一个预先生成好的1-20之间的整数.覆盖一下知识点: 条件语 ...