SQLServer解决deadlock问题的一个场景
SQLServer解决deadlock问题的一个场景
背景
公司产品出现过很多次dead lock
跟研发讨论了很久, 都没有具体的解决思路
但是这边知道了一个SQLServer数据库上面计划100%出现问题的场景
然后想着跟之前微软case一起处理一下 看能否解决这个问题.
整体思路
1. 修改默认的隔离级别
2. 关闭索引上面的页锁,只留下行数, 避免锁升级到页锁,导致问题
3. 使用profiler的方式,跟着你干出来deadlock 对应的资源, 查看资源并且进行优化.
第一步修改隔离级别
SQLSERVER 默认的是 Read Commited 的隔离级别.
大部分高并发场景都建议执行一下修改, 改为快照级别, 避免出现阻塞
方式方法为:
查看:
SELECT is_read_committed_snapshot_on FROM sys.databases
WHERE name= 'YourDatabase'
或者是:
DBCC USEROPTIONS
修改的方法为:
ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE
ALTER DATABASE dbname SET ALLOW_SNAPSHOT_ISOLATION ON
ALTER DATABASE dbname SET READ_COMMITTED_SNAPSHOT ON
ALTER DATABASE dbname SET MULTI_USER
注意可以online 修改 可能速度比较慢, 建议在停机时间时执行处理
快照隔离会给每一行增加一个版本号, 实现类似于MVCC的效果,提高并发度,但是会导致数据量使用的上升
关闭所以上面的页级别锁
注意这个思路是 研发同事告知 微软case 时给出的方案
我这边并不是非常建议关闭默认值
但是可以作为一个优化项目使用.
执行方法比较简单, 下面的SQL执行出来的结果 另外开一个分析窗口执行就可以了.
速度比较快几乎瞬间完成.
SELECT
'ALTER INDEX ' + i.NAME + ' ON yourdatabase.' + t.NAME + ' SET (ALLOW_PAGE_LOCKS=OFF,ALLOW_ROW_LOCKS=ON) ;'
FROM
sys.objects t
INNER JOIN sys.indexes i ON t.object_id = i.object_id CROSS APPLY (
SELECT
col.[ NAME ] + ', '
FROM
sys.index_columns ic
INNER JOIN sys.COLUMNS col ON ic.object_id = col.object_id
AND ic.column_id = col.column_id
WHERE
ic.object_id = t.object_id
AND ic.index_id = i.index_id
ORDER BY
col.column_id FOR XML PATH ( '' )
) D ( column_names )
WHERE
t.is_ms_shipped <> 1
AND t.type = 'U'
AND index_id > 0
ORDER BY
i.[ NAME ]
使用profiler 跟踪出具体的死锁信息,进行针对性的优化
Profiler 可以跟踪到具体的被锁的资源信息.
可以通过修改profiler的配置项目就可以了.
跟踪属性-常规-使用模板里面选择 TSQL_Locks
跟踪属性-事件选择-仅选择 Locks -> Deadlock graph
执行跟踪就可以了.
就能够看到具体的被死锁的信息.
然后可以根据被锁死的信息, 适当的进行优化处理一下.
profiler设置1

profiler设置2

profiler设置3

