2
我有一個是從併發事務調用的過程:唯一約束違反(ORA-00001)的併發插入
//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_table店PKS):
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;
偶爾插入語句失敗,ORA-00001 for table1_id,我無法想象它爲什麼會發生。
+1。 SELECT FOR UPDATE和AUTONOMOUS_TRANSACTION應該注意併發序列增量。當然,更安全更簡單的方法是僅使用全局序列,而不關心id中的空白。 – Thilo 2013-03-13 05:23:21
我沒有看到一個錯誤,所以也許這是你沒有發佈的內容。你確定在id_table的table_identifier列上有唯一的約束,或者TABLE1有兩個id_table行嗎?你確定table1_id是唯一約束被違反的列,還是有其他可能導致這個錯誤的UNIQUE約束? – 2013-03-13 05:45:14
@ScottLamb可能不是我發佈的問題,我會繼續搜索答案...但我確定錯誤是ora-00001 for table_id約束,我確信在表' id_table'有'TABLE1'的一行。無論如何,謝謝。 – 2013-03-13 06:11:18