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 など) で行われるようにすることを検討します。 こうすることで、ブロックが発生することはあっても、デッドロックは発生しません。
詳細については、「 デッドロックの処理 および デッドロックのミニマイズ」を参照してください。