sql >> データベース >  >> RDS >> Sqlserver

この単純なコードはデッドロックを引き起こします。簡単なサンプルプログラムが含まれています

    2 つのステートメントは、異なる順序で行ロックを取得します。これはデッドロックの典型的なケースです。これは、取得されたロックの順序が常にグローバルな順序 (ID 順など) になるようにすることで修正できます。おそらく、2 つの UPDATE を結合する必要があります。 ステートメントを 1 つにまとめ、クライアントで ID のリストを並べ替えてから SQL Server に送信します。多くの典型的な UPDATE について これは実際にうまく動作する予定です (ただし、保証されていません)。

    または、デッドロックを検出した場合に備えて再試行ロジックを追加します (SqlException.Number == 1205 )。これは、より深いコード変更を必要としないため、より洗練されています。ただし、デッドロックはパフォーマンスに影響するため、これはデッドロック率が低い場合にのみ行ってください。

    並列処理で大量の更新が生成される場合は、INSERT を実行できます これらすべての更新を一時テーブルに (同時に実行できます) 行い、完了したら、1 つの大きな UPDATE を実行します。 これにより、すべての個々の更新レコードがメイン テーブルにコピーされます。サンプル クエリで結合ソースを変更するだけです。



    1. PHP OCI、Oracle、およびデフォルトの数値形式

    2. MySQLのテーブルと列の権限を付与する

    3. MySQLタイムゾーンクエリ

    4. SQLインジェクションはどのように機能し、どのように保護しますか