더블 삽입 해상도를 두 번 클릭 하시겠습니까?
-
03-07-2019 - |
문제
팀 구성원은 웹 페이지의 링크를 두 번 클릭하면 브라우저에서 두 개의 요청을 전송하여 레이스에서 동일한 레코드의 두 개의 데이터베이스 삽입물을 만들 수있는 이전 사내 시스템에서 문제가 발생했습니다. 상태; 마지막으로 실행되는 것은 주요 키 위반으로 실패합니다. 몇 가지 솔루션과 해킹이 제안되고 논의되었습니다.
웹 페이지의 JavaScript를 사용하여 첫 번째 클릭에서 링크를 비활성화하여 두 번째 클릭을 완화하십시오. 이것은 문제의 발생을 줄이는 빠르고 쉬운 방법이지만 완전히 제거하지는 않습니다.
트랜잭션에서 심한쪽에 요청 실행을 감싸십시오. 이는 문제 테이블의 서버로드 및 잠금 레벨로 인해 작동이 너무 비싼 것으로 간주되었습니다.
실패한 삽입물에 의해 던져진 기본 키 예외를 잡아서 식별 한 다음 먹습니다. 이는 (a) 공급 업체 잠금의 단점이 있으며, 데이터베이스 별 예외의 뉘앙스를 알아야하며 (b) 합법적 인 데이터베이스 실패를 기록/처리하지 않을 수 있습니다.
삽입이 실패한 경우 레코드를 업데이트하려고 시도하고 업데이트 결과를 확인하여 1 레코드가 영향을 받는지 확인하여 #3의 확장.
고려되지 않은 다른 옵션이 있습니까? 간과 된 옵션의 장단점이 있습니까? 모든 악의 덜 적은 것은 무엇입니까?
해결책
다른 팁
숨겨진 필드의 페이지에 고유 식별자를 넣으십시오. 주어진 고유 식별자로 하나의 응답 만 수락하십시오.
서버 상태를 수정하라는 GET 요청을 오용하는 것 같습니다 (반드시 그렇지는 않지만). 상황에 적합하지는 않지만 링크를 양식 게시물로 변환하는 것을 고려해야합니다.
당신이 이미 당신의 질문에 대답 한 것 같습니다. #1은 유일한 실행 가능한 옵션 인 것 같습니다.
그렇지 않으면 실제로 세 단계를 모두 수행해야합니다. 데이터 무결성은 데이터베이스 수준에서 처리되어야하지만 데이터베이스에 대한 왕복을 피하기 위해 코드의 추가 점검 (예 : 명시 적 트랜잭션)은 성능에 적합 할 수 있습니다.
ref 동기화 토큰 패턴을 구현해야합니다.
이것은 Java가 아닌 JavaScript/HTML 용입니다