2012年12月9日日曜日

SQLSERVER NOLOCKオプションの有効性

今回は、NOLOCKオプションについて、いくつか書いてみたいと思う。

■効果
あるテーブルがUPDATEされ、COMMIT待ちの状態であるが、
NOLOCKオプションをつけると、COMMIT前のデータがSELECTできてしまう。

つまり、複数のセッションで処理する場合、待ち時間がなくなるため
パフォーマンスアップにつながるわけである。

■弊害
COMMIT前のデータが読めるというのは、ダーティリードとも呼ばれる。
何が問題かというと、ROLLBACKされたときに、読み取ったデータが
存在しなくなるということである。または存在しても異なっている場合がある。

取得した値を利用して、処理をしてみたが、あるタイミングで、その値は
無効なものとなっている。前提が崩れているとすれば処理結果も信用できない。

また、NOLOCKオプションを付ける前だと、ロック待ちとして排他されていたが
付けた後だと、同時実行されるようになり、整合性に問題がでる場合がある。

■使用場所
①別記「SQLSERVER デットロックを防ぐ」にあるように、デットロック回避に使う。
 →NOLOCKオプションでSELECT後、一意キーでアクセスすることにより、
  ロック範囲を狭めるのと、整合性の確認、パフォーマンスアップにつながる。

②ROLLBACKがほぼなく、パフォーマンスアップしたい箇所につかう。
 または、ROLLBACKされても整合性に問題が起きない箇所。

在庫データの参照など、ダーティリード時の影響が大きい箇所などには適用せず
リスクが比較的少ない箇所から実験するのもひとつの手である。



 

0 件のコメント:

コメントを投稿