- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:パススルークエリでのロックについて)
パススルークエリでのロックについて
このQ&Aのポイント
- SQLSERVER2000とACCESS2003を使用して、画面から抽出条件を入力し、パススルークエリを実行するプログラムの作成方法を教えてください。
- パススルークエリはSELECT文で、サブクエリが多くあり、FROM句にはたくさんのテーブルが入ります。他端末で実績入力中でも問題なく実行・画面表示したいです。
- SELECT文でもロックが発生することを知りましたが、ロックを起こさずに他端末での実績入力と画面表示を行う方法はありますか?
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
誤解があるかな、と思うのは、 リンク先で話題になっているのは、OracleでFOR UPDATE句を付けてSELECTした場合であるということです。 FOR UPDATE句を付ければ、「更新前提に」SELECTしていることになるので更新ロック(に昇格可能なロック)がかかりますが、つけなければロックはかかりません。 SQL Serverの場合はテーブルヒントを付けないとこのようなSELECTはできないので、今回のパススルークエリに関しては「SELECTがロックしないようにする」というふうに考える必要はないと思います。 ただ、並行して行われている更新処理がレコードをロックした場合、SELECTは待ちがかかりますので、更新処理は極力短時間で行うようにする必要があると思います。 (分離レベルを変更してダーティリードすれば待ちませんが、さすがにお勧めしません)
その他の回答 (1)
- jamshid6
- ベストアンサー率88% (591/669)
回答No.2
おおむね正しいです。 (超厳密な議論までは必要ないでしょう) 補足するとしたら、 ・トランザクション分離レベルについては、通常は下から2番目のREAD COMMITTEDになっていて、COMMITしていない更新はSELECTでは読み取らないけれども、COMMITされれば即反映するので、今SELECTしたものが次SELECTしたものと同じという保証はないこと ・OracleとSQL Serverとではロックのメカニズムは同じではないこと くらい認識していればいいかと思います。
質問者
補足
回答ありがとうございます。 頭の中がすっきりしました。 補足いただいた内容についても勉強していきたいと思います。
補足
回答ありがとうございます。 今回もお世話になります。 回答いただいた内容について、また、ロックについて勉強しました。 テーブルヒント、分離レベルのところでかなり混乱していますが、 今の時点の私の理解を以下にまとめました。 パススルークエリをSQLSERVERで実行するときに共有ロックが かかり、結果をACCESSに返すときにロックが外れる (結果が画面に表示されるときにはもうロックが外れている)。 共有ロックは排他ロックをブロックするので、 SELECT文が実行されているとき、他端末での実績入力はWAITになる (が、実行されている時間だけなのでとても短い時間になる)。 他端末が更新している場合はその排他ロックが外れるまでSELECT文はWAITになる(更新が完了するまでなのでわりと待たされる場合もある)。 どちらにしてもWAITになるだけなので、 SELECT文ではロックは起こらない。 このような理解にいたりましたが、正しいでしょうか。 よろしくお願いします。