前言:
作为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、控制数据库对象访问的顺序是相同的顺序。
分享到:
相关推荐
NULL 博文链接:https://beijingwo2008.iteye.com/blog/1851542
此时,你需要尽快侦测和处理这类问题。 死锁是当两个或者以上的事务互相阻塞引起的。在这种情况下两个事务会无限期地等待对方释放资源以便操作。下面是死锁的示意图: 本文将使用SQLServer Profiler来...
检查 Sql Server的阻塞和死锁--------------------------------------------
2015 Oracle 技术嘉年华(OTN)分会场11何登成 - 管中窥豹——MySQL(InnoDB)死锁分析之道
如何使用SQL Server Profiler来监控数据库死锁。SQL Server Profiler配置及查看锁表信息,提取锁表日志和对应SQL语句。
本过程自动捕捉SQLSERVER中的死锁进程并且自动杀掉
SQL SERVER 2008 R2 查看和杀死死锁进程。数据库进程死锁是一个很严重的问题,快速定位到死锁的进程尤为重要。
sqlserver数据库死锁的处理过程,内有说明,测试过,比较好用。
该文档由浅入深,详细讲述事务,锁,阻塞和死锁产生的原因及解决优化办法
死锁原理、死锁排查、避免死锁、死锁处理方法、两个死锁示例及解决方法、附:锁兼容性(FROM SQL Server 2005 联机丛书)
SQLSERVER死锁总结,里面详述基于SQLSERVER数据库如何排查并处理死锁的办法,及死锁产生的原因
用于sqlserver优化使用,可定位死锁,并查询死锁语句。
SQL Server死锁使我们经常遇到的问题,下面就为您介绍如何查询SQL Server死锁,希望对您学习SQL Server死锁方面能有所帮助。
SQL Server和Oracel中的锁和死锁
/**//*--调用示例 exec p_lockinfo 0,1 --*/ create proc p_lockinfo @kill_lock_spid bit=1, --是否杀掉死锁的进程,1 杀掉...@show_spid_if_nolock bit=1 --如果没有死锁的进程,是否显示正常进程信息,1 显示,0 不显示
查询SQL server数据库死锁存储过程
本文举例说明SQL Server死锁产生的原因,并提出了解决的办法。
SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询; 在后台收集查询信息; 分析性能; 诊断像死锁之类的问题; 调试T-SQL语句; 模拟重放SQL Server活动; 也可以使用...
日常SQL Server出现事物锁表,查询锁表信息