是否有任何可靠的版本化数据模式

时间:2014-02-12 14:22:11

标签: design-patterns synchronization data-synchronization

在我的申请中,我有:

  1. 用户。
  2. 数据库存储用户的列表(用户有id,我有表ListOfSth包含已归档的user_id)。
  3. 服务器向用户发送数据。
  4. 客户 - 用户方面的应用。
  5. 用户可以使用多个客户端。每个客户端都可以创建和更新用户的任何内容。来自用户的请求由服务器异步处理。

    问题:如何同步用户的数据?

    第一个想法:整数作为版本号。用户的客户端已保存其当前版本号。在同步服务器上发送版本高于客户端当前版本的数据。客户端将其当前版本从收到的数据更新为最高版本。

    它不起作用:可以进行异步修改:mod1和mod2。两者都从版本X开始。如果mod1结束,那么客户端之一同步(它获得版本X + 1)然后mod2结束(版本X + 1),此客户端永远不会在mod2中修改数据。

    我无法找到解决方案,无论如何都会有效。

    有什么模式可以做这样的事情吗?

    我需要使用MS SQL和Azure SQL数据库以及带有实体框架的VS C#服务器。

1 个答案:

答案 0 :(得分:1)

在MS SQL服务器上,您有一个方便的数据类型timestamp,可以让您轻松完成此操作。更新将如下所示:

update [table] set ... where [Id] = @Id and [Version] = @Version;

(如果更新通过,版本将自动更新,因此您无需手动更改)

因此,如果有人在此期间修改了行,这将修改零行(您可以轻松地检查这一行),如果没有,您将推送您的更改并且版本号自动具有新值。

即使您没有类似timestamp数据类型的内容,只要您在单个更新中进行更改(或者,根据事务模型,单个事务),该方法仍然有效。这里的关键是where子句,如果DB中的版本不是您在开始更改之前加载的版本,则禁止您更改任何内容。使用它,你可以简单地做

update [table] set ..., [Version] = @Version + 1 
where [Id] = @Id and [Version] = @Version;

这实际上与timestamp数据类型的工作方式相同 - 如果有人在此期间增加了版本,则您的更新不会更新任何内容。