交易(过程ID)通过另一个过程在锁定资源上陷入僵局,并被选为僵局受害者.在SQL Server 2014中



我有一个更新的过程,我将其称为c#代码,我的代码同时以3个线程运行。更新声明通常会引发错误"交易(过程ID)在锁定资源上使用另一个过程陷入僵局,并被选为僵局受害者。重新运行交易"。如何在SQL Server 2014或C#代码中解决此问题?

更新存储过程:

ALTER PROCEDURE sp_UpdateSP
@RecordID nvarchar(50),
@FileNetID nvarchar(50),
@ClassName nvarchar(150) 
 AS
Begin tran t1
UPDATE MYTABLE SET FilenetID=@FileNetID, DOCUMENT_TYPE=@ClassName, CONTROLID='FileAttach' where OTRECORDID=@RecordID 
Commit tran t1

表索引:非唯一的,非聚类的otrecordid上升nvarchar(255)

谢谢

我怀疑问题是由于SQL在表上执行扫描而引起的,因为它认为它比在索引上进行搜索更快,然后是一个键lookup,然后找到要更新的行。/p>

您可以防止这些扫描并强迫SQL使用FORCESEEK提示执行搜索。

您的代码将成为

Begin tran t1
UPDATE mt SET FilenetID=@FileNetID, DOCUMENT_TYPE=@ClassName, CONTROLID='FileAttach' FROM MYTABLE mt WITH(FORCESEEK) where OTRECORDID=@RecordID 
Commit tran t1

这将比扫描慢,但会降低僵局的可能性。

这可能不是确切的答案,但是如果您想解决问题,请运行服务:

win r> type services.msc

查找SQL Server服务 - 如果您只有一个实例,则主要命名为SQL Server(MSSQLSERVER) - 然后重新启动该服务,现在僵持的事务已经消失,因此您可以继续工作。

最新更新