VB初心者のための行ロックの方法 | Oracle9i 9.2.0 | VB6.0 | oo4o

このQ&Aのポイント
  • VB初心者のために、VBアプリで参照したデータに行ロックをかける方法について教えてください。
  • 「FOR UPDATE NOWAIT」を記述する場合のVBの記述方法やVBのロック管理の方法について教えてください。
  • エラーメッセージ「エラーコード54、リソースビジーです~」が表示されます。エラーコードを返す方法について教えてください。
回答を見る
  • ベストアンサー

行ロックをかけたい

DB環境:Oracle9i 9.2.0 言語 :VB6.0 ミドルウェア:oo4o VB初心者です。 VBアプリで参照したデータに行ロックをかけて次に参照した場合はエラーメッセージを出したいです。 その為にSELECT文で「FOR UPDATE NOWAIT」をかけるようにしました。すると次のコードで落ちてしまいます。 Set recSet = OraDatabase.CreateDynaset(ps_SQL, ORADYN_READONLY) 'レコードセットオープン エラーメッセージ「エラーコード54、リソースビジーです~」 とりあえずはエラーコードを返すようにできればOKだと思うのですが。。 「FOR UPDATE NOWAIT」を記述する場合のVBの記述方法やVBのロック管理の方法などいい方法がございましたらアドバイスお願い致します。

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

  • ベストアンサー
  • PrintScree
  • ベストアンサー率25% (538/2091)
回答No.1

VB + oo4oでのプログラミングは数年前にやったきりなので詳細は忘れましたが、On Error Resume Nextでエラー時の停止を解除し、CreateDynasetの次のステップでエラー判定を行います。 エラー判定では、VBの通常エラーをまず判断してからoo4oのエラー判定を行い排他チェックを行えばよかったはずです。 詳細はoo4oのヘルプに載っているはずですので根気よく探してみてください。

