Похоже, вы должны использовать вместо Oracle Sequence - как уже упоминалось в моем комментарии:)
Он будет возвращать уникальные номера при вызове NEXTVAL
.
Если по какой-то причине вы не можете использовать последовательность, просто выполните UPDATE
в этой строке. Oracle будет блокировать эту строку до тех пор, пока вы не завершите транзакцию (COMMIT
или ROLLBACK
), а все остальные обновления будут ожидать снятия блокировки.
EDIT
Если транзакции не поддерживаются в ADO
, вы также можете поместить это в процедуру Oracle, используя AUTONOMOUS_TRANSACTION
:
CREATE OR REPLACE PROCEDURE allocate_sequence_numbers(
in_size IN max_value_table.val%TYPE,
out_next_sequence_number OUT max_value_table.val%TYPE
)
AS
PRAGMA AUTONOMOUS_TRANSACTION;
next_sequence_number max_value_table.val%TYPE;
BEGIN
UPDATE max_value_table
SET val = val + in_size
RETURNING val - in_size
INTO out_next_sequence_number;
COMMIT;
END allocate_sequence_numbers;
Он обновит вашу таблицу, чтобы «распределить» указанное количество значений, и вернет первое число последовательности, которую вы распределили. Следующее приложение, которое вызывает его, получит следующий порядковый номер.
UPDATE
вызывает блокировку в этой строке, поэтому другие вызовы должны ждать, пока эта блокировка не будет снята. При использовании COMMIT
внутри AUTONOMOUS_TRANSACTION
блокировка снимается, в то время как на вашу собственную транзакцию это не повлияет.