今回は、NOLOCKオプションについて、いくつか書いてみたいと思う。
■効果
あるテーブルがUPDATEされ、COMMIT待ちの状態であるが、
NOLOCKオプションをつけると、COMMIT前のデータがSELECTできてしまう。
つまり、複数のセッションで処理する場合、待ち時間がなくなるため
パフォーマンスアップにつながるわけである。
■弊害
COMMIT前のデータが読めるというのは、ダーティリードとも呼ばれる。
何が問題かというと、ROLLBACKされたときに、読み取ったデータが
存在しなくなるということである。または存在しても異なっている場合がある。
取得した値を利用して、処理をしてみたが、あるタイミングで、その値は
無効なものとなっている。前提が崩れているとすれば処理結果も信用できない。
また、NOLOCKオプションを付ける前だと、ロック待ちとして排他されていたが
付けた後だと、同時実行されるようになり、整合性に問題がでる場合がある。
■使用場所
①別記「SQLSERVER デットロックを防ぐ」にあるように、デットロック回避に使う。
→NOLOCKオプションでSELECT後、一意キーでアクセスすることにより、
ロック範囲を狭めるのと、整合性の確認、パフォーマンスアップにつながる。
②ROLLBACKがほぼなく、パフォーマンスアップしたい箇所につかう。
または、ROLLBACKされても整合性に問題が起きない箇所。
在庫データの参照など、ダーティリード時の影響が大きい箇所などには適用せず
リスクが比較的少ない箇所から実験するのもひとつの手である。
0 件のコメント:
コメントを投稿