Microsoft SQL 2012標準の実行、圧縮なし、パーティションなし。 Windows Server 2008 R2で実行しています。 私のローダープログラムはVS C#2013、純粋な64ビット、.NET 4.5.2です。 私はORMにDapper 1.42を使用します。 私はコミット/ロールバック/トランザクションロジックを使用しませんが、これは単なる単なる挿入です。C#MS-SQL 2012のデッドロックのデッドロック
ローダーの上部に、「SET RECOVERY SIMPLE」を発行します(これはこの問題の解決を試みたものです)。
ローダーは.csvを読み込み、データに対して何らかの処理を行い、実際には最も簡単なプログラムの挿入を行いますが、コードはほんの数行です。ローダーは決してselectを行いません。ローダは、このサーバ(テストサーバ)上で実行されている唯一のプロセスです。ローダーはマルチスレッドではありません。私は挿入時にcommandtimeout = 0を行います。
トランザクション(プロセスID xx)が別のプロセスでロックリソースにデッドロックされ、デッドロックの対象として選択されました。トランザクションを再実行してください。
明らかにエラーが表示され、2つのプロセスが実行されており、そのうちの1つがデッドロックしていると言われています。しかし、私はテストサーバー上にいる、私は唯一のユーザーです、実行中の他のプロセスはありません。
これをデバッグする方法がありません。私の 'キャッチ'ステートメントでは、このSQLコマンドを発行して他のものをキャッチしていますが、エラーが発生するたびに実行中は何も表示されません。だから何も実行されていない場合、なぜ私はインサートにデッドロックを取得し続けますか?私の「キャッチ」ステートメントで
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()