进行索引重建
alter index PK__lsrwztlo__CCDA21518AF0ADA3 on yourdatabase.lsrwztlog rebuild
alter index PK__pfhiacti__3213E83F88237CAF on yourdatabase.pfhiactinst rebuild
alter index index_procintsid on yourdatabase.pfhiactinst rebuild
设置索引重建计划任务
建议设置全局的索引重建任务, 每天晚上进行相关的索引重建
提高性能.
SQLServer解决deadlock问题的一个场景的更多相关文章
- CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口
CSharpGL(35)用ViewPort实现类似3DMax那样的把一个场景渲染到4个视口 开始 像下面这样的四个视口的功能是很常用的,所以我花了几天时间在CSharpGL中集成了这个功能. 在CSh ...
- cocos3.2中如何创建一个场景
1.可以将一些比较通用的东西放到Common.h中,这是一个.h文件,必须手动添加,且保证在classes目录里 #ifndef __COMMON_H__ #define __COMMON_H__ # ...
- PHP解决多进程同时读写一个…
原文地址:PHP解决多进程同时读写一个文件的问题作者:陌上花开 首先PHP是支持进程的而不支持多线程(这个先搞清楚了),如果是对于文件操作,其实你只需要给文件加锁就能解决,不需要其它操作,PHP的fl ...
- 【Vue】利用父子组件间通信实现一个场景
组件间通信是组件开发的,我们既希望组件的独立性,数据能互不干扰,又不可避免组件间会有联系和交互. 在vue中,父子组件的关系可以总结为props down,events up: 在vue2.0中废弃了 ...
- Three.js入门篇(一)创建一个场景
上一面讲述了向场景中添加物体对象.这一篇准备把每个功能点细细的讲述一遍,一方面是为了加深自己的理解.另一方面希望能够 帮助到有需要的人. 一.在学习WEBGL的时候,你应该先了解要创建一个WebGL程 ...
- qt 如何给图元安装一个场景事件过滤器?
void QGraphicsItem::installSceneEventFilter(QGraphicsItem *filterItem) class LabCrossEvent : public ...
- 解决ul里最后一个li的margin问题
在html+css布局里ul>li挺常用的,在群里(WEB前端开发 458732443)总有新手问怎么解决li的最后一个margin值的问题.下面介绍一下,大神请不要拍砖. 先看两个demo,你 ...
- ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器。用springframework自带的便可
ssh框架从页面传中文发生乱码时怎么解决,就是添加一个字符编码拦截器.用springframework自带的便可
- SQLServer -------- 解决忘记sa 密码,创建一个新的
时间真的是一个可怕的武器,你可以不服老,但是你不能改变,你年纪的增长,在我们创建数据库的时候,会创建sa 和密码,但是密码忘记怎么办, 提供一种方法,创建一个新的进行软件部署 实现方法:1.找到安全性 ...
- sqlserver -- 解决sqlserver2008“Prevent saving changes that require table re_creation(阻止保存要求重新创建表的更改)”的问题
电脑重装了sqlserver2008 R2(英文版)后,新建数据表,新建字段,发现有个字段类型设置错了,想修改字段类型,而该表已经保存好了,即保存后修改字段属性.但无法保存修改后的设置,提示“Savi ...
随机推荐
- JavaFx之WebView(二十五)
JavaFx之WebView(二十五) jfx的web引擎已经几百年没更新,早就放弃了,写写demo还是不错.jdk8u202还能跑vue 3.0项目 import javafx.applicatio ...
- 平衡树——AVL算法
平衡树--AVL算法 平衡树建立在二叉搜索树的基础上,加入了两侧子树大小相对平衡的特性而避免了很多情况下的算法退化.这里AVL算法实现的AVL树就是平衡树的一种. 1.二叉搜索树 在说平衡树之前我们得 ...
- GaussDB(DWS)案例丨MERGE场景下语句不下推引起的性能瓶颈问题
本文分享自华为云社区<GaussDB(DWS)性能调优:MERGE场景下语句不下推引起的性能瓶颈问题案例>,作者:O泡果奶~. 1.[问题描述] 语句执行时间过长,且该语句performa ...
- 被灵魂问倒:这个BUG为什么没测出来?
摘要:为什么没测出来!测试怎么测得?到底会不会测?这对测试来说是灵魂拷问级别不好回答的问题了. 本文分享自华为云社区<被问:这个BUG为什么没测出来?该如何回答>,作者: 曲鸟. 一.前言 ...
- 有什么好用的C/C++源代码混淆工具?
开始使用ipaguard 前言 iOS加固保护是直接针对ios ipa二进制文件的保护技术,可以对iOS APP中的可执行文件进行深度混淆.加密.使用任何工具都无法逆向.破解还原源文件.对APP进行完 ...
- 十大 CI/CD 安全风险(五)
在本篇文章中,我们将了解第三方服务的监管不足,工件完整性验证及日志可见性不足这三个关键 CI/CD 安全风险,并给出缓解相应风险的建议与措施. 第三方服务监管不足 CI/CD 攻击面包括企业资产,例如 ...
- Excel 选择性粘贴
乘以某个系数 选择 粘贴时,乘以某个系数 两列合一列 添加一列辅助列 方法2
- PyCharm View as Array 查看数组
代码中设置断点. 在Debug Variables 里面,点击 View as Array 如下图所示:
- MySQL 项目中 SQL 脚本更新、升级方式,防止多次重复执行
一套代码,多家部署时,在SQL脚本升级时,通过一个SQL文件给运维,避免出现SQL执行序顺出错及漏执行SQL SQL Server 项目中 SQL 脚本更新方式 Oracle 项目中 SQL 脚本更新 ...
- Codeforces Round #738 (Div. 2) (A~E)
比赛链接:Here 1559A. Mocha and Math 题意: 给定一个区间,选择区间内的值执行 & 操作使得区间最大值最小化 观察样例发现:令 x = (1 << 30) ...