2012-06-07 98 views
0

我在移動數據庫上有一個本地數據庫。每隔幾分鐘,設備就會查看其表格,並通過REST界面向服務器發送未標記爲已上傳的任何數據。下面是一個例子表:通過REST接口保持數據庫一致性

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

什麼得到通過REST接口發送的是:

name : "bob", phone : "444" 

,服務器會響應:一旦這個 「OK」 的消息是

status : "OK" 

由移動設備接收,它會將這些記錄標記爲uploaded=1。這應該很好地保持設備與實際發生的一致。問題在於服務器可能會從移動設備接收到這些消息中的兩條(無論出於何種原因),並且會將具有完全相同數據的兩條記錄插入到服務器數據庫中。

有什麼方法可以防止發生這種情況?

我想到了服務器數據庫中所有字段的唯一性索引,但我覺得必須有更好的方法。

+0

爲什麼當你只需要一個時發送兩條更新消息?這是你必須解決的問題 –

+0

好吧,任何數量的事情都可能導致意外的「雙重發送」:錯誤的連接,在服務器響應之前意外按下「上傳」兩次。無論如何,你不能放過它。 – you786

回答

0

您可以在服務器端或客戶端處理此問題。

正如您已經注意到的那樣,您可以避免在服務器組件上出現重複記錄,只需在數據庫表上添加UNIQUE約束即可。因此,每次嘗試在DBMS上存儲重複的消息時,數據庫都會發出抱怨。

在客戶端,您只需要在移動數據庫表中添加一個STATE列:此列應該只支持三個值:UPLOAD_PENDING,UPLOAD_IN_TRANSIT和UPLOAD_FINISHED。此列旨在替換您的UPLOADED字段,並應在創建元組(UPLOAD_PENDING)時更新,您已經開始上傳(UPLOAD_IN_TRANSIT)並上傳完成(UPLOAD_FINISHED)。在開始新的上傳之前,您應該檢查狀態字段值以避免重複的消息問題。

您可以選擇任何一種方法,但我強烈建議您同時使用這兩種方法。

+1

我最終發送了本地數據庫的id以及其餘的信息,並在服務器數據庫的'local_id'字段創建了一個唯一的約束。 – you786