通过REST接口保持数据库一致性

时间:2012-06-07 21:08:10

标签: database mobile

我在移动数据库上有一个本地数据库。每隔几分钟,设备就会查看其表并通过REST接口向服务器发送任何未标记为已上载的数据。这是一个示例表:

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

通过REST界面发送的内容是:

name : "bob", phone : "444" 

,服务器将回复:

status : "OK"

移动设备收到此“确定”消息后,会将这些记录标记为uploaded=1。这应该可以正常工作,以保持设备与实际发生的一致。问题是服务器可能会从移动设备接收其中两条消息(无论出于何种原因),并将两条完全相同的数据插入服务器数据库。

有什么方法可以阻止这种情况发生?

我想到了服务器数据库中所有字段的唯一性索引,但我觉得必须有更好的方法。

1 个答案:

答案 0 :(得分:0)

您可以在服务器端或客户端处理此问题。

正如您已经注意到的那样,您可以避免在服务器组件上重复记录,只需在数据库表上添加UNIQUE约束,也可以在ID列中添加。有了这个,每当你尝试在DBMS上存储重复的消息时,数据库都会抱怨。

在客户端,您只需要在移动数据库表上添加一个STATE列:此列应仅支持三个值:UPLOAD_PENDING,UPLOAD_IN_TRANSIT和UPLOAD_FINISHED。此列旨在替换您的UPLOADED字段,并且应在创建元组时更新(UPLOAD_PENDING),您已经开始上传(UPLOAD_IN_TRANSIT)并且上传已完成(UPLOAD_FINISHED)。您应该在开始新上传之前检查状态字段值,以避免出现重复的邮件问题。

您可以选择任何一种方法,但我强烈建议您同时使用这两种方法。