【问题标题】:SQL Server 2005/8 Replication Transaction IDSQL Server 2005/8 复制​​事务 ID
【发布时间】:2010-12-16 06:40:19
【问题描述】:

我有一个场景,我使用事务复制将多个 SQL Server 2005 数据库(相同实例)复制到单个远程数据库(单独物理机上的不同实例)中。

然后我将对复制的数据进行一些处理以用于报告目的。我正在使用表级触发器来识别更改哪些操作我的后处理代码。

到目前为止一切都很好。

但是,我想知道的是,在同一个事务中创建、更新或删除某些表的位置,是否可以从复制(或任何地方)中识别某种事务 ID,所以我不知道对单个事务多次执行相同的后处理。

基本示例:我有一个 TUser 表和 TAddress 表。如果我要在单个事务中创建两者,它们也将在单个事务中复制。但是,在复制的数据库中会触发两个触发器 - 目前这会导致我的后处理代码运行两次。我真正想确定的是,这两个更改是在同一个事务中复制到的。

这有可能吗?我描述的标识符是否存在并且可以访问?

【问题讨论】:

    标签: sql-server sql-server-2005 replication


    【解决方案1】:

    简短的回答是否定的,没有什么是你可以依赖的。总而言之,长答案是肯定存在,但不建议以任何方式将其用于任何事情。

    鉴于复制在事务上是一致的,您可以考虑的一种方法是将主记录的标识符(在本例中为 TUser,因为 TAddress 与 TUser 相关)到队列中(理想情况下使用类似 Service Broker 或可能是user-defined queue),然后通过将数据从队列中弹出并单独处理来执行后处理。

    另一种可能性是通过轮询主表中的新/更新记录并以这种方式进行后处理来简单地每隔“x”时间进行批处理 - 您需要跟踪某些的 id、行版本或时间戳将您为每个主表处理的作为元数据排序,并在每次批处理运行期间提取尚未处理的任何内容。

    只是一些想法,希望对您有所帮助。

    【讨论】:

    • 感谢您的回复。您能否提供有关长答案摘要的任何信息。即使不可能,我也想知道你在想什么。
    • 至于其他解决方案都已考虑。但是我给出的例子非常简单,实际上是一个包含数百个表的金融系统数据库。服务代理和轮询更改都已打折。经过大量研究后,我们已经到达了我们所处的位置,但如果可能的话,我们真的希望能够将不同的表更改链接到单个事务。我相信有一些系统交易值可用,但不确定这些值有多可靠?
    猜你喜欢
    • 2012-05-19
    • 2012-03-13
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    相关资源
    最近更新 更多