- 締切済み
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)どちらのタイミングですか? また、このロックは ・他トランザクションから読めるけど更新できない ・他トランザクションからは読むことすらできない のどちらでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 #1 のmuyoshid です。 > ちなみに、そのソースはどこかにありますでしょうか? この辺が参考になるでしょうか? SQL 言語リファレンスのfor update 句の説明です。 http://docs.oracle.com/cd/E16338_01/server.112/b56299/statements_10002.htm#i2066346 > 別の人を説得しなければいけないのです。 そうであれば、ユーザ登録が必要ですがOTN Japan から試用版をDownload して 実際に動かして確認した方が良いと思います。
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 > id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか? レコードがロックされるのは、(a) のタイミングです。 > また、このロックは > ・他トランザクションから読めるけど更新できない > ・他トランザクションからは読むことすらできない 他のトランザクションから読み込めますが、更新はできません。 また、(b) のupdate を実行しても、commit が完了するまでは 他のトランザクションからはUpdate 前のデータが読込まれます。
お礼
ありがとうございます。 ちなみに、そのソースはどこかにありますでしょうか? 決して疑っているわけではなくて、 別の人を説得しなければいけないのです。 もうひとつ、(a)からcommitの間で、別のトランザクションが、 同じようにselect ~ for update を行うとエラーになりますよね?