在我的申请中,我有:
用户可以使用多个客户端。每个客户端都可以创建和更新用户的任何内容。来自用户的请求由服务器异步处理。
问题:如何同步用户的数据?
第一个想法:整数作为版本号。用户的客户端已保存其当前版本号。在同步服务器上发送版本高于客户端当前版本的数据。客户端将其当前版本从收到的数据更新为最高版本。
它不起作用:可以进行异步修改:mod1和mod2。两者都从版本X开始。如果mod1结束,那么客户端之一同步(它获得版本X + 1)然后mod2结束(版本X + 1),此客户端永远不会在mod2中修改数据。
我无法找到解决方案,无论如何都会有效。
有什么模式可以做这样的事情吗?
我需要使用MS SQL和Azure SQL数据库以及带有实体框架的VS C#服务器。
答案 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
数据类型的工作方式相同 - 如果有人在此期间增加了版本,则您的更新不会更新任何内容。