Pro*Cでのfor updateとは?

このQ&Aのポイント
  • Pro*CのSQL文中にあるselect ・・・for update (イ)とは、SQL文を実行した後に該当のデータをロックすることを意味します。
  • Pro*Cでのfor updateを使用した場合、プログラムを抜ける際にcommitやrollbackを行わなくても動作します。
  • Pro*Cのオススメな本については、まだ特定の本を見つけていませんが、オンラインリソースや他の開発者のソースコードを参考にすることができます。
回答を見る
  • ベストアンサー

Pro*Cでのfor update

こんばんは。 質問させてください。 Oracle9 Pro*Cで開発しておりますが、SQL文の中で select ・・・for update (イ) と書いた場合、そのプログラムを抜けるときとかに あえてcommitとかrollbackとかしなくても 問題なく動くっぽいんですけど そういうものですか? 問題なく動くというのは (イ)のあとにsleep入れて、SQL*Plusで(イ)で選択されるデータにupdateをかけると プログラムが終わるまで待ってて、終わったらSQL*Plusのupdateが正常に行われる。ということです。 初歩的な質問ですみません。 ついでにもう一つ。 Pro*Cのオススメな本とか、あったら教えてください。 本が何もなく、人のソースとか参考にしながら感覚でここ半年やってきましたが やっぱり本が欲しい。。と思うようになりました。 二つも質問してすみませんが、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

Oracleは使ったことがありませんが、 通常データベースは、 更新処理の途中で何かに失敗した時 例えば Aと言う処理をした Bと言う処理をした Cと言う処理で正しく処理できなかった とかいう時、 処理としては、A、B、C一連の処理が正しく行われた時がデータベースとして整合が取れている状態で CだけがウマくいかなかったからCだけ止めるということができないような処理があります。 こう言う時には、AやBの処理もなかったことにするということをします。 これが、ロールバックです。 ロールバックと言っても、いつの時点まで戻せばいいかわからないので、通常、前にコミットされた状態まで戻します。(プログラムを開始してから一度もコミットされていなければプログラム開始時まで戻すわけです) プログラムが正常に終了した場合は、プログラムによって自動的にコミットされると思われますが、 通常1つの(単位の)処理が終われば、コミットします。そうすることで、次に何か失敗した時にそこまで戻ることができるからです。 もし、あらゆる更新をやって、最後までコミットしないなら、なんらかの原因でロールバックが起こった時最初まで戻ってしまいます。 そうすると、その間正常に終了していた処理までもムダになってしまいます。 また、そのように、データベースがロールバックできる状況にあるということは、他のプログラムから更新されないようロックされているということでもあります。そのため、1つの単位となる処理が終われば通常コミットを行います。 私は、オラクルを使ったことはないので、本についてはわかりません。

sawasuke
質問者

お礼

丁寧な回答をありがとうございます。 結局、コミット、ロールバックを 今回修正したプログラムでは記述しないことになりました。 今日テストしましたが、やっぱり問題ないみたいです。 ありがとうございましたーーー。

