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
-
Transaction1
はTable2.Row2
の更新を試みますが、Transaction2
がまだコミットされておらず、ロックを解放していないためにブロックされます - Transaction2 は
Table1.Row1
の更新を試みますが、Transaction1
がコミットされておらず、ロックを解放していないため、ブロックされています - デッドロックが発生するのは、
Transaction1
がTransaction2
の完了を待機しているが、Transaction2
がTransaction1
の完了を待機しているためです。
システムはこのデッドロックを検出し、の被害者として関係するトランザクションの 1 つを選択します。 次に、このエラー メッセージを発行し、被害者のトランザクションをロールバックします。 詳細については、「 Deadlocks」を参照してください。
ユーザー アクション
デッドロックはほとんどの場合、アプリケーション関連の問題であり、アプリケーション開発者はコードを変更する必要があります。 エラー 1205 を受け取った場合の 1 つの方法は、クエリをもう一度実行することです。 詳細については、「開発者向けのデッドロック シミュレーター アプリ :アプリで SQL デッドロックの問題を処理する方法」を参照してください。
また、デッドロックを回避できるようにアプリケーションを修正します。 対象として選択されたトランザクションは、同時に実行されている操作に応じて再試行でき、成功する可能性があります。
デッドロックが発生しないようにするには、すべてのトランザクションが同じ順序 (Table1
、Table2
) で行にアクセスすることを検討してください。 この方法では、ブロックが発生する可能性がありますが、デッドロックは回避されます。
詳細については、「 デッドロックの処理 および デッドロックのミニマイズ」を参照してください。