首页 > 数据库 >第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

第十六章——处理锁、阻塞和死锁(3)——使用SQLServer Profiler侦测死锁

时间:2024-04-17 16:00:48浏览次数:34  
标签:下面 Deadlock 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、 在第一个窗口中输入并执行下面脚本:


  1.   USE AdventureWorks
  2.   GO
  3.   SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
  4.   GO
  5.   BEGIN TRANSACTION
  6.   SELECT *
  7.   FROM Sales.SalesOrderDetail
  8.   WHERE SalesOrderDetailID = 121316


 


11、 然后在第二个窗口中输入并执行下面脚本: 


  1.   USE AdventureWorks
  2.   GO
  3.   SET TRANSACTION ISOLATION LEVEL REPEATABLE READ
  4.   BEGIN TRANSACTION
  5.   SELECT *
  6.   FROM Sales.SalesOrderDetail
  7.   WHERE SalesOrderDetailID = 121317


 


12、现在回到第一个窗体,并运行下面的脚本: 


  1.   UPDATE Sales.SalesOrderDetail
  2.   SET OrderQty=2
  3.   WHERE SalesOrderDetailID=121317


 


13、在第二个窗口输入下面语句: 


  1.   UPDATE Sales.SalesOrderDetail
  2.   SET OrderQty=2
  3.   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、 控制数据库对象访问的顺序是相同的顺序。

 

 

 

2024-04-17 15:50:54【出处】:https://blog.csdn.net/DBA_Huangzj/article/details/8697600

=======================================================================================

标签:下面,Deadlock,SQLServer,Profiler,死锁,侦测
From: https://www.cnblogs.com/mq0036/p/18140944

相关文章

  • Go在Sqlserver中的作用
    Sql_server中的Go标识在写Sql脚本时总是会遇到go标识,也没有个明确的解释。官方解释Go:官方说法是:GO只是SQLServer管理器(SSMS)中用来提交T-SQL语句的一个标志。这几个字我都认识,但是绷组合到一起就感觉说的不是人话。实际的作用一个(段)脚本结束的标识,下面的内容不再与上......
  • c# sqlserver向存储过程传入xml数据
    c#代码:点击查看代码varxmlData=newXDocument(newXElement("Data",query.weldPlanList.Select(r=>newXElement("Row",newXAttribute("APSFactoryID",query.APSFactoryID),......
  • java连接ssmsSqlserver数据库 报错信息:com.microsoft.sqlserver.jdbc.SQLServerExce
    解决办法:将官网下载的驱动文件打开,找到如下路径,并复制,粘贴放到jdk的bin目录下......
  • jmeter 连接 sqlserver 数据库
    1. 将下载好的 jar 包放在 jmeter/lib 目录下,测试计划中导入 jar 包 2.添加 JDBCConnectionConfiguration 配置,参数设置如下 3. 线程组中添加 JDBCRequest,请求中连接名字(test)和步骤2 中自定义的名字(test)保持一致 4. 点击运行,查询出对应的结果 问题回......
  • 死锁指南
    死锁指南项目2023/10/263个参与者反馈 本文内容了解死锁检测和结束死锁死锁检测死锁信息工具显示另外5个适用于:SQLServerAzureSQL数据库AzureSQL托管实例AzureSynapseAnalyticsAnalyticsPlatformSystem(PDW)本文深入讨论SQLServer数据库引擎......
  • Sql Server对等复制中将截断字符串或二进制数据。 (源: MSSQLServer,错误号: 8152)
    近期发现好好的复制突然出现了报错,导致备份库数据不一致的问题,如下 一直以为是发布数据库进行了DDL操作没有同步到这边来,导致数据同步时长度不够导致的,结果把表都检查了一遍也没发现啥不对劲最后只好去找相关资料,结果找到了官方资料(目前老项目用的14版本) 这边有几个......
  • 模拟SQLserver死锁现象
    模拟SQLserver死锁现象 SQLServer死锁是指两个或多个事务相互等待对方持有的资源而无法继续执行的情况。当两个或多个事务都持有一些资源并且试图获取其他事务持有的资源时,可能会发生死锁。这种情况下,每个事务都在等待另一个事务释放其所需的资源,导致所有涉及的事务都无法继......
  • 使用 SQL SERVER PROFILER 监测死锁
    作为DBA,可能经常会遇到有同事或者客户反映经常发生死锁,影响了系统的使用。此时,你需要尽快侦测和处理这类问题。死锁是当两个或者以上的事务互相阻塞引起的。在这种情况下两个事务会无限期地等待对方释放资源以便操作。下面是死锁的示意图: 本文将使用SQLServerProfile......
  • 丐版sqlserver AlwaysOn集群
    丐版sqlserver集群之前试过docker的,k8s的,然后发现,还是最朴素的是最简单的,希望有大佬能够汉化,他妈的,那些英文看得人要发癫啊。前置准备,参照丐版pxc集群:https://www.cnblogs.com/zwnfdswww/p/18112077如果不关防火墙:打开对应的端口即可:sudofirewall-cmd--zone=public--a......
  • 模拟SQLserver死锁现象(解析)
    SQLServer死锁是指两个或多个事务相互等待对方持有的资源而无法继续执行的情况。当两个或多个事务都持有一些资源并且试图获取其他事务持有的资源时,可能会发生死锁。这种情况下,每个事务都在等待另一个事务释放其所需的资源,导致所有涉及的事务都无法继续执行,形成了死锁。死锁通常......