同步两个没有原子性的数据库主键

时间:2015-10-26 10:57:39

标签: database algorithm

考虑两个数据库A和B,其中行具有公共主键(PK)。两个数据库只能由函数return all keys of items [X,Y[查询。密钥是非顺序的,因此该查询可以返回,例如

>>> get_Akeys(0, 5)
>>> [20, 21, 23, 24, 25]
>>> get_Bkeys(0, 5)
>>> [20, 21, 23, 24, 25]

随着时间的推移,数据库A会发生变化(B没有):它有行添加(始终使用增量PK)和行已删除(任何有效的PK)。目的是使数据库B与A保持同步。为此,可以向数据库B添加行A - B(设置减法),并删除行B - A

不幸的是,我们无权访问完整数据库A:禁止get_Akeys(0, 10**10)格式的查询,因为| A |太大了因此,一种策略是砍掉它,例如getA(i) = get_Akeys(i*N, (i + 1)*N)其中N是常量,并按顺序查询。

但是,这会破坏请求的原子性:考虑A = [20,21,22,25,26,27,28]B = [20,21,22,25,26,27] N = 3以及此事件序列:

  1. getA(0) == [20,21,22] == getB(0)(一切正确)
  2. A.delete_key(22) # getA(0) becomes [20,21,25]
  3. getA(1) == [26,27,28] != [25,26,27] == getB(1)
  4. 在3.中,结果意味着应该从B中删除元素25(错误),并且应该添加元素28(正确)。

    有关如何使用上述约束同步两个数据库的任何想法?

    在我的用例中,每个getA花费约1分钟用于我正在使用的N,获取所有条目需要约100个查询N / | A |我正在使用,同步可能需要2天才能完成。

1 个答案:

答案 0 :(得分:1)

不要将getA()限制为最多返回固定的数量键,而是将其限制为返回特定范围内的。然后,# getA(0) becomes [20,21,25]运行后,A.delete_key(22)永远不会发生getA(0) = [20,21]。 25仍然属于下一组。

根据你的定义("返回项目的所有键[X,Y ["," getA(i)= get_Akeys(i * N,(i + 1)* N&# 34;),无论如何你必须做的事情,所以我对这个问题感到困惑。