2016-07-28 12 views
0

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

答えて

0

、私はデッドロックが被害者のトランザクションがロールバックされ発生した場合

を実行している他に何をキャッチするために、このSQLコマンドを発行します。これにより、すべてのロックが解放され、競合するトランザクションが続行されます。 の後にロールバックが完了した場合、制御は犠牲者のセッションに戻され、例外が発生します。 catchが実行されるまでに、並行プロセスがおそらく完了しています。

あなたがしようとしていることは根本的に間違っています。最後の問題として、

そして:もちろんのこと、あなたはすでには、デッドロック情報をキャプチャする手段を持っているsys.dm_exec_sessions permissions

ユーザーがサーバーに対してVIEW SERVER STATE権限を持っている場合、SQL Serverのインスタンス上で実行されているすべてのセッションがユーザーに表示されます。そうでない場合、は、現在のセッションのみを表示します。