none
NOLOCKの正しい使い方 RRS feed

  • 質問

  • SQLSERVER初心者ですが、業務アプリケーションで複雑なSQL文

    を発行するとSQL文自体がデットロックになるので、NOLOCKを使うと

    ロックが発生しません。

    いろいろ調べていたら、SQLSERVERはSELECT文でテーブルをロックするように

    なっているみたいですね????これでレスポンスも低下するのではと思います。

    なので、更新処理と関係なく参照系のSELECT文で無条件でNOLOCKを使うように

    規約を決めたいと思っておりますが、NOLOCKはなにか悪い影響しないですよね

    NOLOCKの正しい使い方をご存知の方、ご指摘いたただけますでしょうか

    2007年3月5日 11:05

すべての返信

  • >いろいろ調べていたら、SQLSERVERはSELECT文でテーブルをロックするようになっているみたいですね????これでレスポンスも低下するのではと思います。

    ロックするのではなく、ロック待ちします。

    http://www.microsoft.com/japan/sql/ssj/tips/02.mspx

    この辺を読んでみてください。

    http://www.microsoft.com/japan/sql/facts/compare/03.mspx

    NOLOCKはダーティーリードが発生します。

    それでいいならいいかもしれません。

    2007年3月5日 11:30
  • SQL Server 2005 の場合はスナップショット分離レベルが使えるので NOLOCK ヒントを書く必要はありません。
    ただし tempdb をチューニングしないと大変なことになりますが。
    2007年3月5日 11:59
  • 仕様にもよるでしょうが、そんな規約作ったらどエライ事になりませんか?
    中さんが仰っているように NOLOCK にするとダーティリードが発生しますし、反復読み取りするならデフォルトの分離レベルも不可になります。
    規約を作るなら逆に「とりあえず分離レベルは最強にしておく。問題なければ下げていく」の方が良いように思います。
    2007年3月5日 12:45
  • 各位

    ご指摘、ありがとうございました。

    なるほど、よくわかりました。

    非常に危ないことやるとしていました。

    2007年3月8日 1:48