팀 구성원이 웹 페이지의 링크를 두 번 클릭하면 브라우저에서 두 개의 요청을 보내면 동일한 레코드가 두 번 데이터베이스에 삽입되는 기존 사내 시스템의 문제가 발생했습니다. 경쟁 조건; 마지막으로 실행할 키가 기본 키 위반으로 실패합니다. 여러 솔루션과 해킹이 제안하고 논의되었다 :이중 삽입 해상도를 두 번 클릭 하시겠습니까?
를 사용하여 자바 스크립트를 웹 페이지에 첫 번째 클릭에 대한 링크를 비활성화하여 두 번째 클릭을 완화 할 수 있습니다. 이것은 문제의 발생을 줄이기위한 빠르고 쉬운 방법이지만 완전히 제거하지는 못합니다.
트랜잭션의 서버 측에서 요청 실행을 감싸십시오. 이것은 문제가되는 테이블의 서버로드 및 잠금 레벨로 인해 너무 비싸다고 판단되었습니다.
실패한 삽입으로 발생하는 1 차 키 예외를 찾아서 식별하여 먹습니다. 이것은 (a) 데이터베이스 종속적 예외의 뉘앙스를 알아야하고, (b) 합법적 인 데이터베이스 오류를 로깅/처리하지 않을 수있는 벤더 종속 (vendor-in)의 단점이 있습니다.
삽입이 실패한 경우 레코드를 업데이트하고 업데이트 결과를 확인하여 영향을받는 1 레코드가 반환되는지 확인하여 # 3의 확장.
다른 옵션은 고려되지 않았습니까? 간과 한 옵션의 장단점이 있습니까? 모든 악의 더 작은 것인가?
이것이 가장 잘 표현 된 응답 인 것으로 보이지만 토큰 검사와 새 토큰 생성 사이에는 여전히 경쟁 조건이 있습니다. 그것은 어떻게 든 동기화되어야합니다. –
새 토큰이 각 페이지보기에서 다시 생성되고 성능 저하없이 잠길 수있는 일종의 데이터베이스에 저장되는 경우가 아닙니다. 이제 데이터베이스를 잠글 수 있고 값이 이미 사용되었는지 확인한 다음 오류가 발생하지 않았는지, 사용되지 않았 으면 플래그를 사용하여 완료했다고 할 수 있습니다 –