1

次の Plsql パッケージからシーケンス番号を取得し、指定された contractObjId の行を更新しようとしています。スレッド環境でこれを呼び出すJavaプログラムがあります。

複数のスレッドが同時に呼び出し、同じ contractobjId を持つことができます。私の問題は、複数のスレッドが呼び出されているときに重複したシーケンス番号を生成していることです。

解決策を提案し、私が間違っている場所を指摘してください。

CREATE OR REPLACE PACKAGE BODY MANAGE_SEQ_NO IS
  PROCEDURE GET_NEXT_SEQ_NUM (contractobjid NUMBER, seqCur IN OUT SITECURTYP) IS
       seq_no NUMBER;
       seq_value NUMBER;
  BEGIN
     SELECT x_sequence_no 
     INTO seq_no 
     FROM table_contract 
     WHERE objid = contractObjid 
     FOR     UPDATE;
     IF seq_no IS NULL THEN
        seq_value := 1;
     ELSE
         seq_value := seq_no+1;
     END IF;
     UPDATE table_contract 
     SET x_sequence_no = seq_value 
     WHERE objid = contractObjid;
     COMMIT;
     OPEN seqCur FOR
     SELECT seq_value FROM dual;
  END GET_NEXT_SEQ_NUM;
END;
/
4

2 に答える 2

1

実際のシーケンスを使用したくない場合は、おそらく を使用できますSELECT FOR UPDATE。これにより、読んでいる行がロックされ、何でも増やしてから更新できます。もちろん、それは回線をロックします。何をするかによっては、スケーラビリティの問題が発生する可能性があります。

于 2013-01-17T13:26:18.900 に答える
1

「テーブル ロックの概念を使用して select ステートメントをロックできますか。」

いいえ。Oracle ではリーダーをブロックするものは何もありません。

于 2013-01-18T22:17:54.197 に答える