適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL データベース
詳細
| 属性 | 値 |
|---|---|
| 製品名 | SQL Server |
| イベント ID | 1205 |
| イベント ソース | MSSQLSERVER |
| コンポーネント | SQLEngine |
| シンボル名 | LK_VICTIM |
| メッセージ テキスト | トランザクション (プロセス ID %d) が、%.*ls 個のリソースで他のプロセスとデッドロックして、このトランザクションがそのデッドロックの対象となりました。 トランザクションを再実行してください。 |
説明
個別のトランザクションで、競合する順序でリソースにアクセスすると、デッドロックが発生します。 次に例を示します。
-
Transaction1更新Table1.Row1、Transaction2 の更新Table2.Row2 -
Transaction1はTable2.Row2の更新を試みますが、Transaction2がまだコミットされておらず、ロックを解放していないためにブロックされます - Transaction2 は
Table1.Row1の更新を試みますが、Transaction1がコミットされておらず、ロックを解放していないため、ブロックされています - デッドロックが発生するのは、
Transaction1がTransaction2の完了を待機しているが、Transaction2がTransaction1の完了を待機しているためです。
システムはこのデッドロックを検出し、の被害者として関係するトランザクションの 1 つを選択します。 次に、このエラー メッセージを発行し、被害者のトランザクションをロールバックします。 詳細については、「 Deadlocks」を参照してください。
ユーザー アクション
デッドロックはほとんどの場合、アプリケーション関連の問題であり、アプリケーション開発者はコードを変更する必要があります。 エラー 1205 を受け取った場合の 1 つの方法は、クエリをもう一度実行することです。 詳細については、「開発者向けのデッドロック シミュレーター アプリ :アプリで SQL デッドロックの問題を処理する方法」を参照してください。
また、デッドロックを回避できるようにアプリケーションを修正します。 対象として選択されたトランザクションは、同時に実行されている操作に応じて再試行でき、成功する可能性があります。
デッドロックが発生しないようにするには、すべてのトランザクションが同じ順序 (Table1、Table2) で行にアクセスすることを検討してください。 この方法では、ブロックが発生する可能性がありますが、デッドロックは回避されます。
詳細については、「 デッドロックの処理 および デッドロックのミニマイズ」を参照してください。