并发操作导致的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 ...
随机推荐
- C/C++ 反汇编:函数与结构体
反汇编即把目标二进制机器码转为汇编代码的过程,该技术常用于软件破解.外挂技术.病毒分析.逆向工程.软件汉化等领域,学习和理解反汇编对软件调试.系统漏洞挖掘.内核原理及理解高级语言代码都有相当大的帮助, ...
- C++ Boost 文件系统相关函数
基础处理 #include <iostream> #include <boost/foreach.hpp> #include <boost/filesystem.hpp& ...
- Qt信号槽原理
1.说明 使用Qt已经好几年了,一直以为自己懂Qt,熟悉Qt,使用起来很是熟练,无论什么项目,都喜欢用Qt编写.但真正去看Qt的源码,去理解Qt的思想也就近两年的事. 本次就着重介绍一下Qt的核心功能 ...
- [奶奶看了都会]ChatGPT接入企业微信成为聊天机器人
1.聊天效果 上次给大家讲了ChatGPT接入个人微信的方法,但是个人微信容易被封号.这次就教大家接入企业微信,不会再被封号哦~ 话不多说,直接看机器人的聊天效果.基本能实现ChatGPT的聊天效果了 ...
- Linux-Shell变量的算术运算
一.算术运算符 1.+.- 求和. a+b a-b 2. *./.% 求乘积,商,余数 a*b a/b a/b 3.** 幂运算,例如 3**3 是求 3 的立方,即 27 4. ...
- 【Unity3D】人物跟随鼠标位置
1 游戏对象 2D动画和人体模型及动画中介绍了 Aniamtion.Animator.人体模型.人体骨骼.人体动画等基础知识,本文将通过 "人物跟随鼠标位置" 案例加强对 Un ...
- springboot中前端ajax如何给controller提交数组参数?
说明 我有个需求,前端批量添加一堆商品明细.也就是说会有一个商品ID,然后一堆商品明细,多行. 如此一来,针对后端接口肯定是要以数组或列表方式接收这个商品明细数组了. 前端代码 关键地方在于以form ...
- ORA-12514问题解决
版本:11.2.0.1.0 - 64bit 本机安装Oracle后链接测试发现以下情况: sqlplus scott/tiger 正常登陆 sqlplus scott/tiger@orcl 登陆失败 ...
- Python之初级RPG小游戏
在国外网站上找到一个练习Python的小游戏感觉不错,自己实现了一下. 通过该练习你能学到: 元组 字典 简单定义函数和封装 条件控制语句 游戏说明 以下是3个房间和1个花园: Hall 客厅 有一把 ...
- [Android 逆向]绕过小米需插卡安装apk限制
1. 确保自己手机是root的了 2. 给手机安装busybox,使可以用vi编辑文件 安装方法: 0. adb shell getprop ro.product.cpu.abi 获得 cpu架构信息 ...