こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

ロックの自然解除について

SQL Server 2008 を使用しています。

SELECT~with(UPDLOCK)~ などでレコードをロックした状態でクライアントプログラムが
異常終了した場合に、ロックが自然に解除されるかどうかについて調べているのですが、
ネットで検索しても答えは見つかりませんでした。

実験ではクライアント側のLANケーブルを抜けばロックが解除されたので、「自然に解除
される」が結論だとは思うのですが、文書のエビデンスが欲しいです。

検索の過程で得た印象では、「Oracleではロックが残ってしまうが、MySQLやSQL Serverでは
そうでもない」という感じなのですが、
 (1)Oracleではそうなる、という根拠
 (2)SQL Serverではそうならない、という根拠
 (3)またはその印象が間違っているという指摘
があったら教えてください。
よろしくお願いします。

自然に解除されないのであれば対策を作らなければならないので、調べています。

投稿日時 - 2010-12-06 12:06:16

QNo.6366345

困ってます

質問者が選んだベストアンサー

 SQL Serverのロック機構は、トランザクション境界内で実行されます。
 http://technet.microsoft.com/ja-jp/library/ms186690%28SQL.90%29.aspx(2005の記事ですが、2008でも基本的に同じです。)
 
 さて、トランザクション制御は、セッション制御と絡み合いますが、事故によりセッションが切断された場合は、トランザクションはロールバックされます。この処理は、
 http://technet.microsoft.com/ja-jp/library/ms175523%28SQL.90%29.aspx(同じく2005の記事です。が、2008でも、基本的に同じです。)
 に記述があります。

 二つを合わせると、アプリケーションが落ちた場合やネットワークが切断された場合は、トランザクションがロールバックされることにより、ロックも解除されると解釈できますが、どうでしょうか?

 実際、挙動もこれであっていると思います。

投稿日時 - 2010-12-06 22:05:56

お礼

ありがとうございます。
ネットワーク切断がロック解除につながる事の文書のエビデンスを得ることができました。
(ただしKeepAliveの設定が長いと解除までに時間がかかる事はある)

投稿日時 - 2010-12-08 15:53:38

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

クライアントプログラムとDBサーバの物理的関係に依存します。
DBサーバとクライアントプログラムの動作しているPCが同じなら、クライアントプログラムが異常終了したらすぐにロック解放される。
DBサーバとクライアントプログラムの動作しているPCがネットワーク接続で異なるPCの場合、クライアントプログラムが異常終了してもDBサーバ側での認識はかなり送れる場合がほとんどで、たいていは、
DBサーバ側の設定にクライアントプログラムとの死活監視時間が設定可能で、この死活監視時間が過ぎてもクライアントプログラムが応答しなければクライアントプログラムの異常終了を認識してロックが解除されます。
どのDBでもロックが解除されないと言うことはないはず。ですが、バグはありますけどね。

投稿日時 - 2010-12-06 12:45:34

お礼

死活監視→Keep Aliveだと思い検索したところ、SQL Serverの挙動についてはいろいろ出てきました。
TCP/IPの接続の監視を、SQL Serverの2000では2時間、2008では30秒でやっているようです。
ありがとうございます。

投稿日時 - 2010-12-08 15:52:51

あなたにオススメの質問