避免根据Firebase数据库中的时间戳同步碰撞

时间:2016-08-02 14:53:00

标签: firebase firebase-realtime-database

我需要从大型对象列表中执行某种计算。当新用户将项目添加/删除/更新到列表时,我需要执行计算。我从列表中检查上次修改的时间戳,并仅在需要时执行计算。因此,例如,我基于时间戳1000生成计算。如果某人修改了列表项,则其时间戳将改变,如果是> 1000,然后我将进行计算。

然而,对于添加和删除,它工作正常。但是,当遇到离线工作失败时,我遇到了一个奇怪的情况。

因此,这是具有用户(用户A和用户B)所具有的初始值的项目列表。总价值为: 600 基于最大的last_modified: 3000

enter image description here

现在,两个用户都处于脱机状态并且离线编辑:

  1. 用户A 编辑 item1 ,时间戳 4000 ,值 400 。因此,基于最大的last_modified 4000

  2. ,总价值变为 900
  3. 用户B 在时间戳 5000 时修改了值 500 item3 。因此,基于最大的last_modified 5000

  4. ,总价值变为 800

    目前两个用户都处于脱机状态,因此服务器没有任何更新。它在用户的本地数据库中看起来像这样:

    enter image description here

    现在首先用户B 上线。并将其数据同步到firebase数据库。所以在服务器上我们有总价值: 800

    用户A 上线时会发生这种情况:

    • 更新服务器上的 item1
    • 从服务器获取总计和第3项
    • 检查总需要更新。生成的总时间戳表示在 5000 时生成的总计。所以这是最新的。无需更新。
    • item1 在服务器上更新时,用户B将获取更改并检查是否需要更新总计。但似乎很好,因为生成的总时间戳 5000 ,当前总数也表示它是在 5000 上生成的。

    因此,两个用户都包含以下内容:

    enter image description here

    但是,实际总数应为: 1100 。但是,它将 800 。重新计算不会发生,因为生成的总时间戳表示它是在 5000 时间戳生成的,当前最大的是 5000 。所以它假设总数是从 5000 生成的并且它是正确的。

    仅在修改数据是性能时才会进行原因计算。 1000 记录需要几乎 3秒才能执行计算。它会随着时间的推移而变大。因此,它不应该成为瓶颈。

    我该如何解决这个冲突?

    任何帮助将不胜感激。

    非常感谢你。

0 个答案:

没有答案