次の方法で共有


MSSQLSERVER_1205

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

詳細

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

説明

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

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

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

ユーザー アクション

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

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

デッドロックが発生しないようにするには、すべてのトランザクションが同じ順序 (Table1Table2) で行にアクセスすることを検討してください。 この方法では、ブロックが発生する可能性がありますが、デッドロックは回避されます。

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