并发死锁问题
项目上线后发现死锁问题,数据量级并不大,现将分析过程和解决方案整理一下,以作记录
场景:申购,赎回两个接口并发做下单操作
描述:并发下单操作时,频繁的更新同一张表同一条记录,导致死锁现象发生
问题分析:由于是并发操作下才会出现死锁,考虑到有可能是两个接口当中的业务更新sql有交叉的可能,导致了互相竞争锁资源引起死锁问题
解决方案;分析两个业务的所有sql及执行顺序,找出交叉的业务(sql), 然后调整sql的执行顺序,保证两个业务sql执行顺序一致
结果:测试环境下测试并发同时下单正常,问题解决
上线之后发现问题依然存在,只是发生死锁的频率降低了,于是有接着找原因
分析之前引起死锁的操作场景可能并不是只有在并发下单那块,这里只是引起死锁问题的一个操作而已
后台业务系统做业务(保密业务不便说明)时也会频繁的做更新操作并且和下单的操作竞争资源,导致了问题的发生。
解决方案:整理出涉及到的相关业务操作,做排队处理(具体的排队方案就不在这里陈述),不再做并发更新操作。同时为了避免用户下单失败(死锁引起的)在代码中捕获死锁异常,进行重试操作。
结果:测试正常,上线后死锁问题再未发生
总结;排队之后在处理业务及时性上有一定延迟(牺牲了一些性能),好在这个系统的实时性要求并不高。
这里仅仅是大致记录一下死锁的发生,分析,解决的一个过程。
不知道大家在遇到死锁问题都是如何解决的?
分享到:
相关推荐
项目中涉及文件读写操作,用于保存聊天记录,维护用户信息等。 - **聊天记录文件格式设计**:格式应便于读取和写入,通常使用文本格式,便于调试和查看。需考虑记录内容的结构化,例如使用特定分隔符区分不同消息,...
在本项目中,"JAVA实现的简单的chatroom 适合初学者",我们主要涉及三个核心领域:Java编程、GUI(图形用户界面)设计以及网络连接和多线程技术。这个项目对于初学者来说是一个很好的起点,因为它涵盖了Java编程中...
在计算机操作系统中,信号量(Semaphore)是一种非常重要的同步机制,用于解决多个进程之间的资源竞争问题。本项目针对的是Linux 0.11内核,它是一个早期版本的开源操作系统,对于理解操作系统底层原理有着重要价值...
总的来说,"一个简单的银行家算法"项目是理解操作系统中资源管理和死锁预防的好实践。通过编写和运行这个程序,用户可以直观地看到资源分配如何影响系统的安全性,并深入理解银行家算法的工作原理。
在C#编程中,创建一个菜单历史列表是一个常见的需求,特别是在开发桌面应用程序时,用户可能希望看到他们...在实际项目中,你可以根据具体需求对其进行调整和扩展,例如增加搜索历史记录的功能,或者添加更多细节信息。
文件大小的显示则相对简单,录音程序在保存文件时需要记录文件大小,并将其更新到用户界面上。在C++中,可以使用fstream库进行文件操作,计算已写入的数据量。 至于MP3编码,通常会用到开源的音频编码库,比如LAME...
对于异常处理,JavaMelody会记录应用程序中抛出的异常,方便定位和解决问题。另外,它还能够监控系统级别的指标,如CPU使用率、磁盘空间和网络I/O,这些信息对于系统运维人员来说非常宝贵。 集成JavaMelody到你的...
这个过程中,他们会遇到各种挑战,如内存泄漏、死锁、资源竞争等问题,这些挑战的解决将对他们的编程思维和技术能力有显著提升。同时,Pintos项目也为学生提供了一个实际操作的平台,使理论知识得以在实践中得到检验...
5. **项目6**:这可能是一个关于死锁预防和避免的实验,学生需要理解死锁的四个必要条件,并尝试通过设置资源预分配、银行家算法等方式防止死锁的发生。 6. **项目7**:可能涉及的是调度算法的实现,如FCFS(先来先...
通过在VC++环境下编写和调试一个简单的资源分配模拟程序,不仅能够直观地观察到死锁产生的条件,还能学习如何使用银行家算法有效地防止和避免死锁,从而提升学生对操作系统中资源管理机制的理解。 #### 二、死锁...
osMessagePut和osMessageGet是FreeRTOS中两个重要的消息队列操作函数,它们使得任务间的通信变得简单且可靠。通过实际的测试代码,我们可以加深对这些概念的理解,并将它们应用到自己的项目中。
这个项目的核心目标是为Go开发者提供一种简单、高效且易于使用的并发控制机制,以避免传统的互斥锁(mutexes)和条件变量等低级同步原语带来的复杂性。 在Go语言中,STM的工作原理大致如下: 1. **事务开始**:...
在实际项目中,选择合适的锁策略和级别对于数据库系统的性能至关重要。数据库管理员和开发者需要充分理解锁的工作原理,以及不同锁级别和类型对系统并发性能的影响。合理配置和优化锁机制可以显著提高数据库系统的...
8. **测试与调试**:项目中可能包含单元测试和集成测试,用于验证封锁管理子系统的正确性,同时也可能有日志记录,便于排查问题。 通过阅读和分析项目的源码,我们可以更深入地理解这些概念,并将理论知识应用到...
在SSM与PostgreSQL的结合中,日志记录可以帮助开发者追踪和调试事务处理过程中的问题,如异常信息、SQL执行情况等。 在处理SSM与PostgreSQL的事务时,可能会遇到的问题包括事务隔离级别的选择(读未提交、读已提交...
【银行家算法】是用于预防操作系统中死锁问题的一种策略,尤其在多道程序系统中。这个算法由艾兹格·迪杰斯特拉提出,它的核心思想是在资源分配之前预测系统是否能到达安全状态,从而避免导致无法解除的资源竞争状态...
6. **多线程**:学习如何创建和管理线程,使用synchronized关键字处理并发问题,理解线程同步和死锁。 7. **JDBC数据库操作**:连接数据库,执行SQL查询,处理结果集,理解预编译的PreparedStatement和事务管理。 ...
- 多线程环境下,需要关注死锁、活锁和资源竞争等问题,通过调试工具如JVisualVM进行性能分析和调优。 这个简单的QQ群聊项目是一个很好的起点,帮助初学者将理论知识应用于实践,进一步巩固和深化对Java编程、线程...
5. 如果不超过,则添加项目并记录所需资源;否则提示错误。 #### 资源申请流程 1. 用户输入项目名称。 2. 查找项目是否存在。 3. 输入项目需要申请的资源数量。 4. 检查请求的资源是否超过最大限制以及是否超过了...
总结来说,这个Java项目是学习和实践资源管理和调度策略的一个好例子,它涵盖了操作系统中防止死锁的银行家算法和优化CPU利用率的作业调度算法。通过实际编写和运行代码,可以帮助开发者更直观地理解和掌握这些重要...