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

“我们可以使用表锁概念来锁定选择语句吗?”

不会。Oracle 中没有任何东西会阻止读者。

于 2013-01-18T22:17:54.197 回答