関連するQ&A

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

  • DB2でSelectした時(rollback,commitの必要性)

    Oracleでの開発が長く、DB2は初めてなので戸惑ってます。 OracleでSelect文を発行する時はトランザクション処理が発生しているわけではないので、rollbackやcommitはしないのですが、DB2を使った今回のシステムではselectをした後でrollbackやcommitを使用するように設計書記述がされています。 必要ないような気がするのですが、DB2ではSelectでも必須なのでしょうか? ご回答よろしくお願いします。

  • Pro*C/C++について

    今回OracleのデーターベースにはC言語でアクセスするということで、 Pro*Cを使ってSQL文をCに埋め込むということなのですが今例文なんかを探しています。 なにかいいホームページがあれば教えていただけないでしょうか? またいいPro*Cについての参考書もあればぜひ教えてください。 よろしくお願いします。

  • ACCESSでのUPDATEコマンド

    現在ASPとACCESSを使用して、開発を行っています。 ORACLEでの開発経験はあるのですが、SQLServerやACCESSでの経験がなく微妙にことなるSQLに困惑しています。 ORACLEではUPDATE時に他のテーブルからデータを参照して更新できると思いますがACCESSで同じようなことはできるのでしょうか?実行したいのはORACLEでいう、以下のようなSQLです。 SQLを2回に分けて実行すれば同じことはできるのですが・・・。 UPDATE TAB_A SET (A,B) = (SELECT A1,B1 FROM TAB_B WHERE C1='10') WHERE C = '10'; 宜しくお願いします。

  • select実行時のロックとcommitについて

    お世話になっております。 WEB上で検索すると、select実行時にもロックを取得しcommitもしくはrollbackを実施していることがわかりました。 そのことについて数点疑問を持ち調査したのですが、わかりませんでした。 どなたかわかる方ご教示ください。 (1) select発行時にロックを取得しcommitもしくはrollbackするという認識は正しいでしょうか。 (2) 通常SQLに不備が無ければselectは正常に終了すると思いますが、 rollbackするのはどのような状況でしょうか。 selectのSQLに不備があった場合でしょうか。 (3) コンソールからselectを発行するとcommitせずとも結果が出力されます。 このcommitされるタイミングはいつになるのでしょうか。 (4) WITH URオプションを使用するとロックを取得しないと思いますが、 ロックを取得しないということはcommit/rollbackも実施されないという認識は正しいでしょうか。 (5) commitコマンドを発行するとアクティブログに追記されるという認識なのですが、 WITH URオプションなしでselect文を発行してもアクティブログに追記されるものでしょうか。 それともテーブルの更新など実施しないので、アクティブログは更新されないのでしょうか。 (6) WITH URオプションをつけてSELECTを実施した場合はアクティブログは更新されないでしょうか。 (7) EXPORTコマンドを実行した場合も(5)(6)と同様という認識で正しいでしょうか。 以上になります。 よろしくお願いいたします。

  • Visual Studio C++ と Pro*C/C++について

    Visual Studio 2008とPro*C/C++を使ってOracleのDBを操作するシステムを考えています。 Oracleのバージョンは10gを予定しています。 Visual Studioが最新バージョンのため、Pro*C/C++のプリコンパイ ラがサポートしていないという懸念があります。 問題ないでしょうか? もし問題があればOracleを11gもしくは、Visual Studioを2005にすれ ばいいでしょうか? 教えてください。 よろしくお願いします。

  • ROWID型の宣言について(Pro*C)

    (Oracle9i) Pro*Cにて、ROWIDを使用したSELECT&INSERTをしたいのですが、 ホスト変数をROWID型で宣言しようとするとエラーになります。 [PCC-S-02201, 記号"rowid"が見つかりました。 次のうちの1つが入るとき~] 宣言の仕方は以下の通りです。  EXEC SQL BEGIN DECLARE SECTION;   rowid fetch_ROWID;   short fetch_ROWID_ind;  EXEC SQL END DECLARE SECTION; ROWIDという型はORACLEにあるので、なぜプリコンパイルが通らないのか 分かりません。 どなたかお分かりになる方がいらっしゃいましたらよろしくお願いいします。 ちなみに以下のような使い方をしようとしていますので、参考までに 載せておきます。  EXEC SQL DECLARE C_XXX CURSOR FOR   SELECT ・・・,ROWID FROM XXX FOR UPDATE ・・・  EXEC SQL OPEN C_XXX;  EXEC SQL WHENEVER NOT FOUND DO break;  while(1){   EXEC SQL FETCH C_XXX INTO    ・・・,    :fetch_ROWID:fetch_ROWID_ind;   EXEC SQL    UPDATE XXX    SET ・・・    WHERE ROWID=:fetch_ROWID:fetch_ROWID_ind;  }

  • oracleのupdateについて

    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は待っているというのが 暗黙のルールなのでしょうか? 初歩的な質問ですみません。 よろしくお願いいたします。

  • SELECT FOR UPDATE について

    ■SELECT FOR UPDATEとは、 複数のプログラムで在庫の更新などが行われる場合に、 使用するべきでしょうか? ■SELECT FOR UPDATEのロック期間は、他の更新が待たされるのは 下記2.~3.の間でしょうか? バッチ更新(5分) 1.トランザクション開始 2.SELECT FOR UPDATE 3.UPDATE 4.トランザクション終了 ■上記2.のSELECT FOR UPDATEがおこなれた時点のレコードに対し、  他の場所でSELECT FOR UPDATEした場合、  上記2.の時点のデータがSELECTされるのでしょうか?  それとも、上記3.が終わるまでSELECTを待つのでしょうか? DBは、MySQL5ですが、DB問わず同じ挙動と思い、 このカテゴリに質問されていただきました。

  • Pro*Cの大文字小文字

    こんにちは。 現在Oracle9 Pro*Cで開発をしているのですが、下記のSQLが変です。 どう変かというと・・・ (1)EXEC SQL SELECT ABC FROM DB1 WHERE A_NUM = '1'; (2)EXEC SQL SELECT abc FROM DB1 WHERE A_NUM = '1'; (3)EXEC SQL SELECT Abc FROM DB1 WHERE A_NUM = '1'; 元々(1)のように記述してありました。 それがある日突然データがあるのにNotFoundになって、ためしに項目名ABCをabcに変えたところ、なぜだかselectできるようになりました。 しかし(2)も今日突然データがあるのにNotFoundになり、(3)のようにAbcにかえたところ、selectできるようになりました。 大文字小文字は関係ないと誰に聞いても言われるのですが、実際今は(3)でないと同じデータでもselectできません。 今はこれでいいですが、この調子で行くときっといつか(3)でもselectできなくなり、aBcとかにしなくてはいけない日が来ると思うのです。 なんででしょう? 環境の問題とかでしょうか? 何か分かる方がいたら、よろしくお願いします。

専門家に質問してみよう