• 締切済み

select for updateのロック

オラクルのselect for updateでロックをするタイミングがいつですか? こんなPL/SQLのコードがあったとします。 ---↓↓↓ソースコードここから↓↓↓------------------------- select * from テーブル1 where id = 1 for update; ・・・・・(a) ~ update テーブル1 set kingaku=100 where id = 1 ・・・・・(b) ~ commit; ---↑↑↑ソースコードここまで↑↑↑------------------------- id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか? また、このロックは ・他トランザクションから読めるけど更新できない ・他トランザクションからは読むことすらできない のどちらでしょうか? よろしくお願いします。

みんなの回答

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 #1 のmuyoshid です。 > ちなみに、そのソースはどこかにありますでしょうか? この辺が参考になるでしょうか? SQL 言語リファレンスのfor update 句の説明です。 http://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_10002.htm#i2066346 > 別の人を説得しなければいけないのです。 そうであれば、ユーザ登録が必要ですがOTN Japan から試用版をDownload して 実際に動かして確認した方が良いと思います。

参考URL:
http://www.oracle.com/technetwork/jp/index.html
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 > id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか? レコードがロックされるのは、(a) のタイミングです。 > また、このロックは > ・他トランザクションから読めるけど更新できない > ・他トランザクションからは読むことすらできない 他のトランザクションから読み込めますが、更新はできません。 また、(b) のupdate を実行しても、commit が完了するまでは 他のトランザクションからはUpdate 前のデータが読込まれます。

trap1130
質問者

お礼

ありがとうございます。 ちなみに、そのソースはどこかにありますでしょうか? 決して疑っているわけではなくて、 別の人を説得しなければいけないのです。 もうひとつ、(a)からcommitの間で、別のトランザクションが、 同じようにselect ~ for update を行うとエラーになりますよね?

関連するQ&A