在初始同步后发生同步时,对一个订阅服务器上的数据所做的更改可能会与对其他订阅服务器或发布服务器上的数据所做的更改发生冲突。当您创建发布时,可以分配一个冲突解决程序来处理这些冲突。
检测冲突
当发生同步时,运行在发布服务器上的合并代理会检测任何数据冲突,然后根据与该发布关联的冲突解决程序来确定接受并传播到其他站点的数据。
Microsoft 在与 SQL Server 2005 发布服务器同步时,SQL Server 2005 Compact Edition (SQL Server Compact Edition) 支持行级和列级跟踪。当与 SQL Server 2000 发布服务器同步时,SQL Server Compact Edition 仅支持行级跟踪。
SQL Server Compact Edition 中的行级跟踪
当与 SQL Server 2000 发布服务器同步时,SQL Server Compact Edition 数据库引擎会在插入、更新或删除任何行时调用跟踪。检测到行级冲突时,对相应的行所做的更改都被认为是一个冲突,不管所做的更改是否针对同一列进行。例如,在发布服务器上对某行的地址列进行一个更改,同时在订阅服务器上对相应行的电话号码列进行更改。利用行级跟踪,会检测到冲突,因为更改都是针对同一行进行的。
![]() |
---|
即使配置 SQL Server 2000 发布服务器使用列级跟踪,SQL Server Compact Edition 也会标记行,如同每一列均发生更改一样。只有 SQL Server 2005 发布服务器才支持列级跟踪。 |
使用冲突解决程序
在检测到冲突后,合并代理会启动为该项目选择的冲突解决程序。这可能是默认的冲突解决程序、其他来源的冲突解决程序或者自定义的冲突解决程序。根据冲突解决程序的规则选择接受的更改。SQL Server Compact Edition 订阅服务器冲突始终会被检测到,并在发布服务器中进行解决,然后记录下来。
![]() |
---|
现在,在同步过程中多用户访问允许数据更改。这些更改可能会引起客户端冲突。可以在订阅服务器上检测到客户端冲突,但不能解决冲突。下一次同步时在发布服务器上会重新检测到该冲突并给予解决。有关详细信息,请参阅多用户访问和同步。 |
冲突解决程序可以使用数据更改的源或订阅服务器的优先级值来解决冲突。例如,默认冲突解决程序会遵循这样的规则:发布服务器上的更改始终覆盖订阅服务器上的更改。您可以选择使用不同的冲突解决程序,始终使用订阅服务器上的更改覆盖发布服务器上的更改。
![]() |
---|
SQL Server Compact Edition 客户端始终具有优先级值 0。因此,基于优先级值的冲突解决程序将不会优先考虑在设备上的更改。 |
有关冲突检测和解决的详细信息,请参阅 SQL Server 联机丛书中的“Merge Replication Conflict Detection and Resolution”。
![]() |
---|
SQL Server Compact Edition 订阅不支持基于存储过程的合并冲突解决程序。 |
使用自定义冲突解决程序
自定义冲突解决程序允许将业务逻辑添加到复制中。自定义冲突解决程序是在托管代码或本机代码中构建的 DLL。若要使用自定义冲突解决程序,必须使用存储过程 sp_registercustomeresolver 在发布服务器和运行 IIS 的服务器上注册该冲突解决程序。sp_registercustomeresolver 存储过程包括 is_dotnet_assembly 参数;对于在托管代码中生成的冲突解决程序,将该参数设置为 True,对于本机 DLL,将该参数设置为 False。
重要提示 除了在运行 SQL Server 的计算机上进行注册外,自定义冲突解决程序还必须在运行 IIS 的计算机上进行注册。