2017-09-05 101 views
1

我有一個更新存儲過程,我從C#代碼調用它,我的代碼同時在3個線程中運行。更新語句通常會引發錯誤「事務(進程ID)與另一進程在鎖資源上死鎖,並且被選爲死鎖受害者。重新運行事務」。我如何解決這個在SQL Server 2014或C#代碼?事務(進程ID)在另一個進程的鎖資源上死鎖,並被選爲死鎖犧牲品。在SQL服務器2014

更新存儲過程:

ALTER PROCEDURE sp_UpdateSP 
@RecordID nvarchar(50), 
@FileNetID nvarchar(50), 
@ClassName nvarchar(150) 

AS 

Begin tran t1 
UPDATE MYTABLE SET [email protected], [email protected], CONTROLID='FileAttach' where [email protected] 
Commit tran t1 

表索引: 非唯一,非聚集OTRECORDID升序爲nvarchar(255)

感謝

+0

此過程不會單獨導致任何死鎖。您是否在線程中的任何其他過程或查詢中使用此表? –

+0

不要用'sp_'開始你的過程名稱。 [sp_前綴仍然是否定的? - 亞倫伯特蘭](https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix) – SqlZim

+0

你說'otrecordid'是'nvarchar(255)'。爲什麼'@ RecordId''nvarchar(50)'的參數? – SqlZim

回答

0

我懷疑問題是由SQL表演引起對錶進行掃描,因爲它認爲這比在索引上查找更快,然後通過鍵查找來查找要更新的行。

您可以通過使用FORCESEEK提示來阻止這些掃描並強制SQL執行查找。

你的代碼會變得

Begin tran t1 
UPDATE mt SET [email protected], [email protected], CONTROLID='FileAttach' FROM MYTABLE mt WITH(FORCESEEK) where [email protected] 
Commit tran t1 

這會比掃描慢,但會減少死鎖的可能性。