使用CDC防止多个数据库的更新循环

时间:2012-03-23 09:12:42

标签: sql-server-2008-r2 cdc

我们有许多遗留系统无法对其进行更改 - 但是,我们希望从这些系统开始更改数据并将其自动应用到其他系统。

我们正在考虑某种形式的服务总线(尚未选择特定的技术),以及一组总线适配器(每个遗留应用程序一个),用于在数据库特定概念和一般更新消息之间进行转换。

我一直在关注的一个领域是使用变更数据捕获(CDC)来监控旧数据库中的更新活动,并使用该信息构建适当的消息。但是,我有一个问题 - 作为CDC信息的消费者,我最好能够区分应用程序应用的更改与接收消息时总线适配器所应用的更改 - 否则,总线分发的第一个更新将当每个接收者将该变化应用到他们自己的系统时,由每个接收者重新分配。

如果我正在实施“穷人”CDC - 即触发器,那么这些触发器在原始DML语句的上下文/事务/连接中执行 - 因此我可以将它们设计为忽略一个特定用户(用户应用传入更新)从总线),或设置和检测会话属性类似忽略某些更新。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

如果我正确理解了您的问题,那么您正在尝试定义一个消息路由结构,该结构适用于您已选择的设计(使用enterprise service bus)和a message implementation,您可以使用从旧系统中流出数据,转发端口更改为较新的系统。

难点在于您尝试以这样的方式应用更改:它们本身不会从接收旧系统数据包的客户端生成CDC消息。事实上,你所关心的只是让你的新系统消耗数据而不是将消息传播回你的总线,造成不必要的串扰,这可能会导致你的基础设施过载。

秘密是how MSSQL's CDC features reconcile changes,因为它们通过网络传播。具体来说,请注意这一点:

  

所有更改都以LSN或日志序列号记录。 SQL   通过日志序列号清楚地识别DML的每个操作。   对任何表的任何承诺修改都记录在   具有SQL提供的特定LSN的数据库的事务日志   服务器。 __ $ operationcolumn值为:1 = delete,2 = insert,3 =   更新(更新前的值),4 =更新(更新后的值)。

     

cdc.fn_cdc_get_net_changes_dbo_Employee给我们所有的记录网   改变了我们在函数中提供的LSN之间的下降。我们有   net_change函数返回的三条记录;有一个删除,   一个插入和两个更新,但在同一记录上。如果是的话   更新记录,它只显示两者之后的净变化值   更新完成。

     

要获得所有更改,请执行   cdc.fn_cdc_get_all_changes_dbo_Employee;还有选择   通过'ALL'或'ALL UPDATE OLD'。 'ALL'选项提供所有   更改,但对于更新,它提供更新后的值。于是   我们找到两条更新记录。我们有一个记录显示第一个   当Jason被更新为Nichole时更新,并且当Nichole更新时有一个记录   已更新为EMMA。

虽然此文档有些简洁且难以理解,但似乎记录了更改并以LSN顺序进行了协调。此系统将丢弃竞争变更 ,从而使您的一致性模型能够有效运行。

另请注意:

  

默认情况下,CDC已禁用,必须在数据库级别启用   然后在桌面上启用。

选项B然后变得显而易见:在遗留系统上建立CDC,然后使用您的服务总线将这些更改转换为未绑定到CDC的更新(例如,使用原始事务更新语句)。这应该允许您从系统设计中寻找的单向数据流。

有关协调更改的其他方法,请考虑this Wikipedia article on "eventual consistency"提出的概念。祝你的内部数据库消息系统好运。