我遇到了一个有趣的场景。使用Entity Framework中提供的context.database.sqlquery我正在调用存储过程来更新字段。
在管理工作室中直接调用该过程时,编辑两个或多个项目时不会发生死锁。
使用context.database.sqlquery调用同一存储过程时,在编辑两个或多个项目时会遇到dealock。
我找到了解决此问题的方法,但我不明白为什么从框架调用该过程会导致死锁。所以我想我会问。
--Create a temp table to hold items based on userid
CREATE TABLE #tableA
(
[Id] int identity (1,1),
[Item_Id] int
)
INSERT INTO #tableA ([Item_Id]) SELECT [Id] FROM [Items] WHERE [UserId] = @UserId
--All of the other processing is omitted for brevity
--Based on final processing above update the IsActive flag on the Items table
UPDATE i
SET [IsActive] = 0
FROM #tableA ta INNER JOIN [Items] i ON ta.[Item_Id] = i.[Item_Id]
WHERE [IsActive] = 1
同样,我有一个有效的解决方案,只是试图理解为什么在EF中会发生死锁而不是直接调用该过程。
BTW,解决方案是将IsActive位添加到临时表并最初填充它然后在更新语句中的连接上我在where子句中使用临时表isactive位置。--Create a temp table to hold items based on userid
CREATE TABLE #tableA
(
[Id] int identity (1,1),
[Item_Id] int,
[IsActive]
)
INSERT INTO #tableA ([Item_Id], [IsActive]) SELECT [Id], [IsActive] FROM [Items] WHERE [UserId] = @UserId
--All of the other processing is omitted for brevity
--Based on final processing above update the IsActive flag on the Items table
UPDATE i
SET [IsActive] = 0
FROM #tableA ta INNER JOIN [Items] i ON ta.[Item_Id] = i.[Item_Id]
WHERE ta.[IsActive] = 1