在服务器和多个客户端之间同步数据库更改
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仅列举几种可能性。
你看,程序员(还)不是多余的。对于每种记录类型和每条数据,您必须决定如何将所有可能的更改合并为一个合理的新单个值。 我们无能为力,因为我们不知道您的数据到底是什么。
我们可以说:您肯定需要记录上次更改的日期。您可能还需要某些字段上次更改的日期,或者某些字段包含的上次与服务器同步的时间。
在无法进行合理合并的情况下,您必须使用 锁。当数据被锁定在服务器上时,某个客户端只能更改该数据。由于客户可能会在其间走开,因此您的锁只能保持一段时间。
【讨论】:
以上是关于在服务器和多个客户端之间同步数据库更改的主要内容,如果未能解决你的问题,请参考以下文章