当发布服务器和订阅服务器连接并发生同步时,合并代理将检测是否存在任何冲突。 如果检测到冲突,合并代理将使用冲突解决程序(在将项目添加到发布时指定)来确定接受哪些数据并将其传播到其他站点。
注释
尽管订阅服务器与发布服务器同步,但在不同订阅服务器上进行的更新之间通常会发生冲突,而不是在订阅服务器和发布服务器上进行更新。
冲突检测和解决的行为取决于本主题中所述的以下选项:
无论是指定列级跟踪、行级跟踪还是逻辑记录级跟踪。
无论是指定默认的优先级解析机制还是指定条目解析器。 文章解析程序可以是:
用托管代码编写的 业务逻辑处理程序 。
基于 COM 的 自定义解析程序。
由Microsoft提供的基于 COM 的解析程序。
如果使用默认解析机制,行为将进一步由所使用的订阅类型确定:客户端或服务器。
冲突检测
数据更改是否限定为冲突取决于为项目设置的冲突跟踪类型:
如果选择列级冲突跟踪,如果在多个复制节点对同一行中的同一列进行更改,则被视为冲突。
如果选择行级跟踪,如果在多个复制节点对同一行中的任何列进行更改(相应行中受影响的列不需要相同),则被视为冲突。
如果选择逻辑记录级跟踪,则当同一逻辑记录中的任意一行在多个复制节点上被修改时(相应行中受影响的列可以不同),则被视为冲突。
有关详细信息,请参阅 检测和解决逻辑记录中的冲突。
若要为项目指定冲突跟踪和解决级别,请参阅 “指定合并项目的冲突跟踪和解决级别”。
冲突解决
检测到冲突后,合并代理将启动选定的冲突解决程序,并使用冲突解决程序来确定冲突获胜者。 在发布者和订阅者上应用胜出行,而失败行中的数据将被写入冲突表。 冲突在冲突解决程序执行后立即解决,除非你选择以交互方式解决冲突。
解析器类型
在合并复制中,冲突解决发生在项目级别。 对于由多个文章构成的出版物,可以有不同的冲突解决程序提供不同的项目,或者同一冲突解决程序为一篇文章、多个项目或构成出版物的所有项目提供服务。
如果计划使用默认基于优先级的冲突解决程序,则无需设置项目的冲突解决程序属性。 如果要使用项目解析程序而不是默认解析程序,则必须通过选择发布服务器上的可用解析程序来设置将使用它的项目的解析程序属性。 需要传递给解析程序的任何特定信息也可以在解析程序信息属性中指定。
合并复制提供四种类型的冲突解决器:
基于优先级的默认冲突解决程序
默认解析机制的行为方式不同,具体取决于订阅是客户端订阅还是服务器订阅。 将优先级值分配给使用服务器订阅的单个订阅者,在具有最高优先级的节点上所做的更改将解决任何冲突。 对于客户端订阅,写入发布服务器的第一个更改将赢得冲突。
创建订阅后,无法将其从一种类型更改为另一种类型。
业务逻辑处理程序
业务逻辑处理程序框架允许编写在合并同步过程中调用的托管代码程序集。 程序集包括可以响应冲突的业务逻辑,以及同步过程中的许多其他条件。 有关详细信息,请参阅 合并同步期间执行业务逻辑。
基于 COM 的自定义解析程序
合并复制提供了一种 API,用于通过 Microsoft Visual C++ 或 Microsoft Visual Basic 等语言将解析程序编写为 COM 对象。 有关详细信息,请参阅 COM-Based 自定义解析程序。
由 Microsoft 提供的基于 COM 的解析程序
Microsoft SQL Server 包括许多基于 COM 的解析程序。 有关详细信息,请参阅 Microsoft COM-Based 解析程序。
有关如何选择适当类型的冲突解决程序的信息,请参阅 “选择解析程序”。
注释
某些解析程序仅编写为处理特定操作的冲突。 例如,解析程序可以处理更新,但不能插入或删除。 默认基于优先级的冲突解决程序处理项目解决程序未处理的任何冲突。
若要指定合并订阅类型和冲突解决优先级,请参阅
SQL Server Management Studio: 指定合并订阅类型和冲突解决优先级(SQL Server Management Studio)
交互式冲突解决程序
复制提供交互式冲突解决程序用户界面,可与基于优先级的默认冲突解决程序或项目冲突解决程序结合使用。 通过 Microsoft Windows 同步管理器执行按需同步时,交互式冲突解决程序会在运行时显示冲突数据,并允许你选择如何解决冲突。 有关如何启用交互式解决并启动交互式冲突解决程序的详细信息,请参阅 交互式冲突解决。
查看冲突
查看冲突的最直接方法是使用 SQL Server Management Studio 提供的复制冲突查看器(SQL Server 还提供允许查询冲突表的存储过程)。 冲突查看器和交互式冲突解决程序是类似的工具,但交互式冲突解决程序允许你在同步发生时解决冲突,而冲突查看器设计用于在冲突解决后查看冲突。 如果冲突元数据在系统表中仍然可用(冲突元数据默认保留 14 天),则可以替代冲突查看器中的冲突解决结果,但如果经常需要直接干预,请考虑使用交互式冲突解决程序。
注释
涉及逻辑记录的冲突不会显示在冲突查看器中。 若要查看有关这些冲突的信息,请使用复制存储过程。 有关详细信息,请参阅“查看合并发布的冲突信息”(复制 Transact-SQL 编程)。
冲突查看器显示来自三个系统表的信息:
复制在合并项目中为每个表创建一个冲突表,格式为MSmerge_conflict_<PublicationName>_<ArticleName>。
冲突表的结构与它们所基于的表相同。 在这些表中的一个表中,一行表示冲突行的失败版本(该行的成功版本位于实际用户表中)。
MSmerge_conflicts_info表提供有关每个冲突的信息,包括冲突类型。
sysmergearticles 表标识哪些用户表具有冲突表,并提供有关冲突表的信息。
默认情况下,系统会存储冲突信息。
在发布服务器和订阅服务器中,如果发布兼容级别为 90RTM 或更高版本。
在发布方,如果发布兼容级别低于 80RTM。
如果订阅者正在运行 SQL Server Compact,请在发布服务器上进行处理。 冲突数据不能存储在 SQL Server Compact 订阅服务器上。
查看冲突
SQL Server Management Studio: 查看和解决合并发布的数据冲突(SQL Server Management Studio)
复制 Transact-SQL 脚本:查看合并发布内容的冲突信息(复制 Transact-SQL 脚本)