dポイントプレゼントキャンペーン実施中!

oracleのupdateについて

お世話になっております。
oracleのupdateについて教えてください。

(1)以下のような更新のupdateを実行し、
update dept set updt_flag=1 where id=1111;

(2)commitをする間に別ユーザが以下のupdateを実行したとします。
update dept set updt_flag=0 where id=1111;

上記のような状況を再現した際、
(2)のupdateは(1)のcommitが完了するまで待つという結果になりました。

ここで質問なのですが、
最初のupdateが完了するまで別のupdateは待っているというのが
暗黙のルールなのでしょうか?

初歩的な質問ですみません。
よろしくお願いいたします。

A 回答 (2件)

1文ずつのSQLではこの機構の大事さがピンと来ないかも知れませんね。



(1)のユーザが、updt_flagを1にした後、コミットされるまでに1になっていることを前提に
実施される処理を考えてみてください。
つまり、「updt_flag」を1にするSQLを実施している最中とか直後に、0に戻されている
可能性があるとしたら、

「updt_flag」を1にupdateする

行為そのものが信用出来なくなりませんか?

「1にしたけど、もしかしたら同時に0にされてるかもしれない」
「1にしたけど、もしかしたら同時に10にされてるかもしれない」

一々、Select文で「1のままだよね?」って確認したとしても、その確認の最中とか直後に
また同じ心配が発生しちゃいます。
常時監視するしかないですかね?変更があったら自動的に通知されるような仕組みを作る?
その通知を受け取ったら、「1にする処理が信用出来なくなった」として処理を変更?

・・めんどくさいというよりナンセンスですよね。

一連の処理(=「トランザクション」と言います)が完了して、じゃ、次の処理で「updt_flag」
(在庫数かもしれないし、許可フラグかも知れないし)を操作して良いよ、というところまで、
データは不変でなければいけません。
=「データの一貫性」が守られないとDBを使ったプログラム・操作が出来ませんのでデータを
ロックする(守る)必要がある、ということです。

ちなみに、ロックされているデータを使いたい方から見れば、ロックされてるか(フリーズした
みたいになっちゃいますから)知りたいって時は、(2)の
update dept set updt_flag=0 where id=1111;
のときに、

select updt_flag from dept where id=1111 for update nowait;

とすると、前の処理の完了(commitか、rollback)を待たずに、「ロックされてたよ」とエラー
を出して制御が戻ってきます。(試してみてください)
ORA-00054:リソース・ビジー、NOWAITが指定されていました。

10秒だけ待つ、なんて書き方も出来ます。
select updt_flag from dept where id=1111 for update wait 10;

一連の処理同士が開放を待ち合ったまま動けなくなるデッドロックや、ロックされている行数が
増えたら表全体のロックにエスカレーションしたり、Insert・Deleteの場合はとか・・ロック戦略
は奥が深いです。

↓この辺の用語を理解出来ると、その制御を実現するために不可欠な仕組みだという事が
理解出来るでしょう。
排他制御、ダーティ・リード、ファントム・リード、ACID特性

当然、これらの概念はDB共通です。

※すいませんがSQLは(合ってると思いますが)実際に検証してません。
 SQLのマニュアル参照してください。
    • good
    • 0
この回答へのお礼

こんばんは。
すごくご丁寧な回答、ありがとうございます。
初心者の自分も理解することができました。おっしゃる通り、一回一回確認していたのでは信用性が無くなってしましますね。
教えていただいた用語について、勉強してみます。
本当にありがとうございます!!

お礼日時:2010/11/19 23:29

>最初のupdateが完了するまで別のupdateは待っているというのが


>暗黙のルールなのでしょうか?
ルールではなくて、これがdbの一番重要な機能です。

仮に「(2)のupdateは(1)のcommitが完了するまでマタナイ」と updt_flag の値はどうなるのでしょうか? 不定な値を取るdbなど、誰も使わないと思います。
    • good
    • 0
この回答へのお礼

こんばんは、
ごかいとうありがとうございます。
ご指摘の通り、意味がないですね。。

お礼日時:2010/11/19 23:30

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!