Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql [原始校准运行ID]ASC ) 带(PAD_索引=关闭, 统计信息\u NORECOMPUTE=OFF, SORT_IN_TEMPDB=OFF, 忽略重复键=关闭, 下车, 在线=关闭, 允许\u行\u锁=打开, 在[主]上允许页面锁定_Sql_Sql Server_Database_Deadlock_Database Deadlocks - Fatal编程技术网

Sql [原始校准运行ID]ASC ) 带(PAD_索引=关闭, 统计信息\u NORECOMPUTE=OFF, SORT_IN_TEMPDB=OFF, 忽略重复键=关闭, 下车, 在线=关闭, 允许\u行\u锁=打开, 在[主]上允许页面锁定

Sql [原始校准运行ID]ASC ) 带(PAD_索引=关闭, 统计信息\u NORECOMPUTE=OFF, SORT_IN_TEMPDB=OFF, 忽略重复键=关闭, 下车, 在线=关闭, 允许\u行\u锁=打开, 在[主]上允许页面锁定,sql,sql-server,database,deadlock,database-deadlocks,Sql,Sql Server,Database,Deadlock,Database Deadlocks,1)在开发/测试服务器上还原备份并运行此查询: SELECT * FROM ( SELECT [EMPLID],[CAL_RUN_ID],[EMPL_RCD],[GP_PAYGROUP],[CAL_ID],[ORIG_CAL_RUN_ID], %%lockres%% AS KeyLockID FROM [dbo].[PS_GP_NEW_RTO_WRK] ) x WHERE x.KeyLockID IN ('(01c1926aca97)','(9e1bb6c02ace)') (0

1)在开发/测试服务器上还原备份并运行此查询:

SELECT *
FROM (
    SELECT [EMPLID],[CAL_RUN_ID],[EMPL_RCD],[GP_PAYGROUP],[CAL_ID],[ORIG_CAL_RUN_ID], %%lockres%% AS KeyLockID
    FROM [dbo].[PS_GP_NEW_RTO_WRK]
) x
WHERE x.KeyLockID IN ('(01c1926aca97)','(9e1bb6c02ace)')
(01c1926aca97)
(9e1bb6c02ace)
值是“锁id”(请参阅/deadlock list/deadlock/process list/process/process/@waitresource值:
键:7:72057601661599744(01c1926aca97)
键:7:72057601661599744(9e1bb6c02ace)
)。 如果得到3行或更多行,那么答案是肯定的

2) 此外,您还可以检查不同的计划:

SELECT qp.*, txt.*
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) txt
WHERE txt.text LIKE N'UPDATE PS\_GP\_NEW\_RTO\_WRK SET ORIG\_CAL\_RUN\_ID = (SELECT DISTINCT C.ORIG\_CAL\_RUN\_ID FROM PS\_GP\_PYE\_PRC\_STAT B ,PS\_GP\_OLD\_RTO\_WRK C WHERE C.EMPLID BETWEEN @P1 AND @P2 AND C.CAL\_RUN\_ID=@P3 AND C.EMPLID = PS\_GP\_NEW\_RTO\_WRK.EMPLID AND C.CAL\_RUN\_ID = PS\_GP\_NEW\_RTO\_WRK.CAL\_RUN\_ID AND C.EMPL\_RCD = PS\_GP\_NEW\_RTO\_WRK.EMPL\_RCD AND C.CAL\_ID = PS\_GP\_NEW\_RTO\_WRK.CAL\_ID AND C.GP\_PAYGROUP = PS\_GP\_NEW\_RTO\_WRK.GP\_PAYGROUP AND B.CAL\_ID= C.CAL\_ID AND B.GP\_PAYGROUP= C.GP\_PAYGROUP AND B.EMPLID=C.EMPLID AND B.EMPL\_RCD=C.EMPL\_RCD AND B.ORIG\_CAL\_RUN\_ID=C.ORIG\_CAL\_RUN\_ID AND C.SEL\_ACTION IN (N'R',N'Z') AND B.SEL\_ACTION=N'A') WHERE EMPLID BETWEEN @P4 AND @P5 AND CAL\_RUN\_ID=@P6 AND (N'N'=@P7 OR EMPLID IN (SELECT EMPLID FROM PS\_GP\_GRP\_LIST\_RUN WHERE RUN\_CNTL\_ID=@P8 AND OPRID=@P9) ) AND EXISTS (SELECT B.ORIG\_CAL\_RUN\_ID FROM PS\_GP\_PYE\_PRC\_STAT B ,PS\_GP\_OLD\_RTO\_WRK C WHERE C.EMPLID BETWEEN @P10 AND @P11 AND C.CAL\_RUN\_ID=@P12 AND C.EMPLID = PS\_GP\_NEW\_RTO\_WRK.EMPLID AND C.CAL\_RUN\_ID = PS\_GP\_NEW\_RTO\_WRK.CAL\_RUN\_ID AND C.EMPL\_RCD = PS\_GP\_NEW\_RTO%' ESCAPE N'\'
ORDER BY txt.text

