【发布时间】:2010-10-18 22:11:49
【问题描述】:
我有一个使用 linq 死锁的插入语句。所以我把它放在一个存储过程中,以防周围的语句影响它。
现在存储过程是死锁的。根据 Server Profiler,插入语句的某些内容正在锁定自身。它声称其中两个插入语句正在等待释放 PK 索引:
当我将代码放在存储过程中时,它现在声明此存储过程已与此存储过程的另一个实例死锁。
这里是代码。 select 语句类似于 linq 在执行自己的查询时使用的语句。我只是想看看该项目是否存在,如果不存在则插入它。我可以通过 PK 或一些查找值找到系统。
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
【问题讨论】:
标签: c# linq-to-sql sql-server-2008 stored-procedures deadlock