2017-09-05 12 views
1

私は更新ストアドプロシージャを持っており、私はそれをC#コードから呼び出すと、私のコードは3つのスレッドで同時に実行されています。 Updateステートメントは、一般に、「トランザクション(プロセスID)が別のプロセスとロックリソースでデッドロックされ、デッドロックの被害者として選択されました。」というエラーをスローします。どのようにSQL Server 2014またはC#コードでこれを解決できますか?トランザクション(プロセスID)は、別のプロセスとのロックリソースでデッドロックされ、デッドロックの犠牲者として選択されました。 in SQL Server 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 

表ランキング:問題は、SQLのパフォーマンスによって引き起こされる 非ユニークな、非クラスタOTRECORDID昇順NVARCHAR(255)

おかげ

+0

この手順ではデッドロックは発生しません。他のどのプロシージャやスレッドでこのテーブルを使用していますか? –

+0

プロシージャ名を 'sp_'で開始しないでください。 [sp_接頭辞はまだno-noですか? - Aaron Bertrand](https://sqlperformance.com/2012/10/t-sql-queries/sp_prefix) – SqlZim

+0

'otrecordid'は' nvarchar(255) 'です。 '@ RecordId'' nvarchar(50)'のパラメータはなぜですか? – SqlZim

答えて

0

私は疑いますインデックスをシークするよりも速いと思うので、テーブルをスキャンしてから、更新するローを見つけるためにkeylookupを実行します。

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 

なるこれはスキャンよりも遅くなりますが、デッドロックの可能性を低減します。