SELECT qp.*, txt.*
FROM sys.dm_exec_cached_plans cp
CROSS APPLY sys.dm_exec_query_plan(cp.plan_handle) qp
CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle) txt
WHERE txt.text LIKE N'(@P1 nvarchar(508),@P2 nvarchar(508),@P3 nvarchar(508),@P4 nvarchar(508),@P5 nvarchar(508),@P6 nvarchar(508),@P7 nvarchar(508),@P8 nvarchar(508),@P9 nvarchar(508),@P10 nvarchar(508),@P11 nvarchar(508),@P12 nvarchar(508))UPDATE PS\_GP\_NEW\_RTO\_WRK SET ORIG\_CAL\_RUN\_ID = (SELECT DISTINCT C.ORIG\_CAL\_RUN\_ID FROM PS\_GP\_PYE\_PRC\_STAT B ,PS\_GP\_OLD\_RTO\_WRK C WHERE C.EMPLID BETWEEN @P1 AND @P2 AND C.CAL\_RUN\_ID=@P3 AND C.EMPLID = PS\_GP\_NEW\_RTO\_WRK.EMPLID AND C.CAL\_RUN\_ID = PS\_GP\_NEW\_RTO\_WRK.CAL\_RUN\_ID AND C.EMPL\_RCD = PS\_GP\_NEW\_RTO\_WRK.EMPL\_RCD AND C.CAL\_ID = PS\_GP\_NEW\_RTO\_WRK.CAL\_ID AND C.GP\_PAYGROUP = PS\_GP\_NEW\_RTO\_WRK.GP\_PAYGROUP AND B.CAL\_ID= C.CAL\_ID AND B.GP\_PAYGROUP= C.GP\_PAYGROUP AND B.EMPLID=C.EMPLID AND B.EMPL\_RCD=C.EMPL\_RCD AND B.ORIG\_CAL\_RUN\_ID=C.ORIG\_CAL\_RUN\_ID AND C.SEL\_ACTION IN (N'R',N'Z') AND B.SEL\_ACTION=N'A') WHERE EMPLID BETWEEN @P4 AND @P5 AND CAL\_RUN\_ID=@P6 AND (N'N'=@P7 OR EMPLID IN (SELECT EMPLID FROM PS\_GP\_GRP\_LIST\_RUN WHERE RUN\_CNTL\_ID=@P8 AND OPRID=@P9) ) AND EXISTS (SELECT B.ORIG\_CAL\_RUN\_ID FRO%' ESCAPE N'\'
ORDER BY txt.text
如果每个更新或(@…)更新语句都有不同的计划(例如串行计划和并行计划),那么这个事实排除了初始假设(散列冲突)

扩展评论:

T=SPID94开始执行UPDATE语句(串行计划)

T+1=SPID95开始执行UPDATE语句(并行计划)

T+2=SPID94在第4行/键上使用X锁

T+3=SPID95-thread1尝试在第4行/键上使用U形锁(已被SPID94锁定)。 此外,SPID95-thread2在第9行/键上采用X锁

T+4=SPID94尝试在第9行/键上使用U锁(已被SPID95锁定)


结论:SPID94在第4行/键上有一个X锁,并在第9行/键上请求一个U锁。SPID95在第9行/键上有一个X锁,并在第4行/键上请求一个U锁。因此,我们有一个死锁。

***这个事实可能排除了***谢谢Bogdan,我得到了第1点,但在第2点上,为什么对每个update语句使用不同的串行和并行计划会排除哈希冲突的原因?两个不同的计划可能解释了死锁,而不是哈希冲突。通常,UPDATE语句对行/键使用U锁,验证筛选器(其中),如果筛选器为true,则U锁将转换为X锁。看看我的评论(最后一个答案)。另外,尝试发布这两个更新的执行计划。