2013-03-13 86 views
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,我無法想象它爲什麼會發生。

+2

+1。 SELECT FOR UPDATE和AUTONOMOUS_TRANSACTION應該注意併發序列增量。當然,更安全更簡單的方法是僅使用全局序列,而不關心id中的空白。 – Thilo 2013-03-13 05:23:21

+3

我沒有看到一個錯誤,所以也許這是你沒有發佈的內容。你確定在id_table的table_identifier列上有唯一的約束,或者TABLE1有兩個id_table行嗎?你確定table1_id是唯一約束被違反的列,還是有其他可能導致這個錯誤的UNIQUE約束? – 2013-03-13 05:45:14

+0

@ScottLamb可能不是我發佈的問題,我會繼續搜索答案...但我確定錯誤是ora-00001 for table_id約束,我確信在表' id_table'有'TABLE1'的一行。無論如何,謝謝。 – 2013-03-13 06:11:18

回答

0

所以,正如Scott Lamb所說的那樣,代碼中沒有錯誤。我發現了另一個爲table_identifier ='TABLE1'同時修改了id_table的進程。感謝大家的幫助。