외부 소스 (POS 장치의 송장)에서 여러 요청을받는 응용 프로그램이 있습니다. 그것은 초당 수십 개의 요청을 받고 그 요청 중 일부는 동일합니다 (동일한 요청 본문을 가짐).다중 삽입/업데이트에서 고유 키 예외
요청 데이터가 변환되어 두 개의 관련 테이블 (외래 키)에 저장됩니다. 레코드가 이미 존재하면 (고유 복합 키로 쿼리 됨) 레코드가 업데이트되고 그렇지 않으면 레코드가 추가됩니다.
고유 키가 이미 존재하고 삽입 할 수없는 문제가 같은 몸 때때로 경우 두 요청이 동시에 응용 프로그램에서 수신되는 것입니다에서 예외가 발생합니다 :
SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry
을 그것은 경쟁의 아마 어떤 종류의 MySQL의 조건이지만 알아낼 수는 없습니다.
전체 프로세스가 Laravel 트랜잭션으로 래핑됩니다. 다른 격리 수준을 설정하려고했습니다. SERIALIZABLE은 그 문제를 해결하지만 교착 상태 예외가 많이 발생하며 때로는 레코드가 저장되지 않는 경우가 있습니다.
이 부분을 제외하고는 답이 좋을 것입니다. 그러나 삽입하려는 데이터가 이전에 데이터베이스에 존재하는지 확인해야합니다. , "이것은 잘못된 것입니다. 올바른 접근 방식은 데이터베이스가 처리하고 throw 된 예외를 catch하도록하는 것입니다. – e4c5
당신이 맞습니다. 많은 양의 데이터가 있으면 많은 시간이 소요될 수 있습니다. 그리고이 문제가 생겼을 때 몇 초 만에 돌아가거나 돌아갈 수 있습니다. 몇 가지 간단한 해결책은 https : /laracasts.com/discuss/channels/eloquent/eloquent-trycatch-on-duplicate-key-exception-and-delete – aasanchez
@aasanchez 내 질문에 기록한대로 기록이 업데이트되면 이미 기록이 있는지 확인합니다. 하지만 어떤 종류의 경쟁 조건이 발생하고 같은 레코드가 두 번에 동시에 삽입하려고하면 체크가 건너 뛴다 고 생각합니다. –