MSSQLSERVER_1205

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

詳細

属性 Value
製品名 SQL Server
イベント ID 1205
イベント ソース MSSQLSERVER
コンポーネント SQLEngine
シンボル名 LK_VICTIM
メッセージ テキスト トランザクション (プロセス ID %d) が、%.*ls 個のリソースで他のプロセスとデッドロックして、このトランザクションがそのデッドロックの対象となりました。 トランザクションを再実行してください。

説明

個別のトランザクションで、競合する順序でリソースにアクセスすると、デッドロックが発生します。 次に例を示します。

  • Transaction2 によって Table2.Row2 が更新されている間に、Transaction1 によって Table1.Row1 が更新されました
  • Transaction1 は Table2.Row2 の更新を試みますが、Transaction2 がまだコミットされておらず、ロックを解放していないためにブロックされます
  • Transaction2 は Table1.Row1 の更新を試みますが、Transaction1 がコミットされておらず、ロックを解放していないため、ブロックされています
  • Transaction1 が Transaction2 の完了を待機していますが、Transaction2 は Transaction1 の完了を待機しているので、デッドロックが生じました。

システムによって、このデッドロックが検出され、関係するトランザクションの 1 つが "犠牲者" として選択されます。 次に、このエラー メッセージが発行されて、犠牲者のトランザクションがロールバックされます。 詳細については、「デッドロック」を参照してください

ユーザーの操作

デッドロックはほとんどの場合、アプリケーション関連の問題であり、アプリケーション開発者はコードを変更する必要があります。 エラー 1205 を受け取った場合の 1 つの方法は、クエリをもう一度実行することです。 再試行する方法の例については、このブログを参照してください。 - デッドロックを処理してクエリを再実行する: 開発者向けのデッドロック シミュレーター アプリ: アプリで SQL デッドロックの問題を処理する方法

また、デッドロックを回避できるようにアプリケーションを修正します。 デッドロック対象として選択されたトランザクションは、再試行が可能です。同時に実行されている操作によって状況が異なりますが、再試行は成功する可能性があります。

デッドロックを回避するには、すべてのトランザクションから行に対するアクセスが、同じ順序 (Table1 の次に Table2 など) で行われるようにすることを検討します。 こうすることで、ブロックが発生することはあっても、デッドロックは発生しません。

詳細については、「デッドロックの処理とデッドロックの最小化」を参照してください。