我有一个用linq编写的插入语句,会导致死锁。因此,我将它放在了一个存储过程中,以避免周围的语句对其产生干扰。
现在这个存储过程也出现了死锁。服务分析器显示,这个插入语句在锁定自身,其中两个语句正在等待主键索引被释放:
当我将代码放到存储过程中后,它现在声称该存储过程与该存储过程的另一个实例发生了死锁。
以下是代码。选择语句类似于linq执行查询时使用的语句。我只想查看该项是否存在,如果不存在,则插入它。我可以通过主键或一些查找值来找到该系统。
现在这个存储过程也出现了死锁。服务分析器显示,这个插入语句在锁定自身,其中两个语句正在等待主键索引被释放:
当我将代码放到存储过程中后,它现在声称该存储过程与该存储过程的另一个实例发生了死锁。
以下是代码。选择语句类似于linq执行查询时使用的语句。我只想查看该项是否存在,如果不存在,则插入它。我可以通过主键或一些查找值来找到该系统。
SET NOCOUNT ON;
BEGIN TRY
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
BEGIN TRANSACTION SPFindContractMachine
DECLARE @id int;
set @id = (select [m].pkID from Machines as [m]
WHERE ([m].[fkContract] = @fkContract) AND ((
(CASE
WHEN @bByID = 1 THEN
(CASE
WHEN [m].[pkID] = @nMachineID THEN 1
WHEN NOT ([m].[pkID] = @nMachineID) THEN 0
ELSE NULL
END)
ELSE
(CASE
WHEN ([m].[iA_Metric] = @lA) AND ([m].[iB_Metric] = @lB) AND ([m].[iC_Metric] = @lC) THEN 1
WHEN NOT (([m].[iA_Metric] = @lA) AND ([m].[iB_Metric] = @lB) AND ([m].[iC_Metric] = @lC)) THEN 0
ELSE NULL
END)
END)) = 1));
if (@id IS NULL)
begin
Insert into Machines(fkContract, iA_Metric, iB_Metric, iC_Metric, dteFirstAdded)
values (@fkContract, @lA, @lB, @lC, GETDATE());
set @id = SCOPE_IDENTITY();
end
COMMIT TRANSACTION SPFindContractMachine
return @id;
END TRY
BEGIN CATCH
if @@TRANCOUNT > 0
ROLLBACK TRANSACTION SPFindContractMachine
END CATCH