当前位置:Gxlcms > 数据库问题 > 使用SQLServer Profiler侦测死锁(转)

使用SQLServer Profiler侦测死锁(转)

时间:2021-07-01 10:21:17 帮助过:35人阅读

   print?
  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、 然后在第二个窗口中输入并执行下面脚本: 

 

[sql] view plain copy    print?
  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、现在回到第一个窗体,并运行下面的脚本: 

 

[sql] view plain copy    print?
  1. UPDATE Sales.SalesOrderDetail  
  2. SET OrderQty=2  
  3. WHERE SalesOrderDetailID=121317  



 

 

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

 

[sql] view plain copy    print?
  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、 控制数据库对象访问的顺序是相同的顺序。

使用SQLServer Profiler侦测死锁(转)

标签:

人气教程排行