同步两个数据库源的算法?

时间:2014-02-12 16:12:24

标签: ios algorithm sqlite postgresql sync

我有一个iOS SQLite数据库,它是Postgres 9.3 DB(主服务器)的镜像。这是一个发票应用程序。

这个应用程序将有几个SQLite DB正在更新,并最终将与主DB同步(有时几个小时后)。主要活动是发票,其中有发票标题 - 发票行 - 付款关系。最新数据是首选数据,我不关心冲突解决方案(因为每个设备都会生成自己的发票集,并且两个不同的客户端同时编辑同一条记录的情况非常少见。) / p>

我几乎可以使用它,但边缘情况使得这很难测试。另外,我怀疑这个问题已经解决了。此外,我希望建立一个测试套件,让我测试数百个客户与十几个主人交谈,并且特别做事并不是一个好主意。

这就是我现在所拥有的:

https://gist.github.com/mamcx/8958295

我的代码执行此操作:

  1. 创建GUID和记录表的最新版本的Version字段(autoinc,int)。每次更改都会增加版本。删除都是合乎逻辑的。这是在两个DB中:

    插入“文件”(     “版”,     “改变日期”,     “请将isDeleted”     “ID”,

    )VALUES(     129,     '2014-02-11 16:16:49.775791-05',     '0',     '0771bc29-ac5e-49a1-b5d7-3e4f7dccd03a',

    );

  2. 保存客户端中每个表的版本。请求具有客户端版本的表,并且服务器返回记录>版本,然后将它们与本地数据库合并。

  3. 更改在客户端完成。将记录与服务器中每行记录的最新版本一起发送到服务器。更新记录并返回每个记录的版本。

  4. 但是,有时在服务器中我获得的行数多于客户端中的行数,或者当两个不同的设备在流程结束时交换数据时,数据不相同。该过程处于后台,无需用户干预。

1 个答案:

答案 0 :(得分:0)

我怀疑由于server.py

中的这一行,您有时会得到太多行
sql = table.select().where(table.c.version >= version)

如果在您检索版本号的时间与此查询完成执行的时间之间更新了表,那么您可能会获得该表的两个或更多版本 - 您可以在查询完成后尝试过滤掉重复项,或者您可以按版本号按递增顺序对数据进行排序,以便在早期版本之后迭代更高版本 - 您将多次同步某些表,但是您将在任何早期版本之后同步最新版本,因此这不应该不成问题。

数据不相同的问题可能只是因为您的同步不是原子的 - 在同步期间更新了源,因此在同步完成时它们可能具有比目标更新的数据。这也可能是在server.py的第31行返回表的多个版本的早期问题的副作用 - 您可能会覆盖具有早期版本的表的更高版本,您可以通过筛选或排序查询来防止结果

记录从源同步的数据(或只是表ID和版本),如果您有多个版本的表,则过滤掉除最新版本以外的所有版本 - 然后在同步后过滤此数据不匹配目的地中的数据然后你就会知道出了什么问题。