在项目运行的过程中,死锁不可能完全避免,但要尽可能减少死锁的出现,

产生死锁的原因主要是:
1,系统资源不足。
2,进程运行推进的顺序不合适。
3,资源分配不当等。

产生死锁的四个必要条件:
- 互斥条件:一个资源每次只能被一个进程使用,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待。
- 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求时,该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
- 不可剥夺条件:已经分配的资源不能从相应的进程中被强制地剥夺。
- 循环等待条件: 系统中若干进程组成环路,该环路中每个进程都在等待相邻进程正占用的资源。
这四个条件是死锁的必要条件,只要系统发生死锁,这些条件必然成立,而只要上述条件之一不满足,就不会发生死锁。

排查死锁是有哪个SQL导致的,死锁产生后即消失,很难让用户重现死锁问题,虽然可以从日志中分析死锁,但非常繁琐,可以利用下面的SQL SERVER 扩展事件,查询历史死锁,查询原因:

  1. /****************************************************************
  2. * 检查近期死锁;定位到具体的对象。方便排查问题;
  3. ********************************************************************/
  4.  
  5. DECLARE @SessionName SysName
  6.  
  7. SELECT @SessionName = 'system_health'
  8.  
  9. IF OBJECT_ID('tempdb..#Events') IS NOT NULL BEGIN
  10. DROP TABLE #Events
  11. END
  12.  
  13. DECLARE @Target_File NVarChar(1000)
  14. , @Target_Dir NVarChar(1000)
  15. , @Target_File_WildCard NVarChar(1000)
  16.  
  17. SELECT @Target_File = CAST(t.target_data as XML).value('EventFileTarget[1]/File[1]/@name', 'NVARCHAR(256)')
  18. FROM sys.dm_xe_session_targets t
  19. INNER JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address
  20. WHERE s.name = @SessionName
  21. AND t.target_name = 'event_file'
  22.  
  23. SELECT @Target_Dir = LEFT(@Target_File, Len(@Target_File) - CHARINDEX('\', REVERSE(@Target_File)))
  24.  
  25. SELECT @Target_File_WildCard = @Target_Dir + '\' + @SessionName + '_*.xel'
  26.  
  27. --Keep this as a separate table because it's called twice in the next query. You don't want this running twice.
  28. SELECT DeadlockGraph = CAST(event_data AS XML)
  29. , DeadlockID = Row_Number() OVER(ORDER BY file_name, file_offset)
  30. INTO #Events
  31. FROM sys.fn_xe_file_target_read_file(@Target_File_WildCard, null, null, null) AS F
  32. WHERE event_data like '<event name="xml_deadlock_report%'
  33.  
  34. ;WITH Victims AS
  35. (
  36. SELECT VictimID = Deadlock.Victims.value('@id', 'varchar(50)')
  37. , e.DeadlockID
  38. FROM #Events e
  39. CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/victim-list/victimProcess') as Deadlock(Victims)
  40. )
  41. , DeadlockObjects AS
  42. (
  43. SELECT DISTINCT e.DeadlockID
  44. , ObjectName = Deadlock.Resources.value('@objectname', 'nvarchar(256)')
  45. FROM #Events e
  46. CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/resource-list/*') as Deadlock(Resources)
  47. )
  48. SELECT *
  49. FROM
  50. (
  51. SELECT e.DeadlockID
  52. , TransactionTime = Deadlock.Process.value('@lasttranstarted', 'datetime')
  53. , DeadlockGraph
  54. , DeadlockObjects = substring((SELECT (', ' + o.ObjectName)
  55. FROM DeadlockObjects o
  56. WHERE o.DeadlockID = e.DeadlockID
  57. ORDER BY o.ObjectName
  58. FOR XML PATH ('')
  59. ), 3, 4000)
  60. , Victim = CASE WHEN v.VictimID IS NOT NULL
  61. THEN 1
  62. ELSE 0
  63. END
  64. , SPID = Deadlock.Process.value('@spid', 'int')
  65. , ProcedureName = Deadlock.Process.value('executionStack[1]/frame[1]/@procname[1]', 'varchar(200)')
  66. , LockMode = Deadlock.Process.value('@lockMode', 'char(1)')
  67. , Code = Deadlock.Process.value('executionStack[1]/frame[1]', 'varchar(1000)')
  68. , ClientApp = CASE LEFT(Deadlock.Process.value('@clientapp', 'varchar(100)'), 29)
  69. WHEN 'SQLAgent - TSQL JobStep (Job '
  70. 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)
  71. ELSE Deadlock.Process.value('@clientapp', 'varchar(100)')
  72. END
  73. , HostName = Deadlock.Process.value('@hostname', 'varchar(20)')
  74. , LoginName = Deadlock.Process.value('@loginname', 'varchar(20)')
  75. , InputBuffer = Deadlock.Process.value('inputbuf[1]', 'varchar(1000)')
  76. FROM #Events e
  77. CROSS APPLY e.DeadlockGraph.nodes('/event/data/value/deadlock/process-list/process') as Deadlock(Process)
  78. LEFT JOIN Victims v ON v.DeadlockID = e.DeadlockID AND v.VictimID = Deadlock.Process.value('@id', 'varchar(50)')
  79. ) X
  80. ORDER BY DeadlockID DESC

利用此脚本排查历史死锁很方便。

SQL SERVER 查看近期死锁的更多相关文章

  1. 深入浅出SQL Server中的死锁

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  2. SQL Server中解决死锁

    SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的 ...

  3. SQL Server中的死锁

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  4. 深入浅出SQL Server中的死锁(实战篇)

    简介 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相关观念有一个理解. 一些基础知识 要理解SQL Server中的死锁,更好的方式是通过类比从更大的面理 ...

  5. SQL Server中解决死锁的新方法介绍

    SQL Server中解决死锁的新方法介绍 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面的 ...

  6. 深入浅出 关于SQL Server中的死锁问题

    深入浅出 关于SQL Server中的死锁问题 博客2013-02-12 13:44   分享到:我要吐槽 死锁的本质是一种僵持状态,是多个主体对于资源的争用而导致的.理解死锁首先需要对死锁所涉及的相 ...

  7. 【转载】深入浅出SQL Server中的死锁

    essay from:http://www.cnblogs.com/CareySon/archive/2012/09/19/2693555.html 简介 死锁的本质是一种僵持状态,是多个主体对于资源 ...

  8. 在SQL Server里如何处理死锁

    在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...

  9. SQL Server里如何处理死锁

    在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...

随机推荐

  1. 一张图搞定OAuth2.0

    1.引言 本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式 非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们. 一项新的技术,无非就是了解它是什么,为什 ...

  2. Spring中的Lookup(方法注入)

    在使用Spring时,可能会遇到这种情况:一个单例的Bean依赖另一个非单例的Bean.如果简单的使用自动装配来注入依赖,就可能会出现一些问题,如下所示: 单例的Class A @Component ...

  3. Linux时间子系统之(十二):periodic tick

    专题文档汇总目录 Notes:TickDevice模式,以及clocckevent设备.TickDevice设备的初始化,TickDevice是如何加入到系统中的.周期性Tick的产生. 原文地址:L ...

  4. 理解Flexbox弹性盒子

    http://www.w3cplus.com/css3/understanding-flexbox-everything-you-need-to-know.html参考文档 1:要开始使用Flexbo ...

  5. Yii整合ucenter实现单点登录

    原文:http://www.php2.cc/article-1349-1.html 准备工作 1.下载ucenter源码,并安装好 2.下载ucenter开发源码,根据自己的项目下载对应版本(utf- ...

  6. Java 学习笔记 (八) Java 变量

    head first java page85 实例变量是声明在类内而不是方法中 class Horse{ private double height=15.2; private String bree ...

  7. bzoj 4501 旅行

    01分数规划+最大权闭合子图 倒拓扑序处理每个节点 $$f[x]=\frac{\sum{f[v]}}{n}+1$$ 二分答案$val$ 只需要判断是否存在$\sum{f[v]}+1-val>0$ ...

  8. sdoi 2009 HH去散步 矩阵乘

    如果没有题里的"不会立刻沿着刚刚走来的路走回"限制,那么直接矩乘计算k步的方案数 但加了这个限制,就不能以点来矩乘了,考虑边数<=60,如果以边建邻接矩阵呢?? 先拆边,再把 ...

  9. BZOJ_1954_Pku3764 The xor-longest Path_Trie树

    Description 给定一棵n个点的带权树,求树上最长的异或和路径 把根到点路径上点权异或和求出来,然后变成了Trie树裸题.   代码: #include <cstdio> #inc ...

  10. BZOJ4554: [Tjoi2016&Heoi2016]游戏 luoguP2825 loj2057

    题面描述:尽可能多的放置符合要求的炸弹. 分析: 在i,j处放置炸弹,则在第i行,上一个硬石头之后,下一个硬石头之前,第j列,上一个硬石头之后,下一个硬石头之前,不能再次放置炸弹. 首先,这个题,一看 ...