我们的订单机制是如果会员超过十分钟没有支付,则系统会取消订单。但是今天产品群里反馈,一个会员出示了交易凭证,但是对应的订单状态是取消状态。
我查了日志,查到了支付平台的回调记录,也查到了订单因为未支付超过十分钟被取消,这就莫名其妙了。
我仔细查看了支付平台的回调记录,发现在支付到一半的时候,日志停止,再没有关于订单继续的日志了,也就是说可能在这里抛错了。随即,转到抛错日志查看,果然,在支付订单的时候,抛错了,错误竟然是锁超时导致。
我看了看订单时间,凌晨一点左右,这个时间,并非系统高发期,为什么会死锁呢?在同事讨论了这个事情,他提议可能是因为定时任务,当然也证实就是因为定时任务。
第一,我们每天的定时任务,都是在凌晨1点左右执行,和抛错时间相符
第二,查了一下过去的十天的日志,果然在凌晨一点左右,锁超时最频繁。
找到了问题,剩下的就是如何解决了。
如果把定时任务和下单任务分开,那么就不会有这个问题了,怎么分开呢,读写分离,也就是做数据库的主从复制!
每天的定时任务其实就是统计过去的一天,网费收入,商品收入,钱包收入,然后统计一些上网人次,上座率,等等,总之几乎全是读取分析的工作。 那么把这些工作放到从数据库上去统计就好了,这样既能完成任务,也不影响下单任务的执行。
bingo
网友评论