可更新订阅的工作机制
事务性复制的可更新订阅允许订阅服务器将更改复制到发布服务器。触发器被添加到订阅数据库中的已发布表中,当在订阅服务器中进行更改时,触发器将激发:
- 对于立即更新订阅,更改直接传播到发布服务器并使用 Microsoft 分布式事务处理协调器 (MSDTC) 应用更改。
- 对于排队更新订阅,更改首先传播到某个队列,然后通过队列读取器代理应用到发布服务器。
发布服务器中发生的更改复制到订阅服务器,其方式与只读订阅服务器的事务性发布的方式相同。有关详细信息,请参阅事务复制的工作机制。
立即更新
立即更新订阅使用下列组件:
- 每个已发布表的跟踪列
在允许可更新订阅的发布中发布表时,会将列 msrepl_tran_version 添加到该表。此列用于更改跟踪和冲突检测。如果订阅服务器更新的数据副本已过时,立即更新中将发生冲突。 - MSDTC
对于订阅服务器中的每个更改,MSDTC 管理提交更改时在发布服务器与订阅服务器之间发生的两阶段提交操作。在所有参与站点中使用两阶段提交操作时,这种方法的可用性限制很小,因为只需要发布服务器是可用的。在发布服务器中使用两阶段提交操作进行更改后,此更改将由分发代理复制到其他订阅服务器。 - 订阅数据库中的表上的触发器
将插入触发器、更新触发器和删除触发器添加到订阅数据库中的每个已发布表中。使用 CREATE TRIGGER 语句的 NOT FOR REPLICATION 修饰符创建触发器,以便由分发代理应用的更改不会激发触发器。有关详细信息,请参阅使用 NOT FOR REPLICATION 来控制约束、标识和触发器。
对于立即更新订阅,触发器还管理订阅服务器中的 identity 列和 timestamp 列的值。作为两阶段提交操作的一部分,这些类型的列的值在发布服务器中生成并传播到订阅服务器。 - 存储过程
创建发布并为立即更新订阅启用该发布时,将为发布数据库中的每个已发布的表创建插入、更新和删除过程。当订阅服务器中发生更改时,复制触发器将通过 MSDTC 向发布服务器中的相应存储过程发出一个远程过程调用,然后将应用此更改。
仅当订阅服务器中的更改与发布服务器中自订阅服务器中次收到更改行的副本后所发生的更改不冲突时,发布服务器中的存储过程才会应用更改。如果检测到冲突,事务将被拒绝并在发布服务器和订阅服务器中回滚。
下图显示了包含立即更新订阅的拓扑中使用的主要组件。
- 订阅服务器中发生的更改由订阅表中的触发器捕获。
- 触发器通过 MSDTC 调用发布服务器中的相应存储过程。
- 如果没有冲突,存储过程将执行插入、更新或删除操作。如果存在冲突,更改将在发布服务器和订阅服务器中回滚。
- 根据分发代理计划,将发布服务器中所做的更改作为从订阅服务器复制更改的结果传播到所有其他订阅服务器。
排队更新
排队更新订阅使用下列组件:
- 每个已发布表的跟踪列
在允许可更新订阅的发布中发布表时,会将列 msrepl_tran_version 添加到该表。此列用于更改跟踪和冲突检测。 - 订阅数据库中的表上的触发器
将插入触发器、更新触发器和删除触发器添加到订阅数据库中的每个已发布表中。使用 CREATE TRIGGER 语句的 NOT FOR REPLICATION 修饰符创建触发器,以便由分发代理应用的更改不会激发触发器。有关详细信息,请参阅使用 NOT FOR REPLICATION 来控制约束、标识和触发器。 - 存储过程
创建发布并为排队更新订阅启用该发布时,将为发布数据库中的每个已发布的表创建插入、更新和删除过程。
存储过程由队列读取器代理调用,以将事务应用于订阅服务器、检测冲突以及根据需要生成补偿命令(将这些命令发布到分发数据库,接着传送到订阅服务器)。
还在发布服务器中创建存储过程,用于将发布服务器中的冲突信息记入日志并选择性地将冲突信息发送给相关的订阅服务器。当检测到冲突时,该存储过程将由队列读取器代理调用。 - Microsoft SQL Server 队列
每个订阅数据库都包含系统表 MSreplication_queue,该表存储订阅服务器中发生的更改。 - SQL Server 队列读取器代理
队列读取器代理从 MSreplication_queue 中读取更改并将这些更改应用到发布服务器。有关详细信息,请参阅Replication Queue Reader Agent。
下图显示了包含排队更新订阅的拓扑中使用的主要组件。
- 订阅服务器中所做的更新由订阅表上的触发器捕获。触发器将这些更新存储在 MSreplication_queue 中。
- 队列读取器代理从 MSreplication_queue 中进行读取,然后使用复制存储过程将排队事务应用到相应发布。
- 应用排队事务时,根据创建发布时设置的冲突解决策略检测和解决冲突(如果有)。因此,可能生成补偿命令以使用标准事务性复制分发进程将事务回滚到订阅服务器(只将补充命令发送给导致冲突的订阅服务器)。有关详细信息,请参阅排队更新冲突的检测和解决。
- 根据分发代理计划,将发布服务器中所做的更改作为从订阅服务器复制更改的结果传播到所有其他订阅服务器。