2013-03-13 2 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 저장 PK와)

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; 

때때로 INSERT 문이 table1_id에 대해 ORA-00001과 함께 실패합니다. 왜 그런 일이 일어날지를 예측할 수 없습니다.

+2

+1. SELECT FOR UPDATE 및 AUTONOMOUS_TRANSACTION은 동시 시퀀스 증분을 처리해야합니다. 물론 안전하고 간단한 방법은 전역 시퀀스를 사용하고 ID의 갭을 신경 쓰지 않는 것입니다. – Thilo

+3

오류가 표시되지 않으므로 게시하지 않은 항목에있는 것일 수 있습니다. id_table의 table_identifier 열에 고유 한 제한 조건이 있는지 또는 TABLE1에 대해 두 개의 id_table 행이있을 수 있습니까? table1_id가 고유 제한 조건을 위반 한 열입니까, 아니면이 오류의 원인이 될 수있는 다른 UNIQUE 제약 조건입니까? –

+0

@ScottLamb 내가 게시 한 것에 문제가 될 수 있습니다, 나는 대답을 계속 검색 할 것입니다 ...하지만 오류는 ora-00001 for table_id 제약 조건이었고 테이블 ' id_table '에는'TABLE1 '에 대해 하나의 행이 있습니다. 아무튼 감사 해요. –

답변

0

Scott Lamb은 코드에 오류가 없다고 말했습니다. table_identifier = 'TABLE1'에 대해 id_table을 동시에 수정 한 다른 프로세스를 발견했습니다. 도움을 주신 모든 분들께 감사드립니다.