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

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

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

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

DECLARE @SessionName SysName SELECT @SessionName = 'system_health'IF OBJECT_ID('tempdb..#Events') IS NOT NULL BEGINDROP TABLE #Events
ENDDECLARE @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 tINNER JOIN sys.dm_xe_sessions s ON s.address = t.event_session_address
WHERE s.name = @SessionNameAND 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 eCROSS 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 eCROSS 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 oWHERE o.DeadlockID = e.DeadlockIDORDER BY o.ObjectNameFOR 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 eCROSS 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

sqlserver查看历史死锁信息相关推荐

  1. 【docker一】docker是什么、为什么使用Docker、docker镜像搜索、获取、删除、查看、导出导入、查看历史详细信息

    Docker基础 1. docker是什么 docker的中文解释是码头工人. 官方解释: Docker是一个开源的容器引擎,它基于LCX容器技术,使用Go语言开发. 源代码托管在Github上,并遵 ...

  2. RDS SQL Server死锁(Deadlock)系列之五利用Extended Events获取死锁信息

    问题引入 在过去很长一段时间,不断有客人会问道:"在事先没有任何跟踪或者监控部署的情况下,阿里云RDS SQL Server有没有办法获取到历史死锁信息,供我们分析?".在写到RD ...

  3. lua mysql 死锁_使用 mysqladmin debug 查看死锁信息

    使用 mysqladmin debug 查看死锁信息 mysqladmin -S /mysql/data/mysql.sock debug 然后在error日志中,会看到: 11 lock struc ...

  4. mysql l查看历史等锁信息_查看锁信息(开启InnoDB监控)

    一.背景 在mysql处理死锁问题时,由于show engine innodb status输出来的死锁日志无任务事务上下文,并不能很好地诊断相关事务所持有的所有锁信息,包括:锁个数.锁类型等. 于是 ...

  5. SQLSERVER查看阻塞和死锁的进程以及执行的语句

    在查看阻塞和死锁进程之前先了解一点相关知识 sp_who 也可以指定登录名来查看一些信息(进程ID.主机名.数据库等) sp_who sa sp_who2 也可以指定具体的进程号查看,如查看161进程 ...

  6. linux 文件查找帮助命令 , 查看网络链接信息, 历史命令

    grep :查看文本文件内容,显示包含指定"字符串"的行.   格式:grep  [选项]  '匹配字符串'  文本文件 例: grep ' root'    /etc/passw ...

  7. linux 文件查找帮助命令 , 查看网络链接信息, 历史命令

    grep :查看文本文件内容,显示包含指定"字符串"的行.   格式:grep  [选项]  '匹配字符串'  文本文件 例: grep ' root'    /etc/passw ...

  8. mysql l查看历史等锁信息_mysql查看锁等信息SQL

    查看锁等信息,包括锁信息: select "HOLD:",ph.id h_processid,trh.trx_id h_trx_id,trh.trx_started h_start ...

  9. java查询线程状态命令_JAVA 线程死锁,以及linux 命令和jstack 命令 查看线程死锁状态信息...

    /* * Copyright (C) 2009 The doctor Authors * https://github.com/doctorwho1986 * * Licensed under the ...

最新文章

  1. muduo采用计时函数gettimeofday
  2. sql计算留存_SQL无所不能:DBA宝妈宝爸系列分享
  3. G6图可视化引擎 v4.1.7
  4. 小米手机老板,雷军,肯定是假程序员
  5. Weblogic监控指标
  6. java 接口 方法的 不同_Java – 使用相同的方法和不同的返回类型实现多个接口...
  7. 开滦二中2021高考成绩查询,2021唐山中考录取分数线查询
  8. hibernate一对多映射实现
  9. 修改windows cmd f2快捷_解放你的右手,实测12个超好用的自带快捷键
  10. 3.Docker技术入门与实战 --- 使用Docker镜像
  11. 斐讯T1刷机详细指南
  12. 看风水不如依照这些定律改造命运
  13. rejected X11 forwarding request错误
  14. java.io.UTFDataFormatException: encoded string too long: 270976 bytes
  15. Java春招和秋招的区别_国企招聘,春招与秋招有何区别?错过秋招我该怎么办?...
  16. C语言刷题随记 —— 国际象棋棋盘
  17. 探索多层次内存系统的页面管理设计空间Exploring the Design Space of Page Management for Multi-Tiered Memory Systems
  18. 仓储场景使用电子货架电子标签具体有哪些优势?又是如何影响前端零售?
  19. Ae 效果快速参考:抠像
  20. 服务器上Ubuntu系统安装

热门文章

  1. ## 纯干货|UI设计字体分类、使用标准及测量内容
  2. EFS加密解密----重装系统后
  3. DELL灵越笔记本插上耳机后,只有外放耳机无声音的解决方法。
  4. 带你初步了解基因表达调控
  5. 网格布局(固定单元格间隔,单元格、容器大小不定)布局使用
  6. cont在c语言用法,在S7-1500中指令TSEND_C and TRCV_C如何使用?
  7. Halcon软件使用心得(cont'd)
  8. js splice的三个用法
  9. 基于Java的NetCDF文件解析
  10. 程序员github头像_给新程序员的5个GitHub技巧