데이터 중복인입을 방지하는 방법이 있을까 하여 문의드립니다.
예를들어 TBL_TEST 라는 테이블에
필드 ID(PK) , NO , STATUS 가 있다고 가정할때.
요건 - 같은 NO 에 STATUS '9' 가 여러개는 가능하지만
같은 NO 에 STATUS 가 '1' 인것은 불가능 하다. (오직 한개만 존재)
프로시저 내에서는 NO 가 '11' 인경우에 대하여 TBL_TEST 에 STATUS = 1 인경우가 있으면
패스 하고 없다면 INSERT 하게 되어 있는 구조입니다.
그런데 동일한 시분초에 요청이 들어오는 경우 또는
다음과 같은 케이스
1. a 요청 파라미터 no 는 11
2. .a 요청건 insert 처리 지연
3. a 와 동일한 파라미터로 b 요청
4. a 와 b가 동시에 처리
5. 다음과 같이 INSERT 됨
ID , NO , STATUS
01 11 1
02 11 1
이렇게 데이타가 들어오면 안되는데 동시에 처리 되다 보니까 프로시저내에서의 조건절이 의미가 없게되네요..
혹시 이런 이슈와 관련하여 해결방안이나 노하우가 있으신지 궁급합니다... 감사합니다..
PS.. NO와 STATUS 를 유니크 인덱스를 생성하면 해결할수 있을수도 있겠지만 1 이 아닌 9인 경우는 여러개가 들어갈수도 있어서. 애매하네요 ㅜ
-- 1. 테이블 생성 및 PK 지정 CREATE TABLE tbl_test ( id VARCHAR2(2) NOT NULL , no NUMBER(2) NOT NULL , status NUMBER(1) NOT NULL , CONSTRAINT pk_tbl_test PRIMARY KEY(id) ) ; -- 2. CHECK 제약조건 생성 ALTER TABLE tbl_test ADD CONSTRAINT ck_tbl_test_status CHECK (status IN (1, 9)); -- 3. 함수기반 UK 생성 CREATE UNIQUE INDEX uk_tbl_test_no_status_fbi ON tbl_test(DECODE(status, 1, no)); -- 4. 테스트. INSERT INTO tbl_test VALUES ('01', 11, 1); -- 정상 INSERT INTO tbl_test VALUES ('02', 11, 1); -- 오류 INSERT INTO tbl_test VALUES ('03', 11, 9); -- 정상 INSERT INTO tbl_test VALUES ('04', 11, 9); -- 정상 INSERT INTO tbl_test VALUES ('05', 11, 9); -- 정상