2010-05-28 42 views
1

我在SQL Server 2005中遇到以下死鎖,並且存在特定的刪除存儲過程,我無法弄清楚我需要做些什麼來糾正它。在Sql Server中刪除Stored Proc Deadlock

<deadlock-list> 
<deadlock victim="processf3a868"> 
    <process-list> 
    <process id="processcae718" taskpriority="0" logused="0" waitresource="KEY: 7:72057594340311040 (b50041b389fe)" waittime="62" ownerId="1678098" transactionguid="0x950057256032d14db6a2c553a39a8279" transactionname="user_transaction" lasttranstarted="2010-05-26T13:45:23.517" XDES="0x8306c370" lockMode="RangeS-U" schedulerid="1" kpid="2432" status="suspended" spid="59" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2010-05-26T13:45:23.717" lastbatchcompleted="2010-05-26T13:45:23.717" clientapp=".Net SqlClient Data Provider" hostname="DEVELOPER01" hostpid="28104" loginname="DEVELOPER01\ServiceUser" isolationlevel="serializable (4)" xactid="1678098" currentdb="7" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056"> 
    <executionStack> 
    <frame procname="DB.dbo.sp_DeleteSecuritiesRecords" line="13" stmtstart="708" stmtend="918" sqlhandle="0x030007008b6b662229b10c014f9d00000100000000000000"> 
DELETE FROM tSecuritiesRecords WHERE [FilingID] = @filingID AND [AccountID] = @accountID  </frame> 
    </executionStack> 
    <inputbuf> 
Proc [Database Id = 7 Object Id = 577137547] </inputbuf> 
    </process> 
    <process id="processf3a868" taskpriority="0" logused="0" waitresource="KEY: 7:72057594340311040 (4f00409af90f)" waittime="93" ownerId="1678019" transactionguid="0xb716547a8f7fdd40b342e5db6b3699fb" transactionname="user_transaction" lasttranstarted="2010-05-26T13:45:21.543" XDES="0x92617130" lockMode="X" schedulerid="3" kpid="13108" status="suspended" spid="57" sbid="0" ecid="0" priority="0" transcount="2" lastbatchstarted="2010-05-26T13:45:23.717" lastbatchcompleted="2010-05-26T13:45:23.717" clientapp=".Net SqlClient Data Provider" hostname="DEVELOPER01" hostpid="28104" loginname="DEVELOPER01\ServiceUser" isolationlevel="serializable (4)" xactid="1678019" currentdb="7" lockTimeout="4294967295" clientoption1="673185824" clientoption2="128056"> 
    <executionStack> 
    <frame procname="DB.dbo.sp_DeleteSecuritiesRecords" line="13" stmtstart="708" stmtend="918" sqlhandle="0x030007008b6b662229b10c014f9d00000100000000000000"> 
DELETE FROM tSecuritiesRecords WHERE [FilingID] = @filingID AND [AccountID] = @accountID  </frame> 
    </executionStack> 
    <inputbuf> 
Proc [Database Id = 7 Object Id = 577137547] </inputbuf> 
    </process> 
    </process-list> 
    <resource-list> 
    <keylock hobtid="72057594340311040" dbid="7" objectname="DB.dbo.tSecuritiesRecords" indexname="PK_tTransactions" id="lock82416380" mode="RangeS-U" associatedObjectId="72057594340311040"> 
    <owner-list> 
    <owner id="processf3a868" mode="RangeS-U"/> 
    </owner-list> 
    <waiter-list> 
    <waiter id="processcae718" mode="RangeS-U" requestType="convert"/> 
    </waiter-list> 
    </keylock> 
    <keylock hobtid="72057594340311040" dbid="7" objectname="DB.dbo.tSecuritiesRecords" indexname="PK_tTransactions" id="lock825fd380" mode="RangeS-U" associatedObjectId="72057594340311040"> 
    <owner-list> 
    <owner id="processcae718" mode="RangeS-S"/> 
    </owner-list> 
    <waiter-list> 
    <waiter id="processf3a868" mode="X" requestType="convert"/> 
    </waiter-list> 
    </keylock> 
    </resource-list> 
</deadlock> 
</deadlock-list> 
+0

「tSecuritiesRecords」的聚簇索引鍵是什麼? – 2010-05-28 17:42:20

回答

2

你缺少一個指標:

create index idxSecuritiesAccountFiling 
    on tSecuritiesRecords (AccountID, FillingID); 

會費缺乏指數的DELETE操作,都必須做的範圍掃描和獲取序列化的鎖,以穩定刪除操作。當他們轉身嘗試將S鎖轉換爲X鎖時,它們會發生死鎖。使用索引後,獲取的範圍鎖不會重疊。

+0

我仍然得到死鎖創建以下索引後: CREATE NONCLUSTERED INDEX [IX_AccountID_FilingID] ON [DBO] [tSecuritiesRecords] ( \t [帳戶ID] ASC, \t [FilingID] ASC )WITH(PAD_INDEX = OFF。 ,[STATIME] GO – Chris 2010-06-01 15:48:07

+0

你試圖從不同的連接中刪除重疊範圍嗎?相同的@AccountID和/或相同的@FillingID? – 2010-06-01 19:01:01

+0

順便說一句,你可以發佈新的死鎖信息?如果使用新的索引,圖表*必須*不同,我想看看如何。 – 2010-06-01 20:30:14