项目中死锁问题的处理策略
2018-03-27 10:52
190 查看
项目初期上线,经常会出现查询超过10分钟、程序无响应、操作报错死锁牺牲品错误,这些都与死锁有关
原因分析
1、查询超过10分钟大量的报表查询,平均查询时间超过3秒以上,并且关联了很多张表,其中包括关键业务表和百万、千万级的表,而查询与更新同时发生,便会有几率发生死锁(原理请参考这篇文章),查询的时间越长、更新操作越频繁,几率越大
2、上了消息推送功能,频繁出现大面积用户程序无响应,白屏
新功能引起了多用户并发查询,而这些查询都与关键业务表关联,出现了场景1的表锁问题,锁住了用户、权限表,而我们每一次请求都必须要先查这2张表,这就阻塞住了所有请求,异步请求会一直处于loading状态,异步请求便会引起程序无响应
3、流水号获取频繁死锁,每天要发生5次左右
有几类单据新增时都会获取一个唯一的自增长流水号,流水号的获取是先查询,然后+1再更新,如果2个请求同时发生,会出现2个事务同时查询,同时上了S锁,当这2个事务要更新的时候得不到X锁,便出现了死锁
总结:
从宏观的角度上看,死锁的发生场景主要有2类,一是查询和更新并发,二是2组更新并发而死锁本身不是错误,他只是数据库的一种机制,为了保证数据的一致性
对于第一种场景,大量的慢查询都是用于列表的展示,实时性要求并不高,我们不需要数据库帮我们保证数据的一致性,我采取的方案就是把不需要数据一致性的查询加上nolock
对于第二种场景,我们需要保证数据高度的一致性,例如在生成流水号的过程中,其实是不应该允许其他事务读的,我的做法是,读的时候就强制加X锁(WITH(XLOCK))
相关文章推荐
- 项目中死锁问题的处理策略
- 【边做项目边学Android】异常处理:android.os.NetworkOnMainThreadException--多线程问题
- 项目管理中需要处理好的四个问题
- iOS项目开发中,对后台返回数据为<null>时候的处理,避免取值产生程序崩溃问题
- 死锁的处理策略
- oracle死锁问题查询及处理
- OA项目10:部门管理的三个细节问题的解决及处理懒加载问题
- java项目跨域问题的简单处理
- cocos2d-x创建模板项目问题处理
- BB10 Cascades: 导入部分项目后编译失败问题的处理。
- 关于oracle 锁机制锁问题的详细分析(处理锁定)以及死锁的解决方案
- 第十七周 项目5 处理时间日期(计算这是第几天或第几秒的问题)
- golang处理多个项目src的编译问题
- 项目国际化中问题与解决策略
- eclipse复制项目后的问题处理
- React-Native 学习之--问题处理 一. github上下载的项目不能运行?
- 通过iframe引入另外一个项目中的html片段到项目中,解决样式,高度,兼容等问题的策略
- 浏览器兼容问题项目总结(三)事件处理机制
- java项目转maven项目相关步骤与问题处理
- 项目之从用户软件问题处理中论封装