前提:一份万年不变的代码,居然报了错
我们公司也算是个电商公司,网站自然支持支付宝和微信支付,支付网关完成后,使用一直没啥大问题,直到uat环境有一天突然基本不能支付,所有支付方式回调都失败,于是开始了漫漫bug长路。。。
1.看堆栈
root cause: caused by OptimisticLockingFailureException.....
乐观锁异常,是在根据id查询订单时报出来的,于是去看代码,没有发现代码上有啥问题,over
2.该bug并非每次都出,有很小的概率会成功,并且debug时不会抛异常,于是怀疑是多线程问题
由于uat环境最近网络不是很稳定,于是初步怀疑是支付宝或微信支付多次通知,多个线程同时查询(查询前有update hibernate托管的订单对象的操作),于是update--query交错执行,导致报错。
然后把线程池改成1,部署重启,依然报错。。。。over
3.看起来应该是多线程,但貌似又不是多线程问题,绞尽脑汁,看了两天的bug,无果而终。。。
4.寻找原因失败,那就对比吧,此时发现另外一个自测的test环境没有此问题。既然代码是一样的,那就只能怀疑是数据库了,虽然很牵强。。。
于是把test数据库copy到uat环境,重启服务器,bug神奇消失,好吧,虽然没找到原因,但总算解决了。
由于还要忙其他事,没那么多时间耗在这上面,所以勉强放过它吧,哦也~
5.平静的度过了一周,直到一天下午,测试妹纸又跑来说粗大事啦支付不起啦。堆栈一样,错误一样,阴魂不散啊,这要怎么玩?!于是强烈怀疑运维对数据库做了什么(因为这段时间运维确实动过环境,不太稳定),so尝试甩锅给运维,直到。。。。
另一个妹纸跑来说了另一个问题,心想既然支付不了暂时解决不了,不如换个脑筋。于是开始看新问题,发现怎么特么数据库里一条记录存的id不对呢,根本和订单上的id不一样啊,就特么不知道是哪儿来的id,这什么鬼,彻底懵逼。。。
此时正好另一个娃听到了,说他遇到过这种情况,是因为我们的另一个服务在通知我们这边时,配置了多个不同端但url相同的记录,即不同端的通知全特么都会通知到我们这边,但我们这边不需要其他端的啊,我只要我们端的啊,你把其他端的数据发给我我能找到神马。。。于是屏蔽了其他端的通知,问题解决,总算心情好点了,但特么支付问题还是要解决啊,测试都催了好久了,这么大的问题啊,继续抠脑袋。。。
抱着一丝侥幸心理,又支付了一把,居然神奇的成功了,不敢相信,又来了几发,没有异常,完美支付!难道和这个配置有关?!
于是又去梳理了一遍,发现:我们的服务在查询时,发现记录被更新了,但不是我们自己更新的,而是接收通知的服务更新的,而更新它的就是这些莫名配置出来的端发来的通知(其实根本不需要其他端啊,我们暂时只有一个端啊),所以乐观锁异常,这真是得来全不费工夫啊。。。
于是挨个去问,果然有人在支付出问题之前添加了好几个没用的通知地址配置,你手贱啊,没事添加没用的配置干啥啊?!我滴哥啊,既然找到原因,接下来就好办了:
1.接收通知的服务添加校验,丢弃非本端的通知
2.目前暂无配置多端的需求,配置模块添加唯一性校验,禁止添加多个端
看了2天的bug,硬是卵都没看出来,就这样解决了。。。。码农桑不起啊,心塞。。。。
不过排查bug也学到了很多东西,这也许也算码农的苦与乐吧
2017 fighting
相关推荐
记录一次kernel bug的分析过程,万事开头难,希望此次是一个好的开端。
记一次新手都不会写出来的bug,我给了自己一巴掌.pdf
来看看他在 Quora 上拿到 16k 多顶的经历:我曾经受雇于一位心理学家,去修复一个“输出有些奇怪的”软件,那个软件是他之前带过的一个研究生编写的。所以我可
通信录练习 第一次写的代码 功能还是齐全 BUG还是存在不少
我们在2.x 版本的兼容和升级上做了大量的工作,但毕竟是一次完全的技术重构,系统稳定性和用户体验还需要在后续版本不断完善。提醒大家在对BugFree进行升级之前,对原有数据进行备份。也非常欢迎大家就使用过程中的...
《程序人生》记一次敖丙的线上P2事故1
1.当问题在文档上已经明确之后,修改完成提交测试部,测试人员发现程序上还有文档上标注的问题,记一次反复。
当您第一次安装它,它很简单。然而,为您提供的能力,改变它的配置,以处理您的需求,如果他们更复杂。 BugTracker.NET特点: 可以很好地用于跟踪客户支持问题了。您可以自定义在不改变代码,以便它说:“问题”...
运行梦真键盘屏幕全记录一次后,您可以对本软件进行任意重命名,也可以删除本软件,甚至可以把本软件复制到U盘上,查看记录的时候,从U盘上打开本软件即可。 梦真键盘屏幕全记录 v8.5更新内容: 1.新增软件启动...
第一次写文。请允许我自我介绍一下… 大家好我是茉莉。为什么叫茉莉呢?emmm ID茉莉转圈圈? 皮一下,嘻嘻嘻。笔者两年小菜鸡(差三天满两年)。因为公司只有一个我和前端两个人。所以线上服务部署的任务自然而然就...
目录 1.定位进程 2.定位线程 3.线程虚拟机栈分析 4.解决方案 4.1 升级JDK 4.2 使用ConcurrentHashMap 1.定位进程 top拿到cpu占用最高进程的进程号pid=14398 2.定位线程 top -H -p pid 特定进程中的线程 ...
记一次莫名其妙的网站失去响应排查。之前网站一直是使用nginx做代理后端的apache运行php来提供服务。apache经常会不定期不定时间的出现不能服务失去响应,然后nginx出现”504 Gateway Time-out”查看错误日志也看不...
这里有一个人和我一样的情况 ...但帖子内有人测试又没问题,我测试的IE6是windows 2003下的,不...解决办法是用一个全局变量来限制触发的3次事件只执行一次,200ms后再将该变量复位即可。 这个问题比较罕见,特此记录一下
搜一次CMS电影程序PHP版 v1.6 201301129 更新记录: 1、修复了后台的部分BUG,更换editor编辑为kindeditor编辑器 2、添加了视频、文章内容模板中上一篇、下一篇的两个标签 3、核心代码调用方式优化 4、修复了...
《课堂活动》1.0.0中的bug梓君part:1、头顶上的title2、首页转发的title3、多加一些活动,活动的若第一次就没有更多的显示出来4、表单提示,表
点击下面的按钮一次,弹出模态框。点击提交,会直接 alert(“提交”) 。点击一次会觉得很正常,但是如果你重复点几次模态框,会发现再次点击 提交 ,alert 会出现多次。 简书无法展现效果,可参见 代码如下...
工作总结!日志打印的15个建议 ...记一次接口性能优化实践总结:优化接口性能的八个建议 程序员必备基础:如何安全传输存储用户密码? 一次代码优化实践,用了模板方法+策略+工厂方法模式 保证接口数据安全的10种方案
这样的错误居然出现在应用代码中,显然是重大的BUG。那个是罪魁祸首的SQL,UPDATE语句,其WHERE条件仅仅只有一个where 1=1。 系统的维护人员称是星期五出的错,发现出错是在星期天,也就是我恢复数据的日期,与声称...
ssb(struts2,spring3,mybatis3)实现的家庭费用记录...目前有一bug : tomcat初始启动时,登录页面ajax验证用户登录需多次点击登录按钮才通过验证 需注意。后续会改进 本人Java初级,刚接触一年Java 写的不好,大拿勿喷