SQL SERVER 查看近期死锁
在项目运行的过程中,死锁不可能完全避免,但要尽可能减少死锁的出现,
产生死锁的原因主要是:
1,系统资源不足。
2,进程运行推进的顺序不合适。
3,资源分配不当等。
产生死锁的四个必要条件:
- 互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
- 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求时,该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
- 不可剥夺条件:已经分配的资源不能从相应的进程中被强制地剥夺。
- 循环等待条件: 系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。
排查死锁是有哪个SQL导致的,死锁产生后即消失,很难让用户重现死锁问题,虽然可以从日志中分析死锁,但非常繁琐,可以利用下面的SQL SERVER 扩展事件,查询历史死锁,查询原因:
- /****************************************************************
- * 检查近期死锁;定位到具体的对象。方便排查问题;
- ********************************************************************/
- DECLARE @SessionName SysName
- SELECT @SessionName = 'system_health'
- IF OBJECT_ID('tempdb..#Events') IS NOT NULL BEGIN
- DROP TABLE #Events
- END
- DECLARE @Target_File NVarChar(1000)
- , @Target_Dir NVarChar(1000)
- , @Target_File_WildCard NVarChar(1000)
- SELECT @Target_File = CAST(t.target_data as XML).value('EventFileTarget[1]/File[1]/@name', 'NVARCHAR(256)')
- FROM sys.dm_xe_session_targets t
- INNER JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address
- WHERE s.name = @SessionName
- AND t.target_name = 'event_file'
- SELECT @Target_Dir = LEFT(@Target_File, Len(@Target_File) - CHARINDEX('\', REVERSE(@Target_File)))
- SELECT @Target_File_WildCard = @Target_Dir + '\' + @SessionName + '_*.xel'
- --Keep this as a separate table because it's called twice in the next query. You don't want this running twice.
- SELECT DeadlockGraph = CAST(event_data AS XML)
- , DeadlockID = Row_Number() OVER(ORDER BY file_name, file_offset)
- INTO #Events
- FROM sys.fn_xe_file_target_read_file(@Target_File_WildCard, null, null, null) AS F
- WHERE event_data like '<event name="xml_deadlock_report%'
- ;WITH Victims AS
- (
- SELECT VictimID = Deadlock.Victims.value('@id', 'varchar(50)')
- , e.DeadlockID
- FROM #Events e
- CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/victim-list/victimProcess') as Deadlock(Victims)
- )
- , DeadlockObjects AS
- (
- SELECT DISTINCT e.DeadlockID
- , ObjectName = Deadlock.Resources.value('@objectname', 'nvarchar(256)')
- FROM #Events e
- CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/resource-list/*') as Deadlock(Resources)
- )
- SELECT *
- FROM
- (
- SELECT e.DeadlockID
- , TransactionTime = Deadlock.Process.value('@lasttranstarted', 'datetime')
- , DeadlockGraph
- , DeadlockObjects = substring((SELECT (', ' + o.ObjectName)
- FROM DeadlockObjects o
- WHERE o.DeadlockID = e.DeadlockID
- ORDER BY o.ObjectName
- FOR XML PATH ('')
- ), 3, 4000)
- , Victim = CASE WHEN v.VictimID IS NOT NULL
- THEN 1
- ELSE 0
- END
- , SPID = Deadlock.Process.value('@spid', 'int')
- , ProcedureName = Deadlock.Process.value('executionStack[1]/frame[1]/@procname[1]', 'varchar(200)')
- , LockMode = Deadlock.Process.value('@lockMode', 'char(1)')
- , Code = Deadlock.Process.value('executionStack[1]/frame[1]', 'varchar(1000)')
- , ClientApp = CASE LEFT(Deadlock.Process.value('@clientapp', 'varchar(100)'), 29)
- WHEN 'SQLAgent - TSQL JobStep (Job '
- THEN 'SQLAgent Job: ' + (SELECT name FROM msdb..sysjobs sj WHERE substring(Deadlock.Process.value('@clientapp', 'varchar(100)'),32,32)=(substring(sys.fn_varbintohexstr(sj.job_id),3,100))) + ' - ' + SUBSTRING(Deadlock.Process.value('@clientapp', 'varchar(100)'), 67, len(Deadlock.Process.value('@clientapp', 'varchar(100)'))-67)
- ELSE Deadlock.Process.value('@clientapp', 'varchar(100)')
- END
- , HostName = Deadlock.Process.value('@hostname', 'varchar(20)')
- , LoginName = Deadlock.Process.value('@loginname', 'varchar(20)')
- , InputBuffer = Deadlock.Process.value('inputbuf[1]', 'varchar(1000)')
- FROM #Events e
- CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/process-list/process') as Deadlock(Process)
- LEFT JOIN Victims v ON v.DeadlockID = e.DeadlockID AND v.VictimID = Deadlock.Process.value('@id', 'varchar(50)')
- ) X
- ORDER BY DeadlockID DESC
利用此脚本排查历史死锁很方便。
SQL SERVER 查看近期死锁的更多相关文章
- 深入浅出SQL Server中的死锁
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...
- SQL Server中解决死锁
SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的 ...
- SQL Server中的死锁
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...
- 深入浅出SQL Server中的死锁(实战篇)
简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...
- SQL Server中解决死锁的新方法介绍
SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的 ...
- 深入浅出 关于SQL Server中的死锁问题
深入浅出 关于SQL Server中的死锁问题 博客2013-02-12 13:44 分享到:我要吐槽 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相 ...
- 【转载】深入浅出SQL Server中的死锁
essay from:http://www.cnblogs.com/CareySon/archive/2012/09/19/2693555.html 简介 死锁的本质是一种僵持状态,是多个主体对于资源 ...
- 在SQL Server里如何处理死锁
在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...
- SQL Server里如何处理死锁
在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...
随机推荐
- 一张图搞定OAuth2.0
1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...
- Spring中的Lookup(方法注入)
在使用Spring时,可能会遇到这种情况:一个单例的Bean依赖另一个非单例的Bean.如果简单的使用自动装配来注入依赖,就可能会出现一些问题,如下所示: 单例的Class A @Component ...
- Linux时间子系统之(十二):periodic tick
专题文档汇总目录 Notes:TickDevice模式,以及clocckevent设备.TickDevice设备的初始化,TickDevice是如何加入到系统中的.周期性Tick的产生. 原文地址:L ...
- 理解Flexbox弹性盒子
http://www.w3cplus.com/css3/understanding-flexbox-everything-you-need-to-know.html参考文档 1:要开始使用Flexbo ...
- Yii整合ucenter实现单点登录
原文:http://www.php2.cc/article-1349-1.html 准备工作 1.下载ucenter源码,并安装好 2.下载ucenter开发源码,根据自己的项目下载对应版本(utf- ...
- Java 学习笔记 (八) Java 变量
head first java page85 实例变量是声明在类内而不是方法中 class Horse{ private double height=15.2; private String bree ...
- bzoj 4501 旅行
01分数规划+最大权闭合子图 倒拓扑序处理每个节点 $$f[x]=\frac{\sum{f[v]}}{n}+1$$ 二分答案$val$ 只需要判断是否存在$\sum{f[v]}+1-val>0$ ...
- sdoi 2009 HH去散步 矩阵乘
如果没有题里的"不会立刻沿着刚刚走来的路走回"限制,那么直接矩乘计算k步的方案数 但加了这个限制,就不能以点来矩乘了,考虑边数<=60,如果以边建邻接矩阵呢?? 先拆边,再把 ...
- BZOJ_1954_Pku3764 The xor-longest Path_Trie树
Description 给定一棵n个点的带权树,求树上最长的异或和路径 把根到点路径上点权异或和求出来,然后变成了Trie树裸题. 代码: #include <cstdio> #inc ...
- BZOJ4554: [Tjoi2016&Heoi2016]游戏 luoguP2825 loj2057
题面描述:尽可能多的放置符合要求的炸弹. 分析: 在i,j处放置炸弹,则在第i行,上一个硬石头之后,下一个硬石头之前,第j列,上一个硬石头之后,下一个硬石头之前,不能再次放置炸弹. 首先,这个题,一看 ...