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과 함께 실패합니다. 왜 그런 일이 일어날지를 예측할 수 없습니다.
+1. SELECT FOR UPDATE 및 AUTONOMOUS_TRANSACTION은 동시 시퀀스 증분을 처리해야합니다. 물론 안전하고 간단한 방법은 전역 시퀀스를 사용하고 ID의 갭을 신경 쓰지 않는 것입니다. – Thilo
오류가 표시되지 않으므로 게시하지 않은 항목에있는 것일 수 있습니다. id_table의 table_identifier 열에 고유 한 제한 조건이 있는지 또는 TABLE1에 대해 두 개의 id_table 행이있을 수 있습니까? table1_id가 고유 제한 조건을 위반 한 열입니까, 아니면이 오류의 원인이 될 수있는 다른 UNIQUE 제약 조건입니까? –
@ScottLamb 내가 게시 한 것에 문제가 될 수 있습니다, 나는 대답을 계속 검색 할 것입니다 ...하지만 오류는 ora-00001 for table_id 제약 조건이었고 테이블 ' id_table '에는'TABLE1 '에 대해 하나의 행이 있습니다. 아무튼 감사 해요. –