데이터 중복 방지 관련 문의 입니다. 1 7 1,690

by 달라쏭 [어플리케이션관련] [2016.12.19 14:57:12]


데이터 중복인입을 방지하는 방법이 있을까 하여 문의드립니다.

예를들어  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인 경우는 여러개가 들어갈수도 있어서. 애매하네요 ㅜ

     

 

by 마농 [2016.12.19 15:45:37]
-- 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);  -- 정상

 


by 랑에1 [2016.12.19 15:51:06]

요런것도 있네요 또 하나 배워갑니다 ㅎㅎ


by 달라쏭 [2016.12.19 16:01:03]

헐........ 나의 무식함에 반성을  여러분의 유식함에 찬사를....  ㅜㅜ

감사합니다.


by 달라쏭 [2016.12.19 18:34:07]

추가로 궁금 한게 있습니다만.

이렇게 인덱스를 걸면 . 혹시 성능문제에서는 문제가 없을까요?

저 테이블이 중요테이블 인지라.

대략 하루에 만건 이상이 insert 가 됩니다.

조회할때는 거의 참조하는 테이블입니다..


by 마농 [2016.12.20 08:36:21]

인덱스나 제약조건 걸면 DML 성능은 떨어지게 됩니다.
그러나 성능 저하는 미약하지만. 데이터 무결성 효과는 뛰어나죠.
대용량 데이터를 한꺼번에 올리는 거라면 속도차를 느낄 수 있겠으나
실시간으로 1건씩 올라오는 자료라면 속도차 느끼지 못할 듯 하네요.


by 우리집아찌 [2016.12.20 10:00:56]
for update

by 달라쏭 [2016.12.20 11:41:56]

좋은 의견 감사합니다 !

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입