2 つのステートメントは、異なる順序で行ロックを取得します。これはデッドロックの典型的なケースです。これは、取得されたロックの順序が常にグローバルな順序 (ID 順など) になるようにすることで修正できます。おそらく、2 つの UPDATE
を結合する必要があります。 ステートメントを 1 つにまとめ、クライアントで ID のリストを並べ替えてから SQL Server に送信します。多くの典型的な UPDATE
について これは実際にうまく動作する予定です (ただし、保証されていません)。
または、デッドロックを検出した場合に備えて再試行ロジックを追加します (SqlException.Number == 1205
)。これは、より深いコード変更を必要としないため、より洗練されています。ただし、デッドロックはパフォーマンスに影響するため、これはデッドロック率が低い場合にのみ行ってください。
並列処理で大量の更新が生成される場合は、INSERT
を実行できます これらすべての更新を一時テーブルに (同時に実行できます) 行い、完了したら、1 つの大きな UPDATE
を実行します。 これにより、すべての個々の更新レコードがメイン テーブルにコピーされます。サンプル クエリで結合ソースを変更するだけです。