関連するQ&A

  • ORACLE9i  行ロック情報を取得する方法

    複数のクライアントから同一テーブルの同一レコードに対してselect for update nowaitで行ロックをした場合に先にロックした方が行をロックし後のロックはロック中のエラーにりますが、このとき、誰(マシン名etc)がどの位時間ロックしたままかわかる方法はないものでしょうか。

  • DELETE文とロックについて

    DELETEしようとしているレコードがロックされている場合は、削除せず すぐに処理を戻したいです。イメージ的にNOWAITが最適と思い →DELETE FROM テーブルA WHERE カラムA = 'A' NOWAIT としたいところですが、NOWAITはSELECT文でしか指定できないとのことなのでNGです。 SELECT文で抽出した条件のレコードを削除する場合 →DELETE FROM テーブルA WHERE カラムA =      (SELECT カラムA FROM テーブルA WHERE カラムA = 'A') と出来ます。 又、SELECT文でロック待機時間なしの場合 →SELECT カラムA FROM テーブルA WHERE カラムA = 'A' FOR UPDATE NOWAIT と出来ます。 これらを組み合わせて、ロックされているレコードを削除しようとした場合、 すぐにNGで制御を戻すように、次のように記載してみました。 →DELETE FROM テーブルA WHERE カラムA =    (SELECT カラムA FROM テーブルA WHERE カラムA = 'A' FOR UPDATE NOWAIT) なぜかNGになってしまいます(右カッコがありませんと言われます)。 なぜこの書き方が出来ないのでしょうか? 現在、一度該当のレコードをSELECT文でFOR UPDATE NOWAITをしてから DELETEをしています。 1つレコードを削除したいだけなのに、わざわざSELECT文と DELETE文を発行してしまっています。 こういう場合、他にどのような方法があるのでしょうか? 宜しくお願いします。

  • SELECT時の行ロックの必要性について

    SELECT ~ FOR UPDATEやSELECT ~ LOCK IN SHARE MODEという行ロックがあり、この件について解説しているサイトをいろいろ見ているのですが、振る舞いが複雑だということはわかりました。 しかしそもそもなぜSELECTで行ロックするのか、運用上でどんなときに使うのかを解説しているサイトは見当たりませんでした。 私は、SELECTするときは単に SELECT * FROM tb_a WHERE id = 1; としか記述していません。 質問1. なぜSELECTするのにトランザクションが必要なのでしょうか?運用上でどんなときにSELECTでトランザクションを使うのでしょうか?よく解説サイトには、 BEGIN; SELECT * FROM tb_a WHERE id = 1 FOR UPDATE; COMMIT; と書いています。SELECTするのに行をロックする必要性がいまいちわからないです。 質問2. トランザクションを開始したときにロックがかかるのではないのでしょうか?つまりBEGIN;でロックがかかるわけではないのですか?SELECTのクエリーにFOR UPDATEと書くということはこのSELECTのコードが実行された時点でロックがかかるのでしょうか? 質問3. FOR UPDATEやLOCK IN SHARE MODEというのはSELECTにしか使えないのか、もしくはSELECTだから意味があるのでしょうか?UPDATEやDELETEは単にBEGINE;とCOMMIT;で囲えばいいだけですよね? 質問4. 以下のようなコードを解説しているサイトがあります。 BEGIN; SELECT * FROM tb_a WHERE id = 1; COMMIT; SELECT文にはFOR UPDATEも書いていないのですが、これは何を意味するのでしょうか?つまり、SELECTするのになぜトランザクションを実行するのでしょうか? 一番知りたいのは運用上どのような場合にSELECTでトランザクションを使って行ロックするのか、ということです。 どうぞよろしくお願い致します。

    • ベストアンサー
    • MySQL
  • 行ロックについて

    Web上のボタンをクリックしたとき 該当データを1件取得しそのデータにフラグをたてる ⇒フラグを管理するテーブルに投入する という処理をしており該当データは一人につき1件取得したいです。 BEGIN SELECT * FROM TABLE1 WHERE day = 今日 ORDER BY time LIMIT 1 FOR UPDATE UPDATE TABLE1 SET flag = 1 WHERE id = $id INSERT INTO TABLE2 (time , flag ) VALUES ($time , 1); COMMIT 現在の問題は同時にボタンを押したとき SELECTで取得したデータが重複してしまうことがあることです。 BEGINからCOMMITまでを一連の流れとし、 その間はSELECTもできないようにしたいです。 ドキュメントに FOR UPDATEだとUPDATE、DELETE、SELECT FOR UPDATEは拒否されます とありますのでSELECTは通ると解釈するとFOR UPDATEでは実現できないのでしょうか? テーブルのロックではなく行のロックで実現したいのですが どなたかご教授お願い致します。 ※バージョンはPostgreSQL 8.1.18 です。

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

  • SQLServerでのロックについて

    SQLServerであるテーブルを行ロックしています。 (select * from テーブルA with (UPDLOCK) where KEYCD = 1) 行ロック実行時に、他のマシンが既にロックしていた場合、それをエラーとして返す方法はありますでしょうか? (Oracleでいう"nowait"のようなもの) 最近SQLServerをやりはじめたばかりの超初心者です。 よろしくお願いします(T_T)

  • mysql のテーブルロックについて

    Mysqlにてテーブルをロックしようとして以下2つの方法を試し疑問に思ったので質問します。 1.select for update によるテーブルロック 以下のselect for update(where句にレコードを一意に特定できない条件を指定) をコマンドライン で実行。 select * from test where test_state=0 for update; 別に起動したコマンドラインから下記アップデート文を実行したところ ロックされることが確認できました。 update test set test_official=0 where test_id = 1; しかし、最初に実行した select for update 文を下記のようにしたところ上記update文はロックされず に実行されてしまいました。 select * from test where test_state is null for update; これはなぜでしょうか。

    • ベストアンサー
    • MySQL
  • DB2の更新ロックについて

    DB2 v7を使用しています。 select文で更新ロックをかけました。 PreparedStatementとresultsetをcloseした後、同Connectionでupdate文をかけました。 このとき、select文のロックがかかってるのかわかりませんが、エラーも出ずに更新ができませんでした。 更新ロックのかけ方は 普通のselect文の最後に for updateとしただけです。updateは普通にupdateを行いました。 現在の状況としては、更新ロックがかかっているのかどうかわからないという状態です。 そこで、 (1)更新ロックがかかっているのかどうかを調べる方法があれば、その方法が知りたい。 (2)更新ロックの解除の方法をしりたい。 (3)select文で更新ロックをかけた場合の特別なupdateの方法が、その方法をしりたい。 どなたかご存知のかたがいらっしゃいましたらご教授くださいますようよろしくお願いいたします。 win2000 jdk1.3

  • VB6 + OO4O プロシージャの実行&複数行を受け取る方法

    VB6 + OO4O プロシージャの実行&複数行を受け取る方法 現在、VB6でOracleデータベースを操作しようと試みている最中で、 OO4Oで接続しています。 (表現誤っているかもしれません。。。) Oracleは今回初めてで、今まではSQLserverだったのですが、 SQLserverで、  1.ストアドを実行(パラメータあり)  2.レコードセット(複数行)を受け取る  3.ループで全件処理   ・・・ というような処理をしていました。 たとえば、あるテーブルの、ある条件に一致したレコード(複数あり)を全件取得 など。 「引数を渡してストアドプロシージャを実行し、複数行を結果として受け取る」ということがしたく、 Oracleでどのように実現させるかを調べてみたのですが、 「SQL文を記述し、受け取る」  例)strSQL = "select * from tbl"    Set OraDynaset = OraDatabase.CreateDynaset(strSQL, 0) というようなサンプルしか見つけられませんでした。 where句で条件を記述すれば同じなのかもしれませんが、 そういったこまごました記述をストアドプロシージャに記載しておき、 呼び出す際はパラメータだけ指定する、ということを想定しています。 ストアドを実行するサンプルは複数見つけたのですが、戻り値が1つのみか、戻り値なしのもので、 複数行を結果として受け取るようなサンプルが見あたりませんでした。 ストアド(PL/SQL)も作成してみたのですが、 単純に  select * from TBL; とするとエラーで、  select * BULK COLLECT INTO vTBl from TBL;  for i in 1 .. vTBl.count loop   -- 全レコードの項目「name」を表示する。   dbms_output.put_line(vTBl(i).name);  end loop; というように1件1件処理させていく方法しか見つけれませんでした。 Oracleのストアドは、今までのSQLServerの考え方はいけないのでしょうか? 調べるとしたら、どのような単語で調べたらよろしいでしょうか? 「VB6」「oo4o」「複数行」「プロシージャ」など、いろいろ努力はしたつもりなのですが。。。 ご指導よろしくお願いいたします。

  • ADOで排他ロックがうまくいかない

    VB6.0+access98で開発してます。 ADOを使ったレコード単位の排他ロックについて教えてください。 rs.Open時に,adLockPessimisticを指定しても,ロックされません。 rs.Update のところで一瞬ロックされているようです。 あるレコードの編集中は登録またはキャンセルされるまで、 ずっとロックしていたいのです。 他端末からそのレコードにアクセスした際にエラーが返るように したいのです。 上手く出来る方法ありませんか?

専門家に質問してみよう