【发布时间】:2017-09-05 12:24:58
【问题描述】:
我有一个更新存储过程,我从 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)
谢谢
【问题讨论】:
-
此过程不会单独导致任何死锁。您是否在线程中的任何其他过程或查询中使用此表?
-
不要以
sp_开头您的过程名称。 Is the sp_ prefix still a no-no? - Aaron Bertrand -
你说
otrecordid是nvarchar(255)。为什么@RecordIdnvarchar(50)的参数是? -
需要完整的表 DDL,包括索引和执行计划才能真正了解发生了什么。此 UPDATE 是否预计会影响多行?如果不是,为什么 OTRECORDID 上没有唯一索引?
标签: sql-server deadlock