我在SQL Server 2012和.NET 4.5.1上使用EntityFramework 6。长事务处理的死锁
在长时间运行的交易中,第二个用户发生死锁。问题是第一个用户阻止PayrollListHumanResourceID=90FA9981-AFD3-43BF-AD92-AAE5E2A42B5A
的记录,第二个用户想要为PayrollListHumanResourceID=6CFE74C3-F180-497C-8DDA-BCA8D075FF59
获取数据。
以下代码显示来自SQL事件探查器的实体框架客户端事务。对于第二个用户,最后(有时倒数第二个)exec
发生死锁。为了举例,我删除了大多数可以正常工作的函数。我在C#代码中为DELETE
部分之后和COMMIT
之前的第一个用户放置了一个断点。第一个用户具有不同的p__linq
值。
set quoted_identifier on
set arithabort off
set numeric_roundabort off
set ansi_warnings on
set ansi_padding on
set ansi_nulls on
set concat_null_yields_null on
set cursor_close_on_commit off
set implicit_transactions off
set language us_english
set dateformat mdy
set datefirst 7
set transaction isolation level read uncommitted
begin tran;
(...)
exec sp_executesql N'DELETE [Extent1] FROM [dbo].[PayrollListErrors] AS [Extent1] WHERE [Extent1].[PayrollListHumanResourceID] = @p__linq__0',N'@p__linq__0 uniqueidentifier',@p__linq__0='6CFE74C3-F180-497C-8DDA-BCA8D075FF59'
exec sp_executesql N'DELETE [Extent1] FROM [dbo].[PayrollListElementRelations] AS [Extent1] WHERE [Extent1].[PayrollListHumanResourceID] = @p__linq__0',N'@p__linq__0 uniqueidentifier',@p__linq__0='6CFE74C3-F180-497C-8DDA-BCA8D075FF59'
exec sp_executesql N'DELETE [Extent1] FROM [dbo].[PayrollListElements] AS [Extent1] WHERE [Extent1].[PayrollListHumanResourceID] = @p__linq__0',N'@p__linq__0 uniqueidentifier',@p__linq__0='6CFE74C3-F180-497C-8DDA-BCA8D075FF59'
commit;
建立在我的数据库一般的表是:INT型
- ID列,与聚集索引(现在已经过时了,对人友好的阅读),
- 类型UNIQUEIDENTIFIER的GUID列,PRIMARY KEY,带非聚簇索引,
- UNIQUEIDENTIFIER类型的外键,带非聚簇索引(当然指向GUID列),
- 每个外键都有一个索引(除用于记录信息的2列外,他们没有使用在这次交易中)。
锁升级没有出现在我的例子中。 更改隔离级别不起作用。删除/由ID
列更新该表工作没有任何僵局:
DELETE [Extent1] FROM [dbo].[PayrollListElements] AS [Extent1] WHERE [Extent1].ID = 30
问题出现时行正在从被检查表和外键引用删除。当我从父表中删除一行时,所有的子引用都被检查。尽管所有外键都有一个非聚集索引,其中一些正在通过索引扫描而不是索引查找进行检查。如果在此操作期间另一个用户至少阻止扫描表中的一行 - 删除操作将被阻止。即使阻塞行没有删除数据的引用,也会发生这种情况。 使用FORCESEEK表提示不起作用。
捕获死锁图形XML并将其附加到此处。阅读[在SQL Server中捕获死锁](http://www.brentozar.com/archive/2014/06/capturing-deadlock-information/) –
Remus Rusanu - 我刚刚编辑了我的帖子并附加了其他文件,包括死锁图表。 – Bruniasty