- ベストアンサー
ロックの自然解除について調査中
- SQL Server 2008を使用している場合、SELECT~with(UPDLOCK)~などでレコードをロックした状態でクライアントプログラムが異常終了した場合に、ロックは自然に解除されるのか調査中です。
- 検索の結果、Oracleではロックが残ってしまうが、MySQLやSQL Serverではそうでもないという印象がありますが、具体的な根拠が見つかっていません。
- もしロックが自然に解除されない場合、対策を考える必要があるため、詳細な情報を求めています。
- みんなの回答 (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でも、基本的に同じです。) に記述があります。 二つを合わせると、アプリケーションが落ちた場合やネットワークが切断された場合は、トランザクションがロールバックされることにより、ロックも解除されると解釈できますが、どうでしょうか? 実際、挙動もこれであっていると思います。
その他の回答 (1)
- SaKaKashi
- ベストアンサー率24% (755/3136)
クライアントプログラムとDBサーバの物理的関係に依存します。 DBサーバとクライアントプログラムの動作しているPCが同じなら、クライアントプログラムが異常終了したらすぐにロック解放される。 DBサーバとクライアントプログラムの動作しているPCがネットワーク接続で異なるPCの場合、クライアントプログラムが異常終了してもDBサーバ側での認識はかなり送れる場合がほとんどで、たいていは、 DBサーバ側の設定にクライアントプログラムとの死活監視時間が設定可能で、この死活監視時間が過ぎてもクライアントプログラムが応答しなければクライアントプログラムの異常終了を認識してロックが解除されます。 どのDBでもロックが解除されないと言うことはないはず。ですが、バグはありますけどね。
お礼
死活監視→Keep Aliveだと思い検索したところ、SQL Serverの挙動についてはいろいろ出てきました。 TCP/IPの接続の監視を、SQL Serverの2000では2時間、2008では30秒でやっているようです。 ありがとうございます。
お礼
ありがとうございます。 ネットワーク切断がロック解除につながる事の文書のエビデンスを得ることができました。 (ただしKeepAliveの設定が長いと解除までに時間がかかる事はある)