ゼロ デッドロックは基本的に、実行中のすべてのトランザクション (これには SELECT を含む) に対して読み取りおよび変更する予定のすべてのテーブル/obj を知っている必要があるため、一般的なケースでは信じられないほどコストのかかる問題です。一般的な考え方は、順序付けられた厳密な 2 フェーズ ロックと呼ばれます (2 フェーズ コミットと混同しないでください) ( http://en.wikipedia.org/wiki/Two_phase_locking ; 2PL でさえデッドロックがないことを保証しません)。
厳密な 2PL を実際に実装している DBMS はほとんどありません。これは、すべてのトランザクションが単純な SELECT ステートメントの実行を待機している間、パフォーマンスに大きな影響を与えるためです (フリー ランチはありません)。
いずれにせよ、これに本当に興味がある場合はSET ISOLATION LEVEL
、SQL Server を参照してください。必要に応じて微調整できます。http://en.wikipedia.org/wiki/Isolation_level
詳細については、シリアル化可能性に関するウィキペディアを参照してください: http://en.wikipedia.org/wiki/Serializability
つまり、ソース コードのリビジョンのようなものです。早い段階で頻繁にチェックインしてください。トランザクションを小さく (SQL ステートメントの数、変更された行の数)、高速に保ちます (ウォール クロック時間は、他のトランザクションとの衝突を回避するのに役立ちます)。1 回のトランザクションで多くのことを行うのは適切で整頓されているかもしれませんが、一般的にはその哲学に同意しますが、多くのデッドロックが発生している場合は、トランザクションをより小さなトランザクションに分割してから、移動しながら、アプリケーションでステータスを確認してください。TRAN 1 - OK Y/N? Y の場合、TRAN 2 を送信 - OK Y/N? などなど
余談ですが、私が DBA であり、(数千人の同時ユーザーを測定するマルチユーザー DB アプリの) 開発者でもある長年の経験の中で、デッドロックがそれほど大きな問題であることに気付いたことは一度もありませんでした。レベルは意地悪など)。