• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:オラクルで更新するまで、排他使用中にする)

オラクルで更新するまで、排他使用中にする

このQ&Aのポイント
  • オラクルで受注テーブルと連番ファイルを使用する際に、同時に受注が行われた場合に受注ファイルの連番が重複してしまう問題があります。この問題を回避するためには、排他制御を使用する必要があります。
  • 受注テーブルのキーは連番であり、連番ファイルから取得した値に1を加算して受注ファイルの連番にセットし、連番ファイルの値を更新します。しかし、複数の端末が同時に受注を行った場合、連番ファイルの取得と更新が重複してしまい、同じ連番で受注ファイルが作成されてしまいます。
  • この問題を回避するためには、データを取得している間に排他制御をかける必要があります。具体的な方法としては、データを取得する際にロックをかけることで他のユーザーが同じデータにアクセスできないようにします。また、データの更新が完了したらロックを解除することで他のユーザーがデータを利用できるようにします。

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

  • ベストアンサー
回答No.1

排他制御の方法ですが select 連番 from 連番ファイル for update nowait; で可能です。 説明: for updateはcommitまたはrollbackが行われるまでロックします。nowaitをつけると制御を直ぐに返します。 SQL*Plus2つ使用しての実行例: ユーザ1:select 連番 from 連番ファイル for update nowait; >>[selectの結果] ユーザ2:select 連番 from 連番ファイル for update nowait; >>ORA-00054: リソース・ビジー、NOWAITが指定されていました ユーザ1:update ..... ユーザ1:commit; ユーザ2:select 連番 from 連番ファイル for update nowait; >>[selectの結果] 2番目のユーザ2がnowaitを指定しないとユーザ1がcommitまたはrollbackするまで制御か帰りません。(固まったような状態になります。)お手元に環境があるようでしたら試すと実感できると思います。

Ref16570
質問者

お礼

只今、2台のPCでお互いにSQL+にて、試して見ました。 (1)1台目に、SELECT .... FOR UPDATEを実行 (2)2台目に同じコマンドを実行 (3)1台目にUPDATE 分→COMMIT (4)2台目のフリーズ状態が解除され、1台目で更新された  内容を取得。 実際に体感できました。 これで、問題点を解決できます。 大変助かりました。ありがとうございました。 NOWAITを付ける、付けないは仕様によって使い分けたいと思います。

その他の回答 (1)

回答No.2

No.1のものですが ちなみにこの辺の構文が載っているマニュアルは OTNのトップページの左側にある[リソース]-[ドキュメント(マニュアル)]からPDFをダウンロードできます。ただし、無料のユーザ登録が必要です。

参考URL:
http://otn.oracle.co.jp/
Ref16570
質問者

お礼

ご丁寧にありがとうございます。 ユーザー登録して、PDFの内容を確認させて頂きます。 お手数をおかけいたしました。