项目中死锁问题简单记录

并发死锁问题
项目上线后发现死锁问题,数据量级并不大,现将分析过程和解决方案整理一下,以作记录
场景:申购,赎回两个接口并发做下单操作
描述:并发下单操作时,频繁的更新同一张表同一条记录,导致死锁现象发生
问题分析:由于是并发操作下才会出现死锁,考虑到有可能是两个接口当中的业务更新sql有交叉的可能,导致了互相竞争锁资源引起死锁问题
解决方案;分析两个业务的所有sql及执行顺序,找出交叉的业务(sql), 然后调整sql的执行顺序,保证两个业务sql执行顺序一致
结果:测试环境下测试并发同时下单正常,问题解决


上线之后发现问题依然存在,只是发生死锁的频率降低了,于是有接着找原因
分析之前引起死锁的操作场景可能并不是只有在并发下单那块,这里只是引起死锁问题的一个操作而已
后台业务系统做业务(保密业务不便说明)时也会频繁的做更新操作并且和下单的操作竞争资源,导致了问题的发生。

解决方案:整理出涉及到的相关业务操作,做排队处理(具体的排队方案就不在这里陈述),不再做并发更新操作。同时为了避免用户下单失败(死锁引起的)在代码中捕获死锁异常,进行重试操作。
结果:测试正常,上线后死锁问题再未发生

总结;排队之后在处理业务及时性上有一定延迟(牺牲了一些性能),好在这个系统的实时性要求并不高。

这里仅仅是大致记录一下死锁的发生,分析,解决的一个过程。

不知道大家在遇到死锁问题都是如何解决的?

猜你喜欢

转载自ni-de-yang-zi.iteye.com/blog/2339525