重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

オラクルで、
受注テーブルと連番ファイルがあります。
端末が100台位あり、どの端末でも受注を入力します。
受注テーブルのキーは連番で、連番ファイルから取得して、1加算した値を受注ファイルの連番にセットし、連番ファイルの値を更新します。

このような場合、同時に受注を行われた場合、
端末(1)が連番ファイルを取得し、更新する間に、
端末(2)が連番ファイルを取得すると、
同じ連番で受注ファイルを作成してしまいます。

SELECT 連番 FROM 連番ファイル
UPDATE 連番ファイル SET 連番=XXXXX

回避策として、データをつかんでいるときに、排他制御などがかけれると聞いたことがあるのですが、どうやって書けばよいのでしょうか?

A 回答 (2件)

排他制御の方法ですが


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するまで制御か帰りません。(固まったような状態になります。)お手元に環境があるようでしたら試すと実感できると思います。
    • good
    • 0
この回答へのお礼

只今、2台のPCでお互いにSQL+にて、試して見ました。
(1)1台目に、SELECT .... FOR UPDATEを実行
(2)2台目に同じコマンドを実行
(3)1台目にUPDATE 分→COMMIT
(4)2台目のフリーズ状態が解除され、1台目で更新された
 内容を取得。

実際に体感できました。
これで、問題点を解決できます。
大変助かりました。ありがとうございました。

NOWAITを付ける、付けないは仕様によって使い分けたいと思います。

お礼日時:2003/09/07 15:26

No.1のものですが


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

参考URL:http://otn.oracle.co.jp/
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/09/07 15:31

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す