processd38f8748 (1 つ目) とprocess5b2988 (2 つ目)の 2 つのプロセス間でデッドロックが発生しました。
最初のプロセスはSELECT
、別の接続で実行される です。そのためのコードで明示的なトランザクションが開かれていません。SELECT
同じ接続で、この前後に実行された可能性のある sql-request はありません。この選択では、356615 ページで共有ロックを取得する必要があります。
2 番目のプロセスはUPDATE
356615 ページで既に 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>