運行Microsoft SQL 2012標準,沒有壓縮,沒有分區。 在Windows Server 2008 R2上運行。我的裝載程序是VS C#2013,純64位,.NET 4.5.2 我使用Dapper 1.42作爲我的ORM。 我不使用提交/回滾/事務邏輯,這些只是簡單的插入。C#Dapper loader in MS-SQL 2012插入時死鎖
在加載器的頂部,我發出'SET RECOVERY SIMPLE'(這是爲了解決這個問題)。
加載程序讀取.csv,對數據進行一些處理,然後執行插入操作,這是程序最簡單的形式,它只是幾行代碼。加載程序從不做選擇。加載程序是在此服務器(測試服務器)上運行的唯一進程。加載器不是多線程的。我在insert上做了commandtimeout = 0。
我一直不停地收到'Transaction(Process ID xx)在另一個進程鎖死資源上死鎖,並被選爲死鎖犧牲品。重新運行交易「。
錯誤聽起來很明顯,它說我有2個進程在運行,其中一個是死鎖。但是我在測試服務器上,我是唯一的用戶,沒有其他進程在運行。
我不知道如何調試。在我的'catch'語句中,我發出這條SQL命令來捕獲其他運行的東西,但是每次出現錯誤時它都顯示NOTHING正在運行。所以如果沒有任何東西在運行,爲什麼我一直在插入時遇到死鎖?
SELECT L.request_session_id AS SPID, DB_NAME(L.resource_database_id) AS DatabaseName, O.Name AS LockedObjectName, P.object_id AS LockedObjectId, L.resource_type AS LockedResource, L.request_mode AS LockType, ST.text AS SqlStatementText, ES.login_name AS LoginName, ES.host_name AS HostName, TST.is_user_transaction as IsUserTransaction, AT.name as TransactionName, CN.auth_scheme as AuthenticationMethod
FROM sys.dm_tran_locks L
LEFT JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
LEFT JOIN sys.objects O ON O.object_id = P.object_id
LEFT JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
LEFT JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
LEFT JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
LEFT JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE DB_NAME(L.resource_database_id) = DB_NAME()