第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁
前言:
作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用。此时,你需要尽快侦测和处理这类问题。
死锁是当两个或者以上的事务互相阻塞引起的。在这种情况下两个事务会无限期地等待对方释放资源以便操作。下面是死锁的示意图:
本文将使用SQLServer Profiler来跟踪死锁。
准备工作:
为了侦测死锁,我们需要先模拟死锁。本例将使用两个不同的会话创建两个事务。
步骤:
1、 打开SQLServer Profiler
2、 选择【新建跟踪】,连到实例。
3、 然后选择【空白】模版:
4、 在【事件选择】页中,展开Locks事件,并选择以下事件:
1、 Deadlock graph
2、 Lock:Deadlock
3、 Lock:Deadlock Chain
5、 然后打开TSQL事件,并选择以下事件:
1、 SQL:StmtCompleted
2、 SQL:StmtStarting
6、 点击【列筛选器】,在跟踪属性中,选择数据库名为需要侦测的数据库,这里使用AdventureWorks。
7、 在【组织列】中,调整顺序,如下:
8、 点击运行。
9、 然后打开SQLServer,并打开两个连接。
10、 在第一个窗口中输入并执行下面脚本:
USE AdventureWorks
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
GO
BEGIN TRANSACTION
SELECT *
FROM Sales.SalesOrderDetail
WHERE SalesOrderDetailID = 121316
11、 然后在第二个窗口中输入并执行下面脚本:
USE AdventureWorks
GO
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
BEGIN TRANSACTION
SELECT *
FROM Sales.SalesOrderDetail
WHERE SalesOrderDetailID = 121317
12、现在回到第一个窗体,并运行下面的脚本:
UPDATE Sales.SalesOrderDetail
SET OrderQty=2
WHERE SalesOrderDetailID=121317
13、在第二个窗口输入下面语句:
UPDATE Sales.SalesOrderDetail
SET OrderQty=2
WHERE SalesOrderDetailID=121316
14、 然后在第二个窗口就会看到下面的消息:
15、切换到SQLServer Profiler,可以看到下面的截图:
16、 点击【Deadlock graph】时间,会显示死锁的图像:
17、可以保存死锁图像,右键然后选择导出事件数据,并另存为xdl文件:
下面是其XML格式:
分析:
在本文中,首先创建一个Profiler空白模版,然后选择下面的事件进行监控:
1、 Deadlock graph
2、 Lock:Deadlock
3、 Lock:Deadlock Chain
4、 SQL:StmtCompleted
5、 SQL:StmtStarting
然后通过限定数据库,来限制监控过得对象范围。
在配置好之后,运行跟踪,并在ssms中运行脚本。SQLServer会自动处理和侦测这种类型的死锁。然后会在第二个窗体中收到1205的错误。
在SQLServer Profiler中,演示了如何收集死锁事件,在跟踪结果中可以看到两个事务尝试在一个拥有共享锁的键上添加排它锁。通过死锁图像,可以看到死锁发生的细节。
为了避免或者最小化死锁的发生,有一些建议可以参考:
1、 确保你的事务尽可能地小,这里指范围。
2、 使用较低隔离级别的事务。
3、 对于可能的查询,使用NOLOCK查询提示。
4、 规范化数据库设计。
5、 在需要的列上创建索引,以便是表不需要经常扫描,减少锁问题的发生。
6、 控制数据库对象访问的顺序是相同的顺序。
第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁相关推荐
- 【JAVA SE】第十六章 进程、线程、同步锁和线程锁的简介
第十六章 进程.线程.同步锁和线程安全问题 文章目录 第十六章 进程.线程.同步锁和线程安全问题 一.进程 1.基本介绍 2.进程模型 二.线程 1.基本介绍 2.线程的生命周期 3.线程的优先级 4 ...
- fastreport masterdata每页都显示_ALIENTEK 阿波罗 STM32F767 开发板资料连载十六章 OLED 显示实验...
1)实验平台:alientek 阿波罗 STM32F767 开发板2)摘自<STM32F7 开发指南(HAL 库版)>关注官方微信号公众号,获取更多资料:正点原子 http://weixi ...
- 【正点原子MP157连载】第十六章 基本定时器实验-摘自【正点原子】STM32MP1 M4裸机CubeIDE开发指南
1)实验平台:正点原子STM32MP157开发板 2)购买链接:https://item.taobao.com/item.htm?&id=629270721801 3)全套实验源码+手册+视频 ...
- 达芬奇密码 第八十六章
达芬奇密码 第八十六章[@more@] 第八十六章 塞拉斯有如幽灵般迅速地绕到进攻目标的背后.等索菲发现他时,已经太迟了.她还来不及转身,塞拉斯已把枪口对准了她的脊梁骨,并用粗壮的胳膊拦腰抱住了她,拼 ...
- 【正点原子FPGA连载】第四十六章SD卡读写测试实验 -摘自【正点原子】新起点之FPGA开发指南_V2.1
1)实验平台:正点原子新起点V2开发板 2)平台购买地址:https://detail.tmall.com/item.htm?id=609758951113 2)全套实验源码+手册+视频下载地址:ht ...
- 第十六章、Raid及mdadm命令
第十六章.Raid及mdadm命令 10_01_Raid及mdadm命令之一 (17 - $) 各种接口的速率: IDE: 133Mbps SATA: 300Mbps, 600Mbps, 6Gbps ...
- 第十六章 推荐系统-机器学习老师板书-斯坦福吴恩达教授
第十六章 推荐系统 16.1 问题规划 16.2 基于内容的推荐系统 16.3 协同过滤 16.4 协同过滤算法 16.5 向量化:低秩矩阵分解 16.6 实现细节:均值规范化 16.1 问题规划 1 ...
- 鸟哥的Linux私房菜(基础篇)- 第二十六章、Linux 核心编译与管理
第二十六章.Linux核心编译与管理 最近升级日期:2009/09/18 我们说的 Linux 其实指的就是核心 (kernel) 而已.这个核心控制你主机的所有硬件并提供系统所有的功能,所以说,他重 ...
- 鸟哥的Linux私房菜(基础篇)- 第十六章、例行性工作排程 (crontab)
第十六章.例行性工作排程 (crontab) 最近升级日期:2009/09/11 学习了基础篇也一阵子了,你会发现到为什么系统常常会主动的进行一些任务?这些任务到底是谁在配置工作的?如果你想要让自己设 ...
最新文章
- 数据结构(1)有序表查找
- 解决kalilinux: E: 无法获得锁 /var/lib/apt/lists/lock - open (11: 资源暂时不可用) E: 无法对目录 /var/lib/apt/lists/
- 剑指offer 算法 (画图让抽象问题形象化)
- 安卓性能调优工具简介(转)
- MSP430单片机输入与输出
- Linux 命令(三)--用户管理
- vector 不初始化时什么状态_练车时,教练为什么不给你开空调?
- linux sshd自动登录,SSH自动登录的几种方法
- (六)Oracle学习笔记—— 约束
- Java 压缩解压缩 第三方组件,推荐一个强大的Java开发工具类库!
- linux硬件驱动网站,linux怎么查看已装好硬件驱动
- 便宜php扩展,php扩展【货币问答】- php扩展所有答案 - 联合货币
- React.memo 是个啥么鬼?有什么用???
- vscode中查看二进制文件
- 多云环境无处不在,但其管理才刚开始
- linux c语言 写文件,linux c通过文件描述符以及write和read方法对文件进行读写
- 第17章 国际贸易与资本流动
- CTime和COleDateTime区别 比较
- Linux基础 第三节 第二课
- 广和通5G模组FM150-AE在树莓派+Ubuntu22.04 LTS系统下即插即用免驱免拨号演示
热门文章
- 修炼Python基础篇-set学习
- C#-设置button颜色
- *.exe 中的 0x0053b1f7 处未处理的异常: 0xC00000FD: Stack overflow
- python点击按钮弹出新窗口_PyQt5点击button如何弹出新窗口?
- android中json解析及使用(中)
- java反射经典实例 Java Reflection Cookbook
- JavaScript in Action
- spring配置线程池
- [剑指offer] 旋转数组的最小数字
- Wireshark入门与进阶---数据包捕获与保存的最基本流程