개발자

관계형 DB의 UNIQUE KEY duplicate 이슈

2023년 10월 18일조회 296

Duplicate 이슈를 막기위해 보통 insert 하기전에 조회 후 없으면 insert 쿼리를 날리는데 이럴 경우 스레드 환경에서 동시 쿼리가 실행될 경우 Duplicate 이슈가 생길 수 있습니다 Lock 을 이용하여 방지하는 방법도 있지만 성능을 떨어트리는 등 비용이 크다고 생각됩니다.  그래서 저는 insert ignore 쿼리를 통해 조회하지 않고 insert ignore 쿼리를 날린 후 조회하는 방법을 주로 이용합니다. 하지만 주변 지인분들은 잘 모르고 안쓰는 것 같더라구요.. 이 방법이 좋은 방법은 아닌가? 라는 생각에 다른분들은 어떻게 처리하고 계신지 궁금합니다.

이 질문이 도움이 되었나요?
'추천해요' 버튼을 누르면 좋은 질문이 더 많은 사람에게 노출될 수 있어요. '보충이 필요해요' 버튼을 누르면 질문자에게 질문 내용 보충을 요청하는 알림이 가요.

답변 1

김대현님의 프로필 사진

좋은 방법이네요. 다만, 여러 스레드에서 동시로 쿼리를 실행하더라도 UNIQUE키가 걸려있기 때문에, DB수준에서 늦게 도착한 요청은 UK위반 오류를 내서 무시될 것 같은데요, 어떻게 Duplicate가 되는지 궁금합니다. 결국, UK가 잘 걸려있으면 조회를 해보고 날릴 필요 없이, 그냥 INSERT하면 됩니다. UK 위반 오류를 무시하는 방법으로 INSERT IGNORE를 쓰는 방법은 좋은 것 같습니다.

김태훈님의 프로필 사진

김태훈

작성자

백엔드 개발자2023년 10월 18일

네 맞습니다. 이미 물리키가 걸려있기 때문에 데이터가 생성되지는 않습니다. 하지만 어플리케이션 단에서 예외처리를 해주어야 합니다. (위에 작성한 이슈가 요것..ㅎ) insert ignore 를 이용하면 예외처리 또한 생략할 수 있어서 좋은 것 같습니다.

김대현님의 프로필 사진

김대현

백엔드 개발자2023년 10월 19일

결국 질문이 아니라, 팁 공유네요. 개발 블로그 같은데 써서 더 널리 공유하시면 좋을 것 같습니다.

지금 가입하면 모든 질문의 답변을 볼 수 있어요!

현직자들의 명쾌한 답변을 얻을 수 있어요.

또는

이미 회원이신가요?

목록으로
키워드로 질문 모아보기

실무, 커리어 고민이 있다면

새로운 질문 올리기

지금 가입하면 모든 질문의 답변을 볼 수 있어요!