2017-09-05 100 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 

这会比扫描慢,但会减少死锁的可能性。