1

我想为一个中心节点和许多使用SymmetricDS的客户实现多主双向同步。客户端只与中心节点通信(星形拓扑)。我在处理主键冲突时遇到了问题。SymmetricDS - 冲突解决

例如数据库包含表 “人” 的列ID,姓名,......在中央分贝我行:

  1. AAA
  2. BBB
  3. CCC

第一客户端连接并下载初始负载,所以它具有相同的分贝。第二个客户端也一样。

现在第一个和第二个客户端在其本地数据库中创建新行。 第一:

  1. AAA
  2. BBB
  3. CCC
  4. DDD

二:

  1. AAA
  2. BBB
  3. CCC
  4. EEE

他们会尝试同步,但在4排冲突。这种冲突可以SymmetricDS很容易检测,但现在我想通过增量键,直到它插入来解决它,然后更改发送回客户端... 那么结果将是:

  1. AAA
  2. BBB
  3. CCC
  4. DDD
  5. EEE

在每个数据库中。如何做呢?谢谢。

回答

3

当处理多主双向场景时,使用自动递增PK不是一个好主意。

标准做法是为PK创建GUID以避免客户之间的冲突。

请参考以下网站了解更多详情。

Selecting an Appropriate Primary Key for a Distributed Environment

+0

我知道,但不幸的是,我的工作对现有项目(学校项目)和我做的只是很小的一部分,在这里我想开发同步机制,以取代现有的有限的同步。 有人可以认为'INSERT'上的冲突是中心节点的星形网络中的常见问题,所以SymmetricDS将实现一些简单的机制来解决它们。也许可以使用IDatabaseWriterFilter(5.10.2)或使用转换数据(4.8)来完成。但我无法找出如何。 – user2275785

+0

您使用的是哪个数据库?你能插入一条记录并指定你自己的PK吗?你在处理什么样的数据量?多久记录插入一次pk?有时你可以划分自动增量PK的范围,并启动每个客户端节点一个不同的起始位置。根据你的数据库,这可能就像插入一条记录一样简单,PK列包含在你希望该节点开始递增的位置。 –

+0

中心节点正在使用PostgreSQL,客户端正在使用Apache Derby。无法确定一个客户端可以使用哪个范围(客户端数量未知)。在以前的客户端版本中,非常有限的同步不足(只有INSERT没有外键)。碰撞通过“重新映射”id到由中心节点确定的新ID来解决,并且新的id被发送回存储在“remote_id”列中的客户端。我想这个数据库将来会包含大量的数据,并且会发生许多冲突......用户也可以使用web应用程序直接与中央数据库一起工作。 – user2275785