2017-05-04 21 views
0

외부 소스 (POS 장치의 송장)에서 여러 요청을받는 응용 프로그램이 있습니다. 그것은 초당 수십 개의 요청을 받고 그 요청 중 일부는 동일합니다 (동일한 요청 본문을 가짐).다중 삽입/업데이트에서 고유 키 예외

요청 데이터가 변환되어 두 개의 관련 테이블 (외래 키)에 저장됩니다. 레코드가 이미 존재하면 (고유 복합 키로 쿼리 됨) 레코드가 업데이트되고 그렇지 않으면 레코드가 추가됩니다.

고유 키가 이미 존재하고 삽입 할 수없는 문제가 같은 몸 때때로 경우 두 요청이 동시에 응용 프로그램에서 수신되는 것입니다

에서 예외가 발생합니다 :

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 

을 그것은 경쟁의 아마 어떤 종류의 MySQL의 조건이지만 알아낼 수는 없습니다.

전체 프로세스가 Laravel 트랜잭션으로 래핑됩니다. 다른 격리 수준을 설정하려고했습니다. SERIALIZABLE은 그 문제를 해결하지만 교착 상태 예외가 많이 발생하며 때로는 레코드가 저장되지 않는 경우가 있습니다.

답변

0

이것은 간단합니다. 여기에 "UNIQUE"또는 "Primary Key"또는 이와 비슷한 것으로 선언 된 값이 있습니다. 다시 삽입하려고하면 삽입을 차단하는 몇 가지 키 제한이 있습니다. 좋아, 당신은 데이터베이스에 중복 항목을 피할 수 있지만 삽입하려는 데이터가 데이터베이스에 존재하는지, 모든 열이 아닌지, 키 또는 키 조합을 요청해야하는지 확인해야합니다. 데이터 또는 표를 모르는 경우 더 많은 도움이되지 않습니다 ...

+0

이 부분을 제외하고는 답이 좋을 것입니다. 그러나 삽입하려는 데이터가 이전에 데이터베이스에 존재하는지 확인해야합니다. , "이것은 잘못된 것입니다. 올바른 접근 방식은 데이터베이스가 처리하고 throw 된 예외를 catch하도록하는 것입니다. – e4c5

+0

당신이 맞습니다. 많은 양의 데이터가 있으면 많은 시간이 소요될 수 있습니다. 그리고이 문제가 생겼을 때 몇 초 만에 돌아가거나 돌아갈 수 있습니다. 몇 가지 간단한 해결책은 https : /laracasts.com/discuss/channels/eloquent/eloquent-trycatch-on-duplicate-key-exception-and-delete – aasanchez

+0

@aasanchez 내 질문에 기록한대로 기록이 업데이트되면 이미 기록이 있는지 확인합니다. 하지만 어떤 종류의 경쟁 조건이 발생하고 같은 레코드가 두 번에 동시에 삽입하려고하면 체크가 건너 뛴다 고 생각합니다. –