• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ロックの自然解除について)

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

このQ&Aのポイント
  • SQL Server 2008を使用している場合、SELECT~with(UPDLOCK)~などでレコードをロックした状態でクライアントプログラムが異常終了した場合に、ロックは自然に解除されるのか調査中です。
  • 検索の結果、Oracleではロックが残ってしまうが、MySQLやSQL Serverではそうでもないという印象がありますが、具体的な根拠が見つかっていません。
  • もしロックが自然に解除されない場合、対策を考える必要があるため、詳細な情報を求めています。

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

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.2

 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でも、基本的に同じです。)  に記述があります。  二つを合わせると、アプリケーションが落ちた場合やネットワークが切断された場合は、トランザクションがロールバックされることにより、ロックも解除されると解釈できますが、どうでしょうか?  実際、挙動もこれであっていると思います。

programmer38
質問者

お礼

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

その他の回答 (1)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

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

programmer38
質問者

お礼

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

関連するQ&A