2012-06-07 3 views
0

모바일 데이터베이스에 로컬 데이터베이스가 있습니다. 몇 분마다 장치는 테이블을보고 REST 인터페이스를 통해 업로드 된 것으로 표시되지 않은 데이터를 서버로 보냅니다.REST 인터페이스를 통한 데이터베이스 일관성 유지

name : "bob", phone : "444" 

서버가 응답합니다 : 다음 REST 인터페이스를 통해 전송됩니다 무엇

id | name | phone | uploaded 
1 | "bob" | "444" | 0 

은 다음과 같습니다이 "OK"메시지가되면

status : "OK" 

여기에 예제 테이블입니다 모바일 장치가 수신 한 경우 해당 레코드를 uploaded=1으로 표시합니다. 이것은 실제로 일어난 것과 장치가 일치하도록 유지되어야합니다. 문제는 서버가 모바일 장치에서 두 가지 메시지 (어떤 이유로 든)를 수신 할 수 있으며 정확히 동일한 데이터가있는 두 개의 레코드를 서버 데이터베이스에 삽입한다는 것입니다.

발생을 막을 수있는 방법은 무엇입니까?

나는 서버 데이터베이스의 모든 필드에 대해 고유성 인덱스를 생각했지만 더 좋은 방법이 있어야한다고 생각합니다.

+0

왜 두 개의 업데이트 메시지가 필요한 경우에만 보내셨습니까? 그게 당신이 해결해야 할 문제입니다. –

+0

실수로 '이중 전송'을 일으킬 수있는 여러 가지 원인이 있습니다 : 잘못된 연결, 실수로 서버가 응답하기 전에 '업로드'를 두 번 누르십시오. 어쨌든, 우연히 그걸 우연에 맡길 수는 없습니다. – you786

답변

0

이 문제는 서버 측 또는 클라이언트 측에서 처리 할 수 ​​있습니다.

이미 알고 계시 겠지만 데이터베이스 테이블에 UNIQUE 제약 조건을 추가하거나 ID 열에 UNIQUE 제약 조건을 추가하기 만하면 서버 구성 요소에 레코드 중복을 피할 수 있습니다. 따라서 DBMS에 중복 메시지를 저장하려고 할 때마다 데이터베이스에서 불평 할 것입니다.

클라이언트 측에서는 모바일 데이터베이스 테이블에 STATE 열을 추가하기 만하면됩니다.이 열은 UPLOAD_PENDING, UPLOAD_IN_TRANSIT 및 UPLOAD_FINISHED의 세 가지 값만 지원해야합니다. 이 컬럼은 UPLOADED 필드를 대체하기위한 것이며, 튜플이 생성되면 (UPLOAD_PENDING), 이미 업로드를 시작했고 (UPLOAD_IN_TRANSIT) 업로드가 완료되면 (UPLOAD_FINISHED) 업데이트되어야합니다. 새 업로드를 시작하기 전에 상태 필드 값을 확인하여 중복 된 메시지 문제를 방지해야합니다.

이 방법 중 하나를 선택할 수 있지만 두 가지 방법을 모두 사용할 것을 강력히 권장합니다.

+1

나는 나머지 정보와 함께 로컬 db의 id를 보내고 서버 db의 'local_id'필드에 고유 제한 조건을 만들었습니다. – you786

관련 문제