Concurrency 并发插入中违反了唯一约束(ORA-00001)

Concurrency 并发插入中违反了唯一约束(ORA-00001),concurrency,oracle11g,primary-key,unique-constraint,Concurrency,Oracle11g,Primary Key,Unique Constraint,我有一个从并发事务调用的过程: //Some actions here INSERT INTO table1 (table1_id, table1_val1, table1_val2, table1_val3) VALUES (gettablenewid('TABLE1'), val1, val2, val3); INSERT INTO table1 (table1_i

我有一个从并发事务调用的过程:

//Some actions here

INSERT INTO table1
                (table1_id, table1_val1, table1_val2, table1_val3)
              VALUES
                (gettablenewid('TABLE1'), val1, val2, val3);

INSERT INTO table1
                (table1_id, table1_val1, table1_val2, table1_val3)
              VALUES
                (gettablenewid('TABLE1'), val1, val2, val3);
INSERT INTO table1
                (table1_id, table1_val1, table1_val2, table1_val3)
              VALUES
                (gettablenewid('TABLE1'), val1, val2, val3);
//some other actions
函数gettablenewid代码(id\u表存储每个表的PK):


偶尔insert语句会因ORA-00001 for table1\u id而失败,我无法理解为什么会发生这种情况。

所以,正如Scott Lamb所说,代码中没有错误。我发现另一个进程同时修改了表标识符为“TABLE1”的id\u表。谢谢大家的帮助。

+1。SELECT FOR UPDATE和AUTONOMONIC_事务应考虑并发序列增量。当然,更安全、更简单的方法是只使用一个全局序列,而不关心id中的间隙。我没有看到错误,所以可能是在你没有发布的内容中。您确定id_table的table_identifier列上有唯一的约束,还是TABLE1有两个id_table行?您确定table1_id是违反其唯一约束的列,还是有其他唯一约束可能导致此错误?@ScottLamb可能是我发布的内容中没有的问题,我将继续搜索答案。。。但我确信表id约束的错误是ora-00001,并且我确信在表“id\u table”中有一行表示“TABLE1”。无论如何,谢谢你。
create or replace
    function        GetTableNewId(tablename in varchar2)
      return number is
      PRAGMA AUTONOMOUS_TRANSACTION;
      Result number;
    cursor c1 is SELECT ig.id_value+1 id_new
                              FROM id_table ig
                              WHERE ig.table_identifier = tablename
                              FOR UPDATE of  ig.id_value;
    begin
    for c1_rec in c1 loop  
      UPDATE id_table ig
         SET ig.id_value = c1_rec.id_new
       WHERE current of c1 ;
       Result:=c1_rec.id_new;
    end loop;
    commit;
      return(Result);
    end GetTableNewId;