次の方法で共有


MSSQLSERVER_1205

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

詳細

属性
製品名 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 つが "犠牲者" として選択されます。 次に、このエラー メッセージが発行されて、犠牲者のトランザクションがロールバックされます。 詳細については、「 Deadlocks」を参照してください。

ユーザーの操作

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

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

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

詳細については、「 デッドロックの処理 および デッドロックのミニマイズ」を参照してください。