문제

팀 구성원은 웹 페이지의 링크를 두 번 클릭하면 브라우저에서 두 개의 요청을 전송하여 레이스에서 동일한 레코드의 두 개의 데이터베이스 삽입물을 만들 수있는 이전 사내 시스템에서 문제가 발생했습니다. 상태; 마지막으로 실행되는 것은 주요 키 위반으로 실패합니다. 몇 가지 솔루션과 해킹이 제안되고 논의되었습니다.

  1. 웹 페이지의 JavaScript를 사용하여 첫 번째 클릭에서 링크를 비활성화하여 두 번째 클릭을 완화하십시오. 이것은 문제의 발생을 줄이는 빠르고 쉬운 방법이지만 완전히 제거하지는 않습니다.

  2. 트랜잭션에서 심한쪽에 요청 실행을 감싸십시오. 이는 문제 테이블의 서버로드 및 잠금 레벨로 인해 작동이 너무 비싼 것으로 간주되었습니다.

  3. 실패한 삽입물에 의해 던져진 기본 키 예외를 잡아서 식별 한 다음 먹습니다. 이는 (a) 공급 업체 잠금의 단점이 있으며, 데이터베이스 별 예외의 뉘앙스를 알아야하며 (b) 합법적 인 데이터베이스 실패를 기록/처리하지 않을 수 있습니다.

  4. 삽입이 실패한 경우 레코드를 업데이트하려고 시도하고 업데이트 결과를 확인하여 1 레코드가 영향을 받는지 확인하여 #3의 확장.

고려되지 않은 다른 옵션이 있습니까? 간과 된 옵션의 장단점이 있습니까? 모든 악의 덜 적은 것은 무엇입니까?

도움이 되었습니까?

해결책

동기화 토큰 패턴을 구현해야합니다.

작동 방식 : 각 요청에 대해 값 (토큰)이 서버에서 생성됩니다. 그런 다음 동일한 토큰이 양식 제출에 포함되어야합니다. 요청을 받으면 서버 토큰 및 클라이언트 토큰을 비교하고 동일하면 레코드를 계속 추가 할 수 있습니다. 그런 다음 서버 측 토큰이 재생되므로 이전 토큰이 포함 된 후속 요청이 실패합니다.

반쯤 아래로 내려가는 더 철저한 설명이 있습니다 이 페이지.

어떤 기술을 사용하고 있는지 잘 모르겠지만 Struts는이 패턴에 대한 프레임 워크 레벨 지원을 제공합니다. 예를 참조하십시오 여기

다른 팁

숨겨진 필드의 페이지에 고유 식별자를 넣으십시오. 주어진 고유 식별자로 하나의 응답 만 수락하십시오.

서버 상태를 수정하라는 GET 요청을 오용하는 것 같습니다 (반드시 그렇지는 않지만). 상황에 적합하지는 않지만 링크를 양식 게시물로 변환하는 것을 고려해야합니다.

당신이 이미 당신의 질문에 대답 한 것 같습니다. #1은 유일한 실행 가능한 옵션 인 것 같습니다.

그렇지 않으면 실제로 세 단계를 모두 수행해야합니다. 데이터 무결성은 데이터베이스 수준에서 처리되어야하지만 데이터베이스에 대한 왕복을 피하기 위해 코드의 추가 점검 (예 : 명시 적 트랜잭션)은 성능에 적합 할 수 있습니다.

ref 동기화 토큰 패턴을 구현해야합니다.

이것은 Java가 아닌 JavaScript/HTML 용입니다

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top