`
苹果醋杏仁
  • 浏览: 1407 次
  • 性别: Icon_minigender_2
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

通过SQL Server Profiler来监视分析死锁

阅读更多
在两个或多个SQL Server进程中,每一个进程锁定了其他进程试图锁定的资源,就会出现死锁,例如,进程process1对table1持有1个排它锁(X),同时process1对table2请求1个排它锁(X),进程process2对table2持有1个排它锁(X),同时process2对table1请求1个排它锁(X)类似这种情况,就会出现死锁,除非当某个外部进程断开死锁,否则死锁中的两个事务都将无限期等待下去。
Microsoft SQL Server 数据库引擎死锁监视器定期检查陷入死锁的任务。
如果监视器检测到循环依赖关系,将选择其中一个任务作为牺牲品(通常是选择占资源比较小的进程作为牺牲品),然后终止其事务并提示错误1205。

这里我们通过SQL Server Profiler来监视分析死锁的发生过程,那样我们就会深刻理解死锁的成因。

1.创建测试表。
在 Microsoft SQL Server Management  Studio上,新建一个查询,写创建表DealLockTest_1 & DealLockTest_2两个表:

脚本:
代码use Test--创建分析死锁使用到的两个表DealLockTest_1 & DealLockTest_2goSet Nocount On    Goif object_id('DealLockTest_1') Is Not Null    Drop Table DealLockTest_1goCreate Table DealLockTest_1(    ID int Identity(1,1) Primary Key,    Name nvarchar(512))if object_id('DealLockTest_2') Is Not Null    Drop Table DealLockTest_2goCreate Table DealLockTest_2(    ID int Identity(1,1) Primary Key,    Name nvarchar(512))Go--插入一些测试数据Insert Into DealLockTest_1(Name)    Select name From sys.all_objects    Insert Into DealLockTest_2(Name)    Select name From sys.all_objectsGo   
创建好表和插入测试数据后,先执行脚本代码(因为我们不需要跟踪该代码),紧接着,我们就模拟两个会话,一个会话里面包含一个事务。这里我们就新建两个查询,其中第一个会话,是更新DealLockTest_1表后,等待5秒钟,更新DealLocktest_2.


代码Use TestGo    --第一个会话        Begin Tran        Update DealLockTest_1        Set Name=N'test1'        Where ID >0            /*这里的Waitfor等待,是为了容易获取死锁的发生*/            Waitfor Delay '00:00:05'                Update DealLockTest_2        Set Name=N'test2'        Where ID >0                Commit TranGo

代码写好后,我们先不要执行代码,接下来就写第二个会话代码; 第二个会话更新表的顺序,刚好与第一个会话相反,是更新DealLockTest_2表后,等待5秒钟,更新DealLocktest_1.


代码Use TestGo    --第二个会话        Begin Tran        Update DealLockTest_2        Set Name=N'test1'        Where ID >0    /*这里的Waitfor等待,是为了容易获取死锁的发生*/                    Waitfor Delay '00:00:05'                        Update DealLockTest_1        Set Name=N'test2'        Where ID >0                Commit TranGo

第二个会话代码,也先不要执行。


2.启动SQL Server Profiler,创建Trace(跟踪).

启动SQL Server Profiler工具(在Microsoft SQL Server Management  Studio的工具菜单上就发现它),创建一个Trace,Trace属性选择主要是包含:
Deadlock graphLock: DeadlockLock: Deadlock ChainRPC:CompletedSP:StmtCompletedSQL:BatchCompletedSQL:BatchStarting

点执行按钮,启动Trace。

3.执行测试代码&监视死锁。
转到 Microsoft SQL Server Management  Studio界面,执行第一个会话&第二个会话的代码,稍稍等待5秒钟,我们就会发现其中一个会话收到报错消息



我们再切换到SQL Server Profiler界面,就能发现SQL Server Profiler收到执行脚本过程发生死锁的信息。


OK,这里就先停止SQL Server Profiler上的“暂停跟踪” Or "停止跟踪"按钮,下面我们具体分析死锁发生过程。


4.分析死锁
如下图,我们可以看到第一个会话在SPID 54,第二个会话在SPID 55,一旦SQL Server发现死锁,它就会确定一个优胜者,可成功执行,和另一个作为牺牲品,要回滚。
可以到看到EventClass列中,两条SQL:BatchCompleted事件紧跟在Lock:DealLock后面,其中一条,它就是作为牺牲品,它会被回滚.而另一条SQL:BatchCompleted将会是优胜者,成功执行。
那么,谁是优胜者,谁是牺牲品呢? 不用着急,通过DealLock graph事件,所返回来的信息,我们可以知道结果。



我们虽然不能明白DealLock graph图示的含义,但通过图中描述的关系,我们知道一些有用的信息。图中左右两旁椭圆形相当一个处理节点(Process Node),当鼠标移动到上面的时候,可以看到内部执行的代码,如Insert,UPdate,Delete.有打叉的左边椭圆形就是牺牲者,没有打叉的 右边椭圆形是优胜者。中间两个长方形就是一个资源节点(Resource Node),描述数据库中的对象,如一个表、一行或一个索引。在我们当前的实例中,资源节点描述的是,在聚集索引请求获得排它锁(X)。椭圆形与长方形之 间,带箭头的连线表示,处理节点与资源节点的关系,包含描述锁的模式.

接下来我们更详细的看图里面的数据说明。
先看右边作为优胜者的这椭圆形,我们可以看到内容包含有:

服务器进程 ID: 服务器进程标识符 (SPID),即服务器给拥有锁的进程分配的标识符。服务器批 ID: 服务器批标识符 (SBID)。执行上下文 ID: 执行上下文标识符 (ECID)。与指定 SPID 相关联的给定线程的执行上下文 ID。ECID = {0,1,2,3, ...n},其中 0 始终表示主线程或父线程,并且 {1,2,3, ...n} 表示子线程。死锁优先级: 进程的死锁优先级有关可能值的详细信息,请参阅 SET DEADLOCK_PRIORITY (Transact-SQL)。已用日志: 进程所使用的日志空间量。所有者 ID: 正在使用事务并且当前正在等待锁的进程的事务 ID。事务描述符: 指向描述事务状态的事务描述符的指针。
这些数据描述,对于我们理解死锁,只需要知道其中的一些就够,除非我们在专门SQL Server机构工作,才可能要深入理解它们。



下面我们来看左边作为牺牲品的这椭圆形处理节点,它告诉我们以下信息:
1.它是一个失败的事务。(蓝色的交叉表示)
2.它是作为牺牲品的T-SQL代码。
3.它对右下方的资源节点有一个排它锁(X).
4.它对右上方的资源节点请求 一个排它锁(X).




我们再来看中间两个长方形的资源节点,两个处理节点对它们各自都使用权,来执行它们各自的代码,同时又有对对方使用资源请求的动作,从而发生了资源的竞争。
这也就让我们明白死锁发生的原因。

这里说明下资源节点的一些信息:

HoBT:  堆或 B 树。 用于保护没有聚集索引的表中的 B 树(索引)或堆数据页的锁
associated objid: 关联的对象ID,这里只是索引关联的对象ID.
Index name:索引名









让我们再对SQL Server Profiler监视到的数据,作一次整理:
回顾图:

1.在第3行SQL:BatchStarting, SPID 54 (第一个会话启动),在索引PK__DealLock__3214EC274222D4EF获得一个排它锁,再处理等待状态,(因为在这个实例中我设置了 Waitfor Delay '00:00:05')
2.在第6行SQL:BatchStarting, SPID 55 (第二个会话启动),在索引PK__DealLock__3214EC2745F365D3获得一个排它锁,再处理等待状态,(因为在这个实例中我设置了 Waitfor Delay '00:00:05')
3.两个进程都各自获得一个排它锁(X),几秒过去,它们就开始请求排它锁。
SPID 54 (第一个会话),先对PK__DealLock__3214EC2745F365D3请求一个排它锁(X),但PK__DealLock__3214EC2745F365D3当前已经给SPID 55 (第二个会话)获得。SPID 54要于等待。
同时,
SPID 55 (第二个会话),开始对PK__DealLock__3214EC274222D4EF请求一个排它锁(X),但PK__DealLock__3214EC274222D4EF当前已经给SPID 54 (第一个会话)获得。SPID 55要等待。

这里就出现了进程阻塞,从而发生死锁。

4.SQL Server  检查到这两个进程(第一个&第二个会话)发生死锁,并对占用资源比较少的进程,列入牺牲品名单,将它终止(Kill)。通过左右椭圆形进程节点显示,可以发现已用日志最少的是左边的进程节点。

5. SPID 54 (第一个会话)被回滚(Rollback),SPID 55 (第二个会话)执行成功。

到这里我们已算完成了,对死锁的监视和分析。

(注:是于其他死锁的定义,死锁模式,死锁避免&预防,等等,不是本文重点,我没有提出,网上太多这方面的文章)
分享到:
评论

相关推荐

    SqlServer2000性能工具Profiler.doc

    - 通过 SQL Server Profiler 分析执行慢的 SQL 语句,优化查询语句和索引设计。 - 监控死锁和资源争用,调整事务隔离级别和锁策略。 - 识别不恰当的数据库配置,如缓冲池大小、统计信息更新等,进行参数调优。 ...

    SQL SERVER 2005/2008 Express Profiler

    SQL Server 2005/2008 Express Profiler 是微软SQL Server数据库管理系统中一个强大的性能监视工具,尤其适用于SQL Server 2008 Express版本。它允许开发者和DBA(数据库管理员)深入地洞察数据库系统的运行情况,...

    SQL Profiler下载

    图形化监视SQL Server查询; 在后台收集查询信息; 分析性能; 诊断像死锁之类的问题; 调试T-SQL语句; 模拟重放SQL Server活动; 也可以使用SQL Profiler捕捉在SQL Server实例上执行的活动。这样的活动被...

    Mastering SQL Server Profiler eBook

    - **启动 Profiler 并创建新跟踪**:打开 SQL Server Profiler 应用程序后,通过“文件”>“新建跟踪”来创建一个新的跟踪文件。 - **选择目标**:指定跟踪的目标位置,可以选择将跟踪数据保存到文件或表中。 - **...

    SQL Server 2005 SQL Profiler

    如何使用 SQL Profiler 进行死锁分析 - **打开 SQL Server Profiler**:启动 SQL Profiler 工具。 - **连接服务器**:设置服务器类型为 “Database Engine” 并指定服务器名称及验证方式。 - **配置跟踪属性**: ...

    SQL Server作业失败引起死锁的故障排除.pdf

    6. **监控和预防**:使用SQL Server的性能监视工具(如SQL Server Profiler)定期检查死锁,并制定预防措施。 总之,SQL Server作业失败引起的死锁问题需要深入分析事务和资源的交互,通过优化代码、调整并发控制...

    SQLSERVER谈死锁的监控分析解决思路共8页.pdf

    以下是对“SQLSERVER谈死锁的监控分析解决思路共8页.pdf”这一主题的详细探讨。 1. **死锁定义与产生条件**: - **循环等待**:在死锁中,存在一个事务集合,每个事务都在等待另一个事务释放资源。 - **不可抢占...

    sqlserver并发分析及解决办法

    本文将从识别并发问题、分析和找出原因、修改并解决问题这三个方面来探讨SQL Server中的并发处理技巧。 #### 二、解决并发问题的关键步骤 **1. 识别并发问题** 并发问题的识别通常是通过监控系统行为和性能指标来...

    SQLServer 2012性能学习笔记

    - **死锁诊断**:利用跟踪标志 1204 和 1222 以及 SQL Server Profiler 来诊断死锁问题。 - **基于 Session 的性能分析**:分析每个会话的状态和活动,以识别可能的性能问题。 - **基于等待的性能分析**:分析 SQL...

    各类数据库中的SQL Profiler

    在SQL Server中,SQL Profiler是一个图形化界面工具,允许用户创建和运行跟踪来监视服务器活动。它可以捕捉到诸如T-SQL语句、存储过程、锁定、死锁等事件,这对于诊断性能问题、查找过度使用的资源以及优化数据库...

    SQL Server经典案例解析

    6. **性能监控与调优**:SQL Server自带的性能监视工具,如SQL Server Profiler和动态管理视图,可以帮助我们诊断性能瓶颈。通过分析Chap10的内容,我们可以学习如何监控和调整SQL Server的性能,包括内存管理、CPU...

    SQL Server 2017 Query Performance Tuning

    5. **查询性能监视和分析**:使用性能计数器、动态管理视图(DMVs)和SQL Server Profiler,可以追踪和分析查询性能问题。掌握这些工具的使用,有助于识别并解决性能瓶颈。 6. **并发控制**:SQL Server 2017采用事务...

    监控SQL_Server_2005状态

    用户可以通过“开始”菜单或“SQL Server Profiler”工具启动性能监视器。性能监视器可以创建图表、设置警报、记录日志,帮助分析 SQL Server 2005 与 Windows 操作系统之间的性能关系。 在监控过程中,关注的关键...

    SQL2000事件探查器SQL2K模版Profiler.rar

    SQL2000事件探查器(SQL Server Profiler)是微软SQL Server数据库管理系统中的一个强大的性能监视工具,主要用于监控和记录SQL Server的各种活动。它能够帮助DBA(数据库管理员)和开发人员跟踪和分析数据库服务器...

    SQL Server 2017 Query Performance Tuning Fifh Edition

    9. 性能监视和调优工具:如SQL Server Profiler、SQL Server Management Studio (SSMS)、Extended Events等工具的使用,它们是诊断和优化过程中的得力助手。 通过对《SQL Server 2017查询性能调优 第五版》的学习,...

    SQL Server 2005 技术内幕之性能调优原版CHM

    6. **性能监控与调优工具**:介绍了SQL Server 2005自带的性能监视器、SQL Server Profiler、动态管理视图(DMVs)等工具,以及如何利用这些工具收集性能数据,识别性能问题并实施改进措施。 7. **备份与恢复策略**...

    MS SQL Server语句追踪器

    总的来说,MS SQL Server语句追踪器是一个强大的工具,它提供了洞察数据库行为的窗口,帮助我们优化SQL Server的性能、诊断问题和改进代码质量。通过熟练使用这个工具,数据库管理员和开发者可以更有效地管理和维护...

    SQL server 2008 阻塞查询与处理

    - SQL Server Profiler是一个图形工具,用于监控SQL Server实例上的事件。 - 通过跟踪锁定和阻塞事件,可以更直观地识别出阻塞的原因。 4. **使用SQL Server Management Studio (SSMS)的活动监视器** - 活动监视...

    SQLServer数据库 DBA面试题 最新试卷 SQL面试题

    7. **性能调优**:学习性能监视工具,如SQL Server Profiler和Extended Events,以及如何解读性能计数器。理解索引碎片、统计信息更新和查询缓存对性能的影响。 8. **安全性管理**:熟悉SQL Server的身份验证模式...

Global site tag (gtag.js) - Google Analytics