SSブログ

SQL Server によるアプリケーションロック(sp_getapplock) [SQL Server]

SQL Serverにはロック情報を取るためのsys.dm_tran_locksというDMVがあります。
(DMVはSQL Server内部の情報を調べるためのビューだと思って下さい)
http://msdn.microsoft.com/ja-jp/library/ms190345.aspx

ロックには通常よく気にするキー値やページ、テーブル、データベース等がありますが、
上記のSQL Server オンラインブックには

「APPLICATION アプリケーション固有のリソースを示します。」

という記述があります。
これが何を示しているのかわからなかったのですが、APPLICATIONという種類のロックについて調べて見ました。結論から言うと、このロックはsp_getapplock というストアドプロシージャを実行することで獲得できるロックでした。
ロックのリリースはトランザクションを終了するか、sp_releaseapplockを呼び出します。
http://msdn.microsoft.com/ja-jp/library/ms189823.aspx

例えばこのように使います。

begin tran
exec sp_getapplock @resource='test',@lockmode='Exclusive';
exec sp_releaseapplock @resource='test';
commit tran

このスクリプトを2つ、SSMSから1行づつ実行すると、最初のセッションが獲得したAPPLICATIONロックを
2つめのセッションが待つ動作を見ることができます。
そのときのsys.dm_tran_locksの抜粋です。
request_statusがWAITになっている行があります。

resource_type resource_description request_mode request_type request_status
-------------- --------------------- ------------- ------------- ---------------
APPLICATION 0:[test]:(1c386f07) X LOCK GRANT
APPLICATION 0:[test]:(1c386f07) X LOCK WAIT

これをどう利用するかですが、C++等でマルチスレッドプログラムを作ると、
クリティカルセクションを使うことがあると思います。
http://msdn.microsoft.com/en-us/library/ms682530%28VS.85%29.aspx

APPLICATIONロックは同じように使えると思います。
あるT-SQLのコードは必ず1つのセッションでしか通って欲しくない、といった要件があれば
sp_getapplockを使って制御が可能かと思います。
ただし、ロックを獲得するので、同時実行性能が下がる可能性があります。

スポンサードリンク




nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:仕事

nice! 0

コメント 0

コメントを書く

お名前:[必須]
URL:[必須]
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。