我有一个应用程序(vb.net),它从用户收集数据并将数据本地存储在他们的笔记本电脑上,直到他们与中央SQLServer 2008数据库同步。同步需要在两个方向上。所以现在,我在每条记录上都有一个时间戳,当该记录更新时,它会被设置。然后我比较记录的时间,看看哪个是最近的。如果笔记本电脑上的记录比中央数据库上的记录更新,笔记本电脑记录将被发送。如果中央数据库上的记录比笔记本电脑更新,该记录将被发送到笔记本电脑。
我有大约15张桌子上有数十万条记录。如果您是本地网络,则需要3到4分钟才能完成所有这些操作。远程用户的问题确实变得更糟。它们需要20到30分钟才能同步。通过VPN。
我有大约5个用户这样做,他们都需要通过中央数据库相互保持相同的信息。它们都同步到中央数据库,而不是彼此同步。
除了比较时间戳之外,还有更好的方法来检查每条记录吗?
感谢。
答案 0 :(得分:1)
在我看来,时间戳不是确定将哪些记录发送给另一方的方法。
虽然它们可能对解决冲突“没问题”,但同步方(计算机)上的时间差异可能会导致记录被发送出去,从而导致实际问题。
我自己在一个特定的表上使用一个标识列(在服务器端)生成序列nr,并且在每个事务中,我得到一个新的序列号,并将其分配给其他表的所有更新/插入的行需要同步。
现在,当客户端请求同步时,它会向服务器提供上次同步时收到的最新“序列”,如果是第一次,则为0。
服务器将仅发送序列号较大的记录,然后确定实际发送到客户端的那些记录上的最高序列号,并将该号码提供给客户端以用于下一次同步请求。
在我的场景中,冲突解决是在客户端完成的,因为无论如何所有业务逻辑都是他们的,这意味着客户端总是在开始发送更新之前先收到更新。
因为您为每个事务使用一个新生成的序列号,所以在每次同步期间保持参照完整性,但要确保实际为真, 您需要在开始发送同步数据之前确定当前最高的序列号,并且永远不会检索高于此数字的任何记录,否则您可能会破坏参照完整性。
这是因为,在你已经查询Orders而不是OrderItems之后,其他一些线程可能已经提交了Orders和OrderItems的插入,在没有订单的情况下,你的向外同步包中有OrderItems。
对于删除,我使用IsDeleted列,服务器保留记录一段时间才真正被删除。
当客户端插入数据时,我会向他们反馈记录给定的哪些(主要)密钥等等。
嗯,还有更多内容,我可以在这里提一下,但这里有一些关键的想法,你应该仔细观察:
如何预防:
祝你好运,希望这能为思想提供食物......