2014-03-01

【SQLServer】NOLOCKで行の欠落・重複が発生?

SQLServerは、トランザクション分離レベルの設定によっては、
SELECTでも共有ロックを取得するので、単なるSELECTでも共有ロック取得待ち
となる事がある。

一覧表示の機能などで参照のみの場合、ダーティリードしてもいいのならば
WITH(NOLOCK)ヒントをつければ解消されるが、 NOLOCKで参照すると
行の欠落、重複が発生する可能性がある。
(参考: http://support.microsoft.com/kb/975782/ja

NOLOCKでのSELECT中に、INDEXに含まれる項目の更新が発生して、
INDEXのページ分割が行われると、行の欠落や重複が起こる可能性があるらしい。
(クラスタ化でも非クラスタ化でも起こる)

そもそもNOLOCKをつける場合は、ダーティリードが発生してもいい場合なので
行の欠落はまだ許せる可能性もあるけど、行の重複が発生すると
取得したデータの保持で、キー重複が発生して、アプリが落ちる可能性があるため
NOLOCKを使用する場合は注意が必要。

と、いっても対処方法はないので、問題がある場合は、
READ_COMMITTED_SNAPSHOT オプションをONにするか、NOLOCKを使わないか
しかなさそう。








0 件のコメント:

コメントを投稿