我已经捕获了一个SQL Server 2012死锁图(使用Gail Shaw的查询),该图显示了一个进程,其中taskpriority ="10"被挑选为2个进程的死锁牺牲品,其中taskpriority ="0".
我的理解是首先检查死锁优先级,并选择较低优先级进程作为受害者.只有当所有过程都具有同等优先权时,其他因素才会相关.任何人都可以解释为什么DEADLOCK_PRIORITY可能不被尊重?
有趣的是,SET DEADLOCK_PRIORITY MSDN页面说HIGH映射到5,我的代码肯定使用HIGH,所以我不确定10来自哪里.
令人讨厌的是,受害者是一个重要的业务流程,而幸存者都是SSMS Intellisense查询.
编辑
首先,这个问题是关于为什么DEADLOCK_PRIORITY不会被尊重,而不是死锁是什么或如何防止它们或解决它们或导致下面示例中的那个.这些都是有趣的对话,但不是在这里.
其次,根据@SteveFord发现的链接,可能有相关的其他几个事实; 在此SQL Server上启用了锁定分区,并且SQL Server版本早于2012 CU6(当KB2776344中的修补程序发布时).
第三,对于那些感兴趣的人来说,这是一个消毒的死锁图,显示了被选为受害者的更高优先级的过程.我删除了SQL并更改了一些名称,其他一切都完好无损.
<deadlock>
<victim-list>
<victimProcess id="process5f390c8" />
</victim-list>
<process-list>
<process id="process5f390c8" taskpriority="10" logused="3200" waitresource="KEY: 6:281474978938880 (655334c51469)" waittime="1806" ownerId="296690694" transactionname="ALTER PARTITION FUNCTION" lasttranstarted="2018-01-29T11:59:36.140" XDES="0x886312d28" lockMode="X" schedulerid="9" kpid="32684" status="suspended" spid="86" sbid="0" ecid="0" priority="5" trancount="1" lastbatchstarted="2018-01-29T11:58:38.310" lastbatchcompleted="2018-01-29T11:58:38.310" lastattention="1900-01-01T00:00:00.310" clientapp="CLIENTAPP" hostname="HOSTNAME" hostpid="10912" loginname="DOMAIN\USERNAME" isolationlevel="read committed (2)" xactid="296690694" currentdb="6" lockTimeout="4294967295" clientoption1="673187936" clientoption2="128056">
<executionStack>
<frame procname="adhoc" line="2" stmtstart="138" sqlhandle="0x01000600a1f28605207939860500000000000000000000000000000000000000000000000000000000000000">
...removed...</frame>
<frame procname="mssqlsystemresource.sys.sp_executesql" line="1" stmtstart="-1" sqlhandle="0x0400ff7f427f99d9010000000000000000000000000000000000000000000000000000000000000000000000"> …Run Code Online (Sandbox Code Playgroud)