2016-07-28 53 views
0

運行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() 

回答

0

在我的「抓」語句,我發出SQL命令趕什麼其他正在運行

發生死鎖時受害人事務回滾。這將釋放所有的鎖,從而允許競爭的事務繼續。只有後回滾完成是控制權返回給受害人會話並引發異常。到catch運行時,併發進程可能已經完成。

你想要做的是從根本上不正確。更何況,你已經來捕獲死鎖信息的手段:

而且,作爲最後一個問題:sys.dm_exec_sessions permissions

如果用戶在服務器上具有VIEW SERVER STATE權限,則用戶將看到SQL Server實例上的所有正在執行的會話;否則,用戶將只會看到當前會話