我在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