所以我认为总的来说你的问题与断开的同步有关。
所以这就是我认为应该发生的事情:
初始同步 您检索数据和与之相关的任何信息(行版本、文件校验和等)。重要的是您存储此信息并使其保持原始状态,直到下一次成功同步。应在此数据的副本上进行更改。
跟踪更改 如果您正在处理数据库行,那么您基本上必须跟踪插入、更新和删除操作。如果您正在处理像 xml 这样的文本文件,那么它会稍微复杂一些。如果多个用户可能同时编辑此文件,那么您将必须有一个 diff 工具,以便可以在更精细的级别(而不是整个文件)检测到冲突。
检查冲突 如果您只是处理数据库行,那么冲突很容易检测到。每当更新行时,您可以有另一列递增(我认为 mssql 有这个内置函数不确定 mysql)。因此,如果您拥有的副本的编号与服务器上的编号不同,那么您就会发生冲突。对于文件或字符串,校验和将完成这项工作。我想你也可以使用修改后的日期,但要确保你有一个非常精确和准确的测量来防止错过。例如:假设我检索了一个文件,并且您在我检索到它后立即保存它。可以说时间差是 1 毫秒。然后我对文件进行更改,然后尝试保存它。如果记录的最后修改时间仅精确到 10 毫秒,我检索到的文件很有可能与您保存的文件具有相同的修改日期,因此程序认为没有冲突并覆盖您的更改。所以为了安全起见,我一般不会使用这种方法。另一方面,小修改后校验和/哈希冲突的可能性几乎为零。
解决冲突 现在这是棘手的部分。如果这是一个自动化过程,那么您必须评估情况并决定是否要覆盖更改、丢失更改或再次从服务器检索数据并尝试重做更改。幸运的是,似乎会有人际互动。但是编写代码仍然很痛苦。如果您正在处理数据库行,您可以检查每个单独的列并将其与服务器中的数据进行比较并将其呈现给用户。这个想法是以非常精细的方式向用户呈现冲突,以免压倒他们。大多数冲突在许多不同的地方都有非常小的差异,因此一次向用户呈现一个小的差异。因此,对于文本文件,它几乎相同,但要复杂一百倍。所以基本上你必须创建或使用一个差异工具(文本比较是一个完全不同的主题,这里太宽泛了),让你知道文件中的小变化以及它们在哪里以类似的方式在一个数据库:插入、删除或编辑文本的位置。然后以相同的方式将其呈现给用户。所以基本上对于每个小的冲突,用户必须选择是丢弃他们的更改,覆盖服务器中的更改还是在发送到服务器之前执行手动编辑。
所以如果你做对了,如果有冲突的话,应该给用户一个冲突列表。这些冲突应该足够细化,以便用户快速做出决定。因此,例如,冲突是拼写更改,与给用户整个段落并告诉他有更改并且他们必须决定做什么相比,用户从单词拼写中选择会更容易,然后用户将不得不寻找这个小的拼写错误。
其他注意事项: 数据验证 - 请记住,您必须在解决冲突后执行验证,因为数据可能已更改 文本比较 - 就像我说的,这是一个大主题。所以谷歌它!断开同步 - 我认为那里有几篇文章。
Source: https://softwareengineering.stackexchange.com/questions/94634/synchronization-web-service-methodologies-or-papers