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 ...
随机推荐
- 马某 说c# 不开源,他是蠢还是坏?
马某在视频 计算机主流开发语言的现状和未来3-5年的发展前景--Java.Golang.Python.C\C#\C++.JS.前端.AI.大数据.测试.运维.网络安全 点评各种语言,其中说到C# 的时 ...
- node.js 命令必须加 npx 才能执行
问题描述 在 Windows 上搭建 Hexo 环境,已经从官网下载安装 node-v18.18.2-x64.msi,并且通过 npm 命令成功安装 hexo. PowerShell 中,直接执行 h ...
- JavaImprove--Lesson06--正则表达式
一.正则表达式的入门 正则表达式是一些特定支付组成的,代表一个规则,简化代码,以字符的形式体现规则 正则表达式,又称规则表达式,(Regular Expression,在代码中常简写为regex.re ...
- maven系列:依赖管理和依赖范围
目录 一.依赖管理 使用坐标导入jar包 使用坐标导入 jar 包 – 快捷方式 使用坐标导入 jar 包 – 自动导入 二.依赖范围 三.可选依赖 四.排除依赖 一.依赖管理 使用坐标导入jar包 ...
- NanoDet:这是个小于4M超轻量目标检测模型
摘要:NanoDet 是一个速度超快和轻量级的移动端 Anchor-free 目标检测模型. 前言 YOLO.SSD.Fast R-CNN等模型在目标检测方面速度较快和精度较高,但是这些模型比较大,不 ...
- 从原理到实践,手把手带你轻松get数仓双集群容灾
摘要:本文通过介绍双集群的架构.log结构.分析步骤来介绍双集群容灾的问题分析方法. 本文分享自华为云社区<从原理到实践,手把手带你轻松get数仓双集群容灾>,原文作者:Puyol . 双 ...
- A/B测试有哪些常见应用场景?——火山引擎DataTester科普
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 火山引擎 DataTester不仅对外提供服务,也是字节跳动内部所应用的A/B实验平台,它基于先进的底层算法, ...
- 高性能 Jsonpath 框架,Snack3 3.2.57 发布
Snack3,一个高性能的 JsonPath 框架 借鉴了 Javascript 所有变量由 var 申明,及 Xml dom 一切都是 Node 的设计.其下一切数据都以ONode表示,ONode也 ...
- 大数据-业务数据采集-FlinkCDC 读取 MySQL 数据存入 Kafka
目录 作用 app 产生各层数据的 flink 任务 bean 数据对象 common 公共常量 utils 工具类 app.ods.FlinkCDC.java package com.atguigu ...
- MappedByteBuffer 写文件
MappedByteBuffer中"put"和"force"的区别是什么 put()将数据存储在缓冲区中,force()通知操作系统将缓冲区刷新到磁盘. put ...