我正在尝试从以下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;
/
答案 0 :(得分:1)
好吧,如果你不想使用真实的序列,你可以使用SELECT FOR UPDATE
。这将锁定您正在阅读的行,您可以增加任何内容,然后执行更新。当然,它会锁定线路,并根据您的操作可能会产生一些可扩展性问题。
答案 1 :(得分:1)
“我们可以使用表锁定概念来锁定select语句。”
没有。没有什么可以阻止Oracle中的读者。