在服务器和多个客户端之间同步数据库更改

Posted

技术标签:

【中文标题】在服务器和多个客户端之间同步数据库更改【英文标题】:sync database changes between server and multiple clients 【发布时间】:2015-07-29 06:27:27 【问题描述】:

我有一个主 SQL Server 数据库(在线托管),它同步数据并将数据提供给多个客户端(这些客户端依次处理相同的数据)。一些客户端将持续连接到互联网(并且可以立即同步到主服务器),但其他客户端将在某些时期(最多几天)无法访问数据库。 我在每台机器上都有一个本地 MS Access 数据库(主要用于工作,并且将在可用时与主服务器同步),我想知道如何将所有内容同步在一起而不丢失任何数据?有些客户端几天都不会连接,并且可能会编辑与持续连接的客户端相同的行,当连接到互联网时我将如何同步以不丢失它们之间的数据?

由于与 MS Access 文件和 SQL server db 不兼容,我计划将所有数据带到 DataTables 并像这样管理它们,然后再将信息发送回数据库(因此它会使 sql server 更改跟踪不可能的)。我听说过 Microsoft 的 Sync Framework(但到目前为止一无所获)。我确实考虑过在计算机本地手动存储执行的语句,然后在连接到 Internet 时执行它们(但这可能会用从未有机会同步的旧数据覆盖新数据)。我不知道该怎么做,如果我能解决这些问题,我将不胜感激。

感谢您的帮助!

【问题讨论】:

为什么不将日期时间与 MsAccess 和 SQL 服务器中的数据一起存储?当离线客户端最终获得互联网连接时,您只需将具有 DateModified 日期 > 的 MsAccess 数据同步到 Sql Server 数据 【参考方案1】:

不打算作为一个全面的答案,但这对于评论来说太长了:

程序员必须想出适用于用户期望的数据类型的合理合并规则,并且必须创建他的框架来支持这些规则的合并。没有适用于所有数据的 X 计划。

三种不同的值类型,每种都有一个示例,只有程序员可以根据他对数据的了解来决定。

例如一个 int:客户端 A 和客户端 B 得到值 1。 它可能包含最后一个值:客户端 A 在 7 月 28 日编辑为 4,并在 8 月 2 日同步到服务器。客户端 B 在 7 月 29 日编辑为 3,并在 7 月 29 日同步。服务器到底应该包含哪一个?如果客户端 C 在客户端 A 同步并编辑为 7 之前获得 3 怎么办? 当然也可以是计数器:Client A 加了 3,Client B 加了 2,两者同步后,server 应该包含 6。

A 日期值:客户端 A 在 7 月 28 日编辑并在 8 月 2 日同步,客户端 B 在 7 月 29 日编辑并在 7 月 29 日同步。可能有两个简单的值:它可能是 LastEditOn 字段,它应该包含客户端 B 设置的日期,或者是 LastSyncOn 字段,它应该包含客户端 A 设置的日期。

文本字段:两个客户端都获得“文本”。 客户端 A 在 7 月 28 日更改为“SomeText”,并在 8 月 2 日同步。 客户端 B 于 7 月 29 日更改为“TextEtc”,并于 7 月 29 日同步。

根据您的需要,您可以合并到:

文字等 一些文本 一些文本等 一些文本 B:TextEtc的不可合并编辑 文字 由 A 编辑:SomeText B编辑:TextEtc 文字 B 编辑:TextEtc 由 A 编辑:SomeText

仅列举几种可能性。

你看,程序员(还)不是多余的。对于每种记录类型和每条数据,您必须决定如何将所有可能的更改合并为一个合理的新单个值。 我们无能为力,因为我们不知道您的数据到底是什么。

我们可以说:您肯定需要记录上次更改的日期。您可能还需要某些字段上次更改的日期,或者某些字段包含的上次与服务器同步的时间。

在无法进行合理合并的情况下,您必须使用 。当数据被锁定在服务器上时,某个客户端只能更改该数据。由于客户可能会在其间走开,因此您的锁只能保持一段时间。

【讨论】:

以上是关于在服务器和多个客户端之间同步数据库更改的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个 linux 服务器之间同步数据 [关闭]

CloudKit:使用通知使更改在多个设备之间保持同步

如何使用 MySQL 在多个客户端之间高效地同步数据?

AngularJS 在服务器和客户端之间自动同步数据

使用带有 Core Data 的脏标志与服务器同步

如何在android上保持服务器和客户端之间的数据同步?