私はウィンドウズ/マックタイプの議論を始めるつもりはありません。
個人的には、NOLOCK
は再帰的な実践としては良い考えではないという説得は必要ありません。すべてを開発しているときは、反動的ではなく意図的である必要があります(/ amen)
だから...担当プログラマはNOLOCK
が進むべき道だと主張するすべてのアドホッククエリ、およびプロダクションをクエリするときは常に推奨します。すべてのテーブルにnolockヒントがないストアドプロシージャを見たことがありません。
それをバックアップする何かがなければ、コアの信念はすべて間違っていると言ってやって来るその人になりたくない。
さまざまなブログ投稿の下にあるコメントセッションを見るだけでは、リンクを送信するだけでは不十分な場合があります。長年の信念など...それが問題だと確信していない人もいます。参照:私が読んだすべてのnolockブログ投稿の下のコメントセクション。
現在、一部の他のDBAは、不可解なデッドロックに取り組んでいます。 NOLOCKがソースであるかどうかをどのように判断しますか?
トレースなどからXMLを見ることをお勧めしますが、これはデッドロックが問題の原因であることを明示的に述べていませんか?単純なエラーメッセージは見たことがありません。本当?
他にどのようにこれらのデッドロックをこれに固定することができますか?
CREATE
のようなDDLステートメントが手掛かりになります。アラームを上げる前に私の理論を裏付けるのに役立つ、私が指すことができる出力や見つけられるデータの一部はありますか?
または、トレースフラグまたは拡張イベントを実行して、デッドロックが発生したときに何が実行されているかを特定し、DDLステートメントから推定していますか?
Nolockのヒントでデータがめちゃくちゃになるさまざまな方法をすべて見ると、決定的にピン留めするのは難しい問題のようです。
担当アーキテクトが
NOLOCK
を主張する方法が進むべき道であると主張しています。すべてのアドホッククエリ、およびプロダクションをクエリするときは常に推奨します。すべてのテーブルにnolockヒントがないと、sprocを見たことがありません。
申し訳ありません。これは、SQL Serverの専門家の間でアンチパターンとして広く一般的に見なされていますが、実際に根付いていて、1人の誠実で深い信念に基づいている場合は、現場で事実を変更する方法はありません。 。
「リンクを送信するだけでは十分ではない」という質問ですが、代わりに何を望んでいるかは不明です。私たちはここで答えに世界で最も説得力のある議論を書くことができ、それでもあなたはそれへの「リンクを送る」ままにされるでしょう。結局のところ、ここの誰も、特定の状況(ある場合)で成功する引数のセットを知ることはできません。
それでも、以下は、一部の人々が以前の一般的な慣習を変更するのに十分説得力があると思うほとんどのポイントをカバーしています:
NOLOCK
everywhere の配置NOLOCK
ヒント&他の貧弱なアイデア By David Lean(Microsoft)それでも、この戦いに「勝つ」ことができない場合があります。私はこれを行う環境で作業し、リスクとそれを行わない理由を理解しましたが、とにかくそれを続けました。これらは明るく論理的な人々でしたが、結局それは私が幸せに働くことができない環境でした。
現在、一部の他のDBAは、不可解なデッドロックに取り組んでいます。
NOLOCKs
がソースであることをどのように判断するのですか?.
デッドロックの発生率を削減するためにNOLOCK
ヒントが導入されるという、より一般的なパターン(おそらく以前は普及していた) 。これにより、共有ロックの数を減らすと自然に互換性のないロックが行われる可能性が減りますが、根本的な問題に対する適切な解決策ではなく、前のセクションで説明したすべての警告が伴うため、「うまくいく」可能性があります。
それにもかかわらず、NOLOCK
ヒントcanは、デッドロックの新しい方法を導入します。コミットされていない読み取りの分離を使用すると、単に競合が別のポイントで発生するため、一時的なブロッキング状態(競合するリソースが利用可能になると解決)を解決できないデッドロック(どちらのウェイターも進行できない)に削除できます。異なる順序での書き込み操作が重複しています。デイブバランタインはここに例があります:
NOLOCK
によるデッドロックの増加デッドロックの処理に関するより一般的なアドバイスについては、出発点として以下をお勧めします。
また、ドキュメントをよく理解する必要があります。
その他の役立つリソース: