首页 > 代码库 > SymmetricDS文档翻译--【Chapter 3. 详细配置(Configuration)[section D]】

SymmetricDS文档翻译--【Chapter 3. 详细配置(Configuration)[section D]】

1.6.     Conflicts

3.7.1. Conflict Detection and Resolution

冲突的检测和解决是SymmetricDS 3.0的新特性。冲突检测是决定是否插入,更新或者删除的策略。冲突是因为目标数据与在源节点先前插入、更新或删除的数据不一致。解决冲突就是当检测到冲突时决定做什么。
冲突检测和解决策略配置在CONFLICT表中。至少为一个NODE_GROUP_LINK配置这个冲突策略。这些配置信息仅限于一个CHANNEL或一个表。
冲突检测通过CONFLICT表中的detect_type和detect_expression列指定。detect_expression的值依赖于detect_type的值。当数据被加载到目标系统的时候执行冲突检测。

USE_PK_DATA
表明仅使用主键来检测冲突。如果已经存在一个相同主键的行,在更新和删除过程中将不会检测到冲突。更新和删除一行数据仅使用主键的列来处理。如果在插入时一行数据已经存在,将会检测到冲突。

USE_OLD_DATA
表明将使用一行数据的各个列的旧值来检测冲突。旧数据是这行数据在源节点中在变化之前的值。如果在目标系统上存在与旧数据相同的一行数据,在更新和删除时,将不会检测到冲突。如果在插入是一行数据已经存在,将会检测到数据冲突。
注意,一些平台不知道二进制列的比较。在下列平台下,不会对二进制列的冲突检测:DB2,DERBY,ORACLE和SQLSERVER。

USE_CHANGED_DATA
跟上边相反。

USE_TIMESTAMP
判断条件是主键+时间戳列。

USE_VERSION
判断条件是主键+一个版本号列。

Important
注意,在表对应的Trigger上,use_stream_lobs被设置为true时,冲突检测将不会检测二进制类型的列,此外,一些数据库不允许二进制类型的列的比较,不管use_stream_lobs是否被设置为true。
可以在CONFLICT表的resolve_type列,配置如何处理冲突检测。可以配置两个可选的Boolean类型的值,resolve_row_only和resolve_changes_only,下面讨论这个解决方案的设置。

FALLBACK
表明当检测到冲突的时候,系统应该自动的应用变化后的数据。如果源节点的操作是插入,将会尝试更新数据。如果源节点中的操作是更新,但是目标节点这行数据不存在,然后将在目标节点尝试插入操作。如果源节点的操作室删除,但是目标节点中这行数据不存在,然后目标节点的这个删除操作将被忽略。Resolve_changes_only标识控制在一次fallback操作中,是所有的行都被更新还是只更新已经发生变化的列。

IGNORE
表明当检测到冲突时,系统将自动忽略。Resolve_row_only列控制是整个batch都被忽略还是只忽略这一行数据。

MANUAL
表明当检测到冲突的时候,整个Batch将保持错误状态直到手工介入。一行错误的数据会被插入到INCOMING_ERROR表中。此次冲突检测的标识(例如CONFLICT表中的conflict_id)将会被记录,同时还会记录旧的数据,新的数据和当前数据(当前数据是指在目的节点意外的数据,这些数据不想期望的那样不匹配旧的数据)到old_data,new_data和cur_data中。为了解决冲突,resolve_data列可以被手工的填充以代替原始的数据,这将被用来进行下一次加载尝试。Resolve_ignore标识将被用来表明下一次加载时,这一行数据是否应该被忽略。

NEWER_WINS
表明当使用USE_TIMESTAMP或者USE_VERSION方式检测到冲突的时候,将会使用更新的时间戳或者更高版本的数的数据更新目标节点的数据。
对于配置的每一个冲突检测策略,你可以控制是否以及多少被解决冲突后的数据被发送回数据冲突所在的节点。可以设置ping_back列为下面的值中的一个来控制这个策略:

OFF
没有数据被发送回原始节点,即使被解决的数据也不匹配节点发送的数据。

SINGLE_ROW
一个Batch中的一行导致冲突然后被解决的数据发送回原始节点

REMAING_ROWS
一个batch中发生冲突然后被解决的一行数据,与整个Batch中剩下的数据一起,被发送回原始节点。

SymmetricDS文档翻译--【Chapter 3. 详细配置(Configuration)[section D]】