2010年3月28日日曜日

[他]SQLServerの排他制御

SQLServerはトランザクションをかけると、共有ロックになります。

  • 更新ロック:他のトランザクションからUPDATE, DELETE不可
  • 排他ロック:他のトランザクションからSELECT,UPDATE, DELETE不可


先日、SQLServerで排他制御の実験をしてみました。実施すると、まさしく共有ロックの動作をしていました。

その方法は、SQL文にヒントをつける方法です。以下の組み合わせで実現します。

■ロックの範囲
  • ROWLOCK:行単位のロック
  • PAGLOCK:ページ単位のロック
  • TABLOCK:テーブル単位のロック


■ロックの方式
  • READPAST:ロック行をスキップして取得する(SELECTだけ)
  • UPDLOCK:他のトランザクションからSELECT不可にする
  • XLOCK:排他ロックを強制的に使用(PAGLOCK・TABLOCKのいずれかも指定)


たとえば、ORACLEのFor Update相当にしようとすると、こんな感じ。

SELECT * FROM T_HOGE WITH (ROWLOCK, UPDLOCK)


ほかには、ISOLATION LEVELを変更する方法があるらしいですが、コレは別途整理したいと思います。

0 件のコメント: