こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

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)どちらのタイミングですか?
また、このロックは
・他トランザクションから読めるけど更新できない
・他トランザクションからは読むことすらできない
のどちらでしょうか?

よろしくお願いします。

投稿日時 - 2014-08-24 15:39:36

QNo.8728698

困ってます

このQ&Aは役に立ちましたか?

12人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.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

投稿日時 - 2014-09-01 10:27:20

ANo.1

こんにちわ。

> id = 1のレコードがロックされるのは(a)、(b)どちらのタイミングですか?
レコードがロックされるのは、(a) のタイミングです。

> また、このロックは
> ・他トランザクションから読めるけど更新できない
> ・他トランザクションからは読むことすらできない
他のトランザクションから読み込めますが、更新はできません。
また、(b) のupdate を実行しても、commit が完了するまでは
他のトランザクションからはUpdate 前のデータが読込まれます。

投稿日時 - 2014-08-28 10:14:48

お礼

ありがとうございます。

ちなみに、そのソースはどこかにありますでしょうか?
決して疑っているわけではなくて、
別の人を説得しなければいけないのです。

もうひとつ、(a)からcommitの間で、別のトランザクションが、
同じようにselect ~ for update を行うとエラーになりますよね?

投稿日時 - 2014-09-01 08:48:52

あなたにオススメの質問