• ベストアンサー

他の処理でselectさせないようにしたい。

他の処理でselectさせないようにしたい。 ある処理AがテーブルXを利用し動作していたとします。 この時、別の処理Bが,テーブルXを検索しただけでエラーにしたいです。 FOR UPDATEは、更新はできないですが、検索は出来そうなのですが、 検索しただけでエラーにする方法はあるでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.2

for update nowait としたらどうでしょうか?

参考URL:
http://oracle.se-free.com/dml/10_forupdate.html
evaag777
質問者

お礼

ご回答ありがとうございました。 排他制御そのものを別検討しました。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

残念ながら検索を阻止することはできません。 そもそもOracleでは更新中でも検索可能なのが売りの一つですから。 別の処理Bが実行中に処理Aが実行を開始することだってあるでしょう。

evaag777
質問者

お礼

ご回答ありがとうございました。 排他制御そのものを別検討しました。

全文を見る
すると、全ての回答が全文表示されます。

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

  • SELECTを含むUPDATEについて

    2つののテーブルがあり、テーブル1のデータを元にテーブル2を更新させたい場合、SELECT文を含むUPDATE文で更新出来ると思うのですが、どのようにしたら一番効率的でしょうか? 例)テーブル1~table1 no ken city ---------------------------------- 01 北海道 根室 03 青森 八戸 05 千葉 柏 08 埼玉 さいたま 09 東京 千代田区 例)テーブル2~table2 no ken city ---------------------------------- 01 02 03 04 05 06 07 08 09 テーブルが2つあり、テーブル1の情報を元にテーブル2を更新したい。 条件は、noが一致していること。 A) kenを更新するには、 ↓ UPDATE `table2` SET ken = (SELECT ken from table1 WHERE table1.no = table2.no) B) kenとcityを更新するには、 ↓ UPDATE `table2` SET ken = (SELECT ken from table1 WHERE table1.no = table2.no), city = (SELECT city from table1 WHERE table1.no = table2.no) SELECT以下が同じなのでもうちょっとスマートに短く記述する方法はあるんでしょうか?

    • ベストアンサー
    • MySQL
  • 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問わず同じ挙動と思い、 このカテゴリに質問されていただきました。

  • ORACLEのUPDATE処理

    お世話になります。 UPDATE文のSET句からストアドファンクションを呼び返却値を設定する処理を行っています。 が、以下のエラーが出ます。 「ORA-04091: 表xx.xxxは変更しています。トリガー/関数は見ることができません」 テーブルにトリガーは使用していません。 ストアドファンクション内で、コール側のUPDATEするTABLEを参照(SELECT)しているのですが この箇所を削除すると、エラー発生しません。 以下のような処理です。 UPDATE TABLE_A SET COL_A = FUNC(KEY1,KEY2); FUNC(PKEY1,PKEY2) IS CORSOR C1 IS SELECT COL_B FROM TABLE_A WHERE KEY1 = PKEY1 AND KEY2 = PKEY2; BEGIN ・・・ END; UPDATEですが、自TABLEのSELECTは ・SET句の中でSELECTする場合はうまくいく ・引数渡し→ストアドファンクション内でSELECTはできない という事なのでしょうか。 よろしくお願いします。

  • 排他処理について

    VBでトランザクションをかけてあるテーブルを処理しています。 具体的にはテーブルAのレコードを一時的に別テーブル(テーブルB)に コピーしてそのレコードすべてを元のテーブルから削除して、 テーブルB内で処理をさせてから、そのデータをテーブルAに戻して コミットしています。 この処理中に、別PGもしくはSQLPlusでテーブルAからテーブルBに コピー対象の1レコードを削除してコミットしました。 これってエラーになる?ならない?それともトランザクション中だから テーブルAがコミットされて開放されるまで待ちの状態になる?? 実際どうなったかというとエラーにならなくて、その処理で最後に テーブルAにテーブルBをコピーしたときにエラーになって データがきえるという現象がおきてしまいました。 上記のような処理のときにOracle条ではどのような処理になるのでしょうか? よろしくお願いします。

  • SQLの処理結果について

    お世話になります。 毎回気になっていることがあります。 MySQLでアップデートやインサートを含む一連の処理が正常に行われたかを確認する方法として現在クエリー実行結果がTrueかFalseで判定をしているのですが、これは正しい方法なのでしょうか? 例えばUPDATEをしたあとにphp内で別の処理をする場合、これらのすべての処理が完了したかを確認するし、途中で中断していたらその前の処理も行わない(取り消す)ということは可能なのでしょうか? 例: 1、テーブルからAという値をセレクト 2、A+1 3、テーブルAにアップデート 4、A+1 5、テーブルBに4の値を書き込み 3の処理が失敗している場合、5の処理は行わないというようのしたいのです。 毎回If分岐というのがよいのでしょうか? 複数回判定が必要な場合などぼ方法を教えていただけると幸いです。

    • ベストアンサー
    • PHP
  • OIP-04129: SELECT FOR UPDATE

    OIP-04129: SELECT FOR UPDATEでのコミット/ロールバックを処理しています。 上記のエラーが理論的にどういう時に発生しますか? 自分が先に一つテーブルのデータを全部ロックしてますが、関係あるはずです。 原因が知りたいです。 宜しくお願いします!

  • SELECTのスピード

    SELECTのスピードでどの方法が 検索スピードが速いのか教えてもらいたいのですが Aのテーブル DENNO CODE Bのテーブル CODE NAME Aのテーブルを主にAのCODEでBのテーブルを参照したい時 (1) SELECT A.DENNO,A.CODE, (SELECT B.NAME from B where A.CODE=B.CODE) AS NAME from A (2) SELECT A.DENNO,A.CODE,B.NAME FROM A LEFT JOIN B ON A.CODE=B.CODE (3) SELECT A.DENNO,A.CODE,B.NAME FROM A , B WHERE A.CODE=B.CODE(+)

  • 他のテーブルを参照した値はupdateでsetできない?

    「テーブルの特定の項目を、別のテーブルを参照した値でupdateできない」問題で悩んでいます。 以下の2つのテーブルがある場合、 select * from TAB_A COL001 COL002 COL003 ------ ------ ------ 00001 YYY DE 00002 YYY FG 00003 YYY HI select * from TAB_B COL001 COL002 COL003 ------ ------ ------ 00001 YYY ST 00002 YYY UV 00003 YYY WX TAB_AのCOL01とCOL02 を条件に TAB_BのCOL03を検索して、TAB_AのCOL03を更新するために update TAB_A set TAB_A.COL003 = ( select TAB_B.COL003 from TAB_A,TAB_B where TAB_A.COL01 = TAB_B.COL01 and TAB_A.COL02 = TAB_B.COL02 ) と、記述すると、 ORA-01427: 単一行副問合せにより2つ以上の行が返されます。 とのメッセージが表示される場合があります。 なにか良い解決策はあるでしょうか? 「SQLは、実はテーブルの特定の項目を、別のテーブルを参照した値でupdateできない」のだ、との噂も聞きますが.... なお、使用しているDBは Oracle10gです。

  • UPDATEが動いたり止まったり…

    SQLServer2000SP4の環境で、 夜間バッチ処理で update テーブルA set 項目A1 = (select 項目B1 from テーブルB where 項目B2 = 項目A2) where 項目A2 in( select 項目A2 from テーブルA left outer join テーブルB on 項目A2 = 項目B2 where 項目A1 <> 項目B1 ) という処理で、テーブルAとテーブルBの項目1という値が違うものだけ対象にして、テーブルBの項目1をテーブルAの項目1にセットしています。 この処理で正常に終わることがほとんどなのですが、月に2度程、このコマンドのまま停止した状態(エラーなし。コマンドタイムアウトは0にしています)になることがあります。 きっかけとしては、テーブルAのA1にインデックスを設けたということがあり、エラー対策としてインデックスデフラグを処理直前にかけていました。いっときは正常に動いていたのですが、また停止したので、インデックスフラグメントが原因ではなさそうです。(ちなみにこのUPDATEで更新される件数は数十件です) テーブルA:100万レコード程 主キー:項目A2 インデックス:項目A1 テーブルB:100万レコード程 主キー:項目B2 エラーメッセージも何もでなくて、処理が継続中のような状態で止まっているのでこのUPDATE一文でインデックス更新にロックが掛かっているのかなと勝手に想定はしておりますが、どなたか原因と回避を教えていただきたく質問させて頂きました。よろしくお願いいたします。

パソコンをHDMIで接続可能か?
このQ&Aのポイント
  • NEC2016年夏バージョンのDA770/EAWを使用していますが、最近のカタログを見るとHDMI入力端子にノートパソコンを接続しマルチ画面で作業可能とありますが、DA770でも可能でしょうか?
  • NEC2016年夏バージョンのDA770/EAWを使用していますが、最近のカタログにはHDMI入力端子があり、ノートパソコンを接続してマルチ画面で作業可能と記載されています。しかし、DA770でも同様の機能が利用できるのでしょうか?
  • NEC2016年夏バージョンのDA770/EAWを使用していますが、最新のカタログを見るとHDMI入力端子があり、ノートパソコンを接続してマルチ画面で作業可能と書かれています。ただし、DA770でもこの機能を利用することができるのでしょうか?
回答を見る