- ベストアンサー
Oracleのupdateについて
- Oracleのupdateについて教えてください。質問文章の内容をまとめると、最初のupdateが完了するまで別のupdateは待っているというのが暗黙のルールなのでしょうか?
- 質問文章では、Oracleのupdateに関する状況の再現と、待ち時間についての質問がされています。
- 要約文章では、Oracleのupdateについての基本的な説明と、同時に実行されるupdateの待ち時間についての疑問がまとめられています。
- みんなの回答 (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のマニュアル参照してください。
その他の回答 (1)
- gtx456gtx
- ベストアンサー率18% (194/1035)
>最初のupdateが完了するまで別のupdateは待っているというのが >暗黙のルールなのでしょうか? ルールではなくて、これがdbの一番重要な機能です。 仮に「(2)のupdateは(1)のcommitが完了するまでマタナイ」と updt_flag の値はどうなるのでしょうか? 不定な値を取るdbなど、誰も使わないと思います。
お礼
こんばんは、 ごかいとうありがとうございます。 ご指摘の通り、意味がないですね。。
お礼
こんばんは。 すごくご丁寧な回答、ありがとうございます。 初心者の自分も理解することができました。おっしゃる通り、一回一回確認していたのでは信用性が無くなってしましますね。 教えていただいた用語について、勉強してみます。 本当にありがとうございます!!