0

processd38f8748 (1 つ目) とprocess5b2988 (2 つ目)の 2 つのプロセス間でデッドロックが発生しました。

最初のプロセスはSELECT、別の接続で実行される です。そのためのコードで明示的なトランザクションが開かれていません。SELECT同じ接続で、この前後に実行された可能性のある sql-request はありません。この選択では、356615 ページで共有ロックを取得する必要があります。

2 番目のプロセスはUPDATE356615 ページで既に IX ロックを保持しています (システム内の正確な場所を特定することは困難ですが、私はそれを信じることができます)。別のページ 356614 が必要です。ここではすべて問題ありません。

ここで奇妙なことに、2 番目のプロセスは 356614 ページのロックを取得できません。これは、1 番目のプロセスによって既に保持されているためです。

これは、2 つの理由から私にとって奇妙です。

  • 私は、この選択がSQL接続で唯一の要求であることを確信しています
  • IL は再コミットされます。この IL では、ステートメントが終了するとすべての S ロックが解放されると思いました。

これがデッドロックxmlです。

<deadlock-list>
 <deadlock victim="processd38f8748">
  <process-list>
   <process id="processd38f8748" taskpriority="0" logused="0" waitresource="PAGE: 7:1:356615" waittime="2369" ownerId="24096354927" transactionname="SELECT" lasttranstarted="2013-03-06T11:26:10.810" XDES="0x368701960" lockMode="S" schedulerid="4" kpid="5756" status="suspended" spid="60" sbid="0" ecid="11" priority="0" trancount="0" lastbatchstarted="2013-03-06T11:26:10.810" lastbatchcompleted="2013-03-06T11:26:10.810" clientapp=".Net SqlClient Data Provider" hostname="CWCEINAW" hostpid="2604" isolationlevel="read committed (2)" xactid="24096354927" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" sqlhandle="0x02000000dffc7a241f9433fddb83b7f97a7c0369dbf6d467">
SELECT TOP 1 1
                FROM [WP_CashCenter_StockTransaction] AS [ST]
                    LEFT JOIN [WP_CashCenter_StockTransactionLine] AS [STL] ON ( [STL].[StockTransaction_id] = [ST].[id] )
                WHERE
                    [ST].[Status] IN (0, 1) AND
                    [ST].[Type] = 0 AND
                    ([ST].[StockContainerID] = 300000120244 OR [STL].[StockContainer_id] = 300000120244)     </frame>
    </executionStack>
    <inputbuf>
    </inputbuf>
   </process>
   <process id="process5b2988" taskpriority="0" logused="17268" waitresource="PAGE: 7:1:356614" waittime="2264" ownerId="24096354521" transactionname="user_transaction" lasttranstarted="2013-03-06T11:26:10.690" XDES="0x80021040" lockMode="IX" schedulerid="2" kpid="5832" status="suspended" spid="55" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2013-03-06T11:26:10.920" lastbatchcompleted="2013-03-06T11:26:10.920" lastattention="2013-02-28T11:26:25.940" clientapp=".Net SqlClient Data Provider" hostname="CWCEINAW" hostpid="2604" loginname="cwcuser" isolationlevel="read committed (2)" xactid="24096354521" currentdb="7" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128056">
    <executionStack>
     <frame procname="adhoc" line="1" stmtstart="702" sqlhandle="0x02000000f0a38d32edae20f54b42cd640b8022448db200b7">
UPDATE [WP_CashCenter_StockTransaction] SET [type] = @type, [status] = @status, [startdate] = @startdate, [enddate] = @enddate, [totalquantity] = @totalquantity, [totalvalue] = @totalvalue, [totalweight] = @totalweight, [datecreated] = @datecreated, [dateupdated] = @dateupdated, [stockorder_id] = @stockorder_id, [site_id] = @site_id, [stockowner_id] = @stockowner_id, [stocklocation_id] = @stocklocation_id, [stockcontainerid] = @stockcontainerid, [uid] = @uid, [machinenumber] = @machinenumber, [editor_id] = @editor_id WHERE [id] = @id     </frame>
     <frame procname="unknown" line="1" sqlhandle="0x000000000000000000000000000000000000000000000000">
unknown     </frame>
    </executionStack>
    <inputbuf>
(@type int,@status int,@startdate datetime,@enddate datetime,@totalquantity int,@totalvalue decimal(6,2),@totalweight decimal(5,5),@datecreated datetime,@dateupdated datetime,@stockorder_id bigint,@site_id int,@stockowner_id int,@stocklocation_id int,@stockcontainerid bigint,@uid uniqueidentifier,@machinenumber nvarchar(1),@editor_id int,@id bigint)UPDATE [WP_CashCenter_StockTransaction] SET [type] = @type, [status] = @status, [startdate] = @startdate, [enddate] = @enddate, [totalquantity] = @totalquantity, [totalvalue] = @totalvalue, [totalweight] = @totalweight, [datecreated] = @datecreated, [dateupdated] = @dateupdated, [stockorder_id] = @stockorder_id, [site_id] = @site_id, [stockowner_id] = @stockowner_id, [stocklocation_id] = @stocklocation_id, [stockcontainerid] = @stockcontainerid, [uid] = @uid, [machinenumber] = @machinenumber, [editor_id] = @editor_id WHERE [id] = @id    </inputbuf>
   </process>
  </process-list>
  <resource-list>
   <pagelock fileid="1" pageid="356615" dbid="7" objectname="Eindhoven_CWC.dbo.WP_CashCenter_StockTransaction" id="lock10f24cb00" mode="IX" associatedObjectId="72057594093830144">
    <owner-list>
     <owner id="process5b2988" mode="IX"/>
    </owner-list>
    <waiter-list>
     <waiter id="processd38f8748" mode="S" requestType="wait"/>
    </waiter-list>
   </pagelock>
   <pagelock fileid="1" pageid="356614" dbid="7" objectname="Eindhoven_CWC.dbo.WP_CashCenter_StockTransaction" id="lock17e539e00" mode="SIU" associatedObjectId="72057594093830144">
    <owner-list>
     <owner id="processd38f8748" mode="S"/>
    </owner-list>
    <waiter-list>
     <waiter id="process5b2988" mode="IX" requestType="convert"/>
    </waiter-list>
   </pagelock>
  </resource-list>
 </deadlock>
</deadlock-list>
4

1 に答える 1

1

リーダーとライターでアクセス順が違うようです。更新では、正確に 1 つのシークが実行されると予想され[Id] = @idますが、ページがあり、別のページが必要であるという事実自体がスキャンを示しています。のインデックスはあり[Id]ますか?

于 2013-03-25T10:01:42.870 に答える