Sql server SQL Server存储过程中的死锁

Sql server SQL Server存储过程中的死锁,sql-server,tsql,Sql Server,Tsql,我遇到了一个死锁,用我有限的SQL Server知识无法解决。 SP如下所示(实际列/表/SP名称已编辑): 您还必须检查EXEC SomeOtherSP。@Ezlo:如果出现问题,SomeOtherSP不会显示在死锁堆栈跟踪中吗?根据跟踪,此SP的两个并发调用在update语句上出现死锁。发布表的确切定义,包括所有索引,以及过程的确切SQL,而不是一些虚构的简化。你已经“简化”了解释。Col1列上有索引吗?@Remus Rusanu:这个过程和你看到的一模一样,只更改了列名。 ALTER PR

我遇到了一个死锁,用我有限的SQL Server知识无法解决。 SP如下所示(实际列/表/SP名称已编辑):


您还必须检查
EXEC SomeOtherSP
。@Ezlo:如果出现问题,
SomeOtherSP
不会显示在死锁堆栈跟踪中吗?根据跟踪,此SP的两个并发调用在update语句上出现死锁。发布表的确切定义,包括所有索引,以及过程的确切SQL,而不是一些虚构的简化。你已经“简化”了解释。Col1列上有索引吗?@Remus Rusanu:这个过程和你看到的一模一样,只更改了列名。
ALTER PROCEDURE MySP
    @id BIGINT = NULL
AS
BEGIN
    SET NOCOUNT ON;
    SET TRAN ISOLATION LEVEL READ UNCOMMITTED;

    DECLARE @ids TABLE ([ID] BIGINT, [Col1] TINYINT);
    DECLARE @idsUpdated [dbo].[BigIntList];

    UPDATE  Table1
    SET     [Col1] = CASE WHEN ([Col2] IS NOT NULL AND [Col2] <= GETUTCDATE()) THEN 5
                            WHEN ([Col3] IS NOT NULL AND [Col3] > GETUTCDATE()) THEN 4
                            ELSE 0
                      END
    OUTPUT  Inserted.[ID], Inserted.[Col1]
    INTO    @ids
    WHERE   ([ID] = @id AND [Col1] IN (0, 1, 4, 5))
            OR (@id IS NULL AND [Col1] IN (0, 4))

    INSERT INTO @idsUpdated (ID)
    SELECT      [id] FROM @ids 
    WHERE       [Col1] IN (0, 4)
    EXEC        SomeOtherSP @ids = @idsUpdated
END
<?xml version="1.0" encoding="UTF-8"?>
<deadlock>
   <victim-list>
      <victimProcess id="processbf11305848" />
   </victim-list>
   <process-list>
      <process id="processbf11305848" taskpriority="0" logused="6916" waitresource="KEY: 5:72057594153533440 (83cb2cafbb82)" waittime="1251" ownerId="177020808" transactionname="ParentSP" lasttranstarted="2018-05-29T21:03:26.013" XDES="0xc004810490" lockMode="U" schedulerid="2" kpid="13824" status="suspended" spid="66" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2018-05-29T21:03:26.087" lastbatchcompleted="2018-05-29T21:03:26.010" lastattention="1900-01-01T00:00:00.010" clientapp="Core .Net SqlClient Data Provider" hostname="webcrawler-1527627780-jq8fs" hostpid="479064550" loginname="api" isolationlevel="read uncommitted (1)" xactid="177020808" currentdb="5" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
         <executionStack>
            <frame procname="MySP" line="22" stmtstart="1452" stmtend="2496" sqlhandle="0x03000500843e711dfcb3dc00eaa8000001000000000000000000000000000000000000000000000000000000">UPDATE Table1...</frame>
            <frame procname="ParentSP" line="209" stmtstart="12288" stmtend="12356" sqlhandle="0x0300050068cf4121b7ddb600efa8000001000000000000000000000000000000000000000000000000000000">EXEC MySP @i</frame>
         </executionStack>
         <inputbuf>Proc [Database Id = 5 Object Id = 557961064]</inputbuf>
      </process>
      <process id="processbffc630108" taskpriority="0" logused="21312" waitresource="KEY: 5:72057594153533440 (9459fe930757)" waittime="1244" ownerId="177020807" transactionname="ParentSP" lasttranstarted="2018-05-29T21:03:25.983" XDES="0xbf34a24490" lockMode="U" schedulerid="3" kpid="7088" status="suspended" spid="65" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2018-05-29T21:03:26.087" lastbatchcompleted="2018-05-29T21:03:25.983" lastattention="1900-01-01T00:00:00.983" clientapp="Core .Net SqlClient Data Provider" hostname="webcrawler-1527627780-jq8fs" hostpid="479064550" loginname="api" isolationlevel="read uncommitted (1)" xactid="177020807" currentdb="5" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056">
         <executionStack>
            <frame procname="MySP" line="22" stmtstart="1452" stmtend="2496" sqlhandle="0x03000500843e711dfcb3dc00eaa8000001000000000000000000000000000000000000000000000000000000">UPDATE Table1...</frame>
            <frame procname="ParentSP" line="209" stmtstart="12288" stmtend="12356" sqlhandle="0x0300050068cf4121b7ddb600efa8000001000000000000000000000000000000000000000000000000000000">EXEC MySP @i</frame>
         </executionStack>
         <inputbuf>Proc [Database Id = 5 Object Id = 557961064]</inputbuf>
      </process>
   </process-list>
   <resource-list>
      <keylock hobtid="72057594153533440" dbid="5" objectname="Table1" indexname="PK_Table1" id="lockbf5ec94100" mode="X" associatedObjectId="72057594153533440">
         <owner-list>
            <owner id="processbffc630108" mode="X" />
         </owner-list>
         <waiter-list>
            <waiter id="processbf11305848" mode="U" requestType="wait" />
         </waiter-list>
      </keylock>
      <keylock hobtid="72057594153533440" dbid="5" objectname="Table1" indexname="PK_Table1" id="lockbf5ede1500" mode="X" associatedObjectId="72057594153533440">
         <owner-list>
            <owner id="processbf11305848" mode="X" />
         </owner-list>
         <waiter-list>
            <waiter id="processbffc630108" mode="U" requestType="wait" />
         </waiter-list>
      </keylock>
   </resource-list>
</deadlock>