다중 Thread에서 테이블 insert 0 8 4,609

by 웁스 [DB 모델링/설계] [2011.05.30 01:04:09]


Thread1
Thread2

위와 같이 1, 2 번에 대한 쓰레드가 새벽 1시 10분에 TEST 테이블에 현재 시간(201105300110) insert 작업을 시도합니다.
이처럼 설계가 되어 있는 상황에서 처리가 된다면 Thread1 아니면 Thread2가 TEST 테이블에 insert 작업을 시도하고, 나머지 Thread는 그 뒤에 insert 작업을 수행하기 때문에 unique index error가 발생하게 됩니다. (시간이 PK)

이와 같이 에러를 발생시킴으로써 두 개의 Thread 중 한 개만 정상적인 비지니스 처리를 가능하게 하고 있는데 에러를 발생시키지 않고, 처리를 할 수 있는 방법이 있을까요?

가령 Thread1번이 insert 작업을 수행하고 있다면 Thread2번은 앞에 1번이 이미 insert 작업을 했으니 난 insert를 안 하면 되겠다라는 방법 등.

의견 부탁 드리겠습니다.

by 현 [2011.05.30 10:59:11]
사실 가장 좋은 방법은 테이블layout 변경인데요...
사정이 여의치 않는 경우가 많죠..
나머지 Thread가 insert 할 때 데이터는 들어가야 하는 데이터 인가요? 아니면 중복이기 때문에 들어가면 안되는 데이터인가요?

만약 들어가야 하는 데이터인데 PK에러로 인해 못들어가는 상황이라면 테이블layout 변경이 불가피 하구요...

제가 프로그램은 잘 몰라서 Thread를 어떻게 제어해야 하는지는 잘 모르겠는데요,
만약 속도 때문에 Thread를 사용하는 것이라면,
단일 Thread로 한 상황에서 오라클 병렬처리를 이용해 보시는건 어떠실런지 조심스럽게 제안해 봅니다..

by 웁스 [2011.05.30 11:43:17]
나머지 쓰레드가 insert 할 때 데이터는 들어가지 말아야 하는 것 입니다.
그래서 처리한 방법이 고의적인 unique index 에러를 발생시키는 것 이구요.

즉, 에러를 발생 시킴으로써 데이터의 무결성을 보장하고 있는데 이렇게 에러를 발생시켜서 처리 하는 방식이 영 내치지가 않네요.

결과적으로 위와 같은 업무 흐름에서 에러를 발생시키지 않고 처리할 수 있는 방법을 DB를 이용하여 해결할 수 있느냐 입니다.^^

by 현 [2011.05.30 12:28:16]
아...
에러 발생이 잘못된 것이 아니라 정상적인 것이었군요...

그 에러 발생하는 것이 정 싫으시다면,
insert하기 전에 데이터가 있는지 살짝 체크 해보시는 방법이 있습니다.
count를 세지 마시고 인덱스 스캔에 rownum=1 해서 데이터의 유무를 판단하시고 insert하시면 에러 없이 insert 하실 수 있겠네요..

by 웁스 [2011.05.30 12:48:02]
select 를 하여 insert 여부를 체크하는 방법을 생각해 보지 않은 건 아니지만 이와 같이 한다고 해도 insert 시에는 동시에 처리하지 않나요?

Thread1, Thread2 flow
1. 테이블에 오늘 날짜의 데이터 존재 여부 조회 (쓰레드 두 개 동시)
2. 조회 했을 때 데이터 존재 하지 않음으로 return
3. Thread1, Thread2 insert 진행
4. 둘 중 하나의 Thread에서 unique index 에러.

위와 같은 시나리오로 흘러갈 것 같은데.아직 테스트는 해보지 않았습니다.

by 웁스 [2011.05.30 13:08:14]
select 를 하여 insert 여부를 체크하는 방법을 생각해 보지 않은 건 아니지만 이와 같이 한다고 해도 insert 시에는 동시에 처리하지 않나요?

Thread1, Thread2 flow
1. 테이블에 오늘 날짜의 데이터 존재 여부 조회 (쓰레드 두 개 동시)
2. 조회 했을 때 데이터 존재 하지 않음으로 return
3. Thread1, Thread2 insert 진행
4. 둘 중 하나의 Thread에서 unique index 에러.

위와 같은 시나리오로 흘러갈 것 같은데.아직 테스트는 해보지 않았습니다.

by 부쉬맨 [2011.05.30 13:18:12]
이런방식으로 돌리시는이유는 모르겠지만...굳히 에러가 나서 멈추지않고
계속 진행하게하고싶다면
exception 처리하여서 멈추지않고 계속 돌게하면되겠죠.
이러한 에러에 대한 로그는 남겨주는게 좋을듯하고요.

by 이재현 [2011.05.30 22:25:27]
음.. 쓰레드를 사용한다는거는 인서트할 테이타가 많아서 그런건가요??

인서트할 데이타가 많다면..

SQL 로더 방식두 추천드립니다..

by 상주 [2011.06.22 18:06:59]
쓰레드사용시 mutex로 동기화를 하시구요 위의질문자님의말씀처럼 exists를활용한 쿼리를 작성하시면 됩니다
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입