实体框架3 context.database.sqlquery导致死锁

时间:2013-05-24 04:47:29

标签: sql-server entity-framework

我遇到了一个有趣的场景。使用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

0 个答案:

没有答案