我有一个 Oracle 数据库,其中包含一个包含唯一字段的表:
create table t(n number, CONSTRAINT n_unq UNIQUE (n));
然后从 session-1 有人试图插入一些数据:
insert into t(n) values(1);
-- no commit yet
在 session-2 中有人试图做同样的事情:
insert into t(n) values(1);
-- hangs here, wating for commit/rollback in session-1
克服这种遗憾情况的正确方法是什么?Session-2 似乎被困住了,它可能会被 session-1 挂起很长一段时间“被捕获”。
我知道序列的方式,但是如果任务更复杂怎么办,比如说:编写一个函数来检查值是否存在并返回它,如果不存在则插入(这是刚刚引入的陷阱,当运行并行相同的代码)然后返回它。
-- Ex:
create or replace function f(pn number) return number
is
pret number;
begin
select n into pret from t where n = pn;
return pret;
exception when no_data_found then
insert into t(n) values (pn);
-- hangs here in parallel calls f(<new_value>)
return pn;
end;