[解決済み] デッドロックで発生したSqlExceptionをキャッチするには?
質問
.NET 3.5 / C#のアプリから、以下のようにキャッチしたい。
SqlException
をキャッチしたいのですが
デッドロックが原因の場合のみ
を SQL Server 2008 インスタンス上で実行する必要があります。
典型的なエラーメッセージは
Transaction (Process ID 58) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction.
それでも、文書化されていないようです。 エラーコード は存在しないようです。
の存在に対する例外のフィルタリング デッドロック キーワードの存在に対して例外をフィルタリングすることは、この動作を実現するための非常に醜い方法のように思えます。誰かこれを行う正しい方法を知っていますか?
どのように解決するのですか?
デッドロックに対する Microsft SQL Server 固有のエラーコードは 1205 なので、SqlException を処理し、それをチェックする必要があります。そのため、例えば、他のすべてのタイプのSqlExceptionに対して、例外をバブル化したい場合。
catch (SqlException ex)
{
if (ex.Number == 1205)
{
// Deadlock
}
else
throw;
}
または、C# 6で利用可能な例外フィルタリングを使用します。
catch (SqlException ex) when (ex.Number == 1205)
{
// Deadlock
}
与えられたメッセージに対する実際の SQL エラーコードを見つけるために便利なことは、SQL Server の sys.messages を見ることです。
例
SELECT * FROM sys.messages WHERE text LIKE '%deadlock%' AND language_id=1033
デッドロックを処理する別の方法(SQL Server 2005以降)は、TRY...CATCHサポートを使用してストアドプロシージャ内で処理することです。
BEGIN TRY
-- some sql statements
END TRY
BEGIN CATCH
IF (ERROR_NUMBER() = 1205)
-- is a deadlock
ELSE
-- is not a deadlock
END CATCH
完全な例があります はこちら に、デッドロック再試行ロジックを純粋に SQL 内に実装する方法の完全な例があります。
関連
-
[解決済み] .Netの配列のLongLengthの目的は何ですか?
-
[解決済み] csilogfileは何のためにあるのですか?
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] Powershell v3 Invoke-WebRequest HTTPSエラー
-
[解決済み] 列挙型を文字列に変換する
-
[解決済み] enumを列挙するには
-
[解決済み] 複数の例外を一度にキャッチする?
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] MemoryStreamから文字列を取得する方法は?
-
[解決済み] あるプロセスがデッドロックの犠牲となる原因
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】WCFとは何か、何ができるのか?
-
[解決済み】この動詞型ではcontent-bodyを送信できない
-
[解決済み】警告。同じ依存アセンブリの異なるバージョン間で競合が見つかりました。
-
[解決済み] Marginのプロパティ順
-
[解決済み] ファイルまたはアセンブリ 'System.Data.SQLite' をロードできませんでした。
-
[解決済み] .Netの配列のLongLengthの目的は何ですか?
-
[解決済み] DockPanelを空きスペースいっぱいに表示させる方法
-
[解決済み] 1は有効なWin32アプリケーションではありません "を解決するには?
-
[解決済み] .net の OOM 問題を解決する必要があります。
-
[解決済み] app.configが作成されるタイミングとapp.exe.configが作成されるタイミング、その違いとは?