分派冲突的数据变更的制作方法

文档序号:6353196阅读:171来源:国知局
专利名称:分派冲突的数据变更的制作方法
分派冲突的数据变更
背景技术
复制是跟踪、分派数据变更并到将数据变更从一个数据库应用到另一数据库的能 力。在关系型数据库管理系统(RDBMS)中,通常出于恢复目的将数据库中的数据变更记入 日志。关于复制的系统元数据确定正在变更什么数据以及要复制的变更。要复制的数据可 以包括整个数据库、整张表、来自表的所选行、来自表的指定列或所存储的过程。随后可以 标记日志中的数据变更以供复制。数据变更可以被分成连续日志范围,从而使得每一日志 范围的数据变更在一批中复制到目的地站点。在常规的事务复制中,数据变更通常通过单 个连接或流从源站点分派并在目的地站点处应用。虽然单个流确保将数据变更按照与源站 点相同的次序在目的地站点处应用来维持事务一致性,但是由于这种方法会出现吞吐量限 制。为了避免这些吞吐量限制,使用多个流(即,多流)来执行复制,以使得数据变更 在目的地站点处并行地应用。这种并行性导致系统作为整体的更高的吞吐量和性能。在 使用多流方法来执行复制时,基于预定散列密钥将一批中的数据变更分派到多个不同的流 中。结果,被分派到不同的流中的数据变更可能按照与它们在源站点处执行的不同的次序 在目的地站点处应用。无序地应用数据变更可能违反冲突数据变更之间的一个或多个因果 一致性约束。因果一致性约束的示例包括主键约束、唯一约束和外键约束。

发明内容
此处描述的是用于将冲突数据变更分派到多个流中的各种技术的实现。冲突数据 变更可以指涉及同一因果一致性约束并且如果无序地在目的地站点处应用则会违反这些 因果一致性约束的两个或更多数据变更。在一个实现中,计算机应用程序可以从源站点接 收包括多个数据变更以及可以在目的地站点处应用相应的数据变更的次序的日志。计算机 应用程序随后可以从日志中提取所有的数据变更。在从日志中提取数据变更之后,计算机 应用程序可以生成一组散列值,从而使得每一数据变更中的每一约束具有一散列值。在生成该组散列值时,计算机应用程序可以使用散列函数来为每一约束创建散列 值。计算机应用程序随后可以将一个数据变更的所有散列值串接成二进制串并将该二进制 串与来自日志的其相应的数据变更相关联。在一个实现中,源站点和目的地站点可以通过多个流彼此连接。最初,如果将源站 点连接到目的地站点的所有流都是空的,则计算机应用程序可以遵循如日志中指示的次序 将非冲突数据变更平均地分派到多个流中。在已经分派了数据变更后但在目的地站点处提 交数据变更之前,计算机应用程序可以维护一散列表来记住已经分派的数据变更。该散列 表中的每一条目可以包括约束散列值、约束标识(ID)和其中已经分派数据变更的流的ID。在一个实现中,在分派后续数据变更之前,计算机应用程序可以搜索散列表来确 定散列表中的条目是否具有与后续数据变更相同的约束ID和相同的约束散列值(即,约束 对)。如果计算机应用程序没有在散列表中找到匹配条目,则计算机应用程序可以将后续数 据变更分派到流中从而使得数据变更被平均地分发到多个流中。在分派后续数据变更时,计算机应用程序可以将后续数据变更的约束ID、约束散列值和流ID作为新的条目添加到 散列表中。然而,如果计算机应用程序在散列表中找到匹配条目,则计算机应用程序可以确 定该后续数据变更和与匹配条目中的约束ID和约束散列值相关的数据变更是冲突的。计 算机应用程序随后可以将后续数据变更分派到匹配条目的数据变更被分派到的相同的流 中来确保这两个数据变更按照其原始的相对次序来执行。在一个实现中,后续数据变更可能与散列表中一个以上的条目冲突。在这种情况 下,计算机应用程序可以将冲突的数据变更分派到不同的流中,但计算机应用程序可以扼 住后续数据变更的流来避免违反任何约束。通过扼住后续数据变更的流,计算机应用程序 可以确保在先的数据变更在后续数据变更之前发生,从而使得数据变更按照正确的次序在 目的地处执行。在以上描述的实现中的任一个中,在一批中被分派到各个流中的所有数据 变更可以在单个事务中被传递到目的地站点并因此一起应用。提供以上引用的概述章节以便以简化形式介绍将在以下详细描述章节中进一步 描述的一些概念。本发明内容并不旨在标识所要求保护的主题的关键特征或必要特征,也 不旨在用于限制所要求保护的主题的范围。此外,所要求保护的主题不限于解决在本发明 的任一部分中提及的任何或所有缺点的实现。


图1示出其中可包括和实践此处所描述的各种技术的计算系统的示意图。图2示出其中可包括和实践此处所描述的各种技术的事务式复制系统的示意图。图3示出根据此处描述的各种技术的一个或多个实现的用于将冲突的数据变更 分派到多个流中的方法的流程图。
具体实施例方式一般而言,此处描述的一个或多个实现涉及将冲突的数据变更分派到多个流中。 将参考图1-3更详细地描述用于将冲突的数据变更分派到多个流中的各种技术。此处所描述的各种技术的实现可以用众多通用或专用计算系统环境或配置来操 作。适用于此处所描述的各种技术的公知的计算系统、环境和/或配置的示例包括,但不 限于,个人计算机、服务器计算机、手持式或膝上型设备、多处理器系统、基于微处理器的系 统、机顶盒、可编程消费电子产品、网络PC、小型机、大型计算机、包括上述系统或设备中的 任一个的分布式计算环境等。此处所描述的各种技术可以在诸如程序模块等由计算机执行的计算机可执行指 令的一般上下文中实现。一般而言,程序模块包括执行特定的任务或实现特定的抽象数据 类型的例程、程序、对象、组件、数据结构等。此处所描述的各种技术还可在其中任务由通过 例如硬连线链路、无线链路或其组合等通信网络链接的远程处理设备执行的分布式计算环 境中实现。在分布式计算环境中,程序模块可以位于包括存储器存储设备在内的本地和远 程计算机存储介质中。图1示出其中可包括和实践此处所描述的各种技术的计算系统100的示意图。虽 然计算系统100可以是如上所述的常规台式或服务器计算机,但可以使用其它计算机系统配置。计算系统100可包括中央处理单元(CPU)21、系统存储器22和将包括系统存储器 22在内的各种系统组件耦合到CPU 21的系统总线23。虽然图1中只示出了一个CPU,但 应当理解,在一些实现中计算系统100可包括超过一个CPU。系统总线23可以是几种类型 的总线结构中的任何一种,包括存储器总线或存储控制器、外围总线、以及使用各种总线体 系结构中的任一种的局部总线。作为示例而非限制,这样的体系结构包括工业标准体系结 构(ISA)总线、微通道体系结构(MCA)总线、增强型ISA(EISA)总线、视频电子技术标准协 会(VESA)局部总线和外围部件互连(PCI)总线(也称为夹层(Mezzanine)总线)。系统 存储器22可包括只读存储器(ROM) 24和随机存取存储器(RAM) 25。基本输入/输出系统 (“BIOS”)沈可以被存储在ROM 24中,它包含有助于例如在启动期间在计算机系统100内 的各个元件之间传送信息的基本例程。计算系统100还可包括用于对硬盘进行读写的硬盘驱动器27、用于对可移动磁盘 29进行读写的磁盘驱动器28、以及用于对诸如CD-ROM或其它光介质等可移动光盘31进行 读写的光盘驱动器30。硬盘驱动器27、磁盘驱动器28以及光盘驱动器30可分别通过硬盘 驱动器接口 32、磁盘驱动器接口 33和光盘驱动器接口 34连接至系统总线23。驱动器及其 关联的计算机可读介质可以向计算系统100提供对计算机可读指令、数据结构、程序模块 和其它数据的非易失性存储。虽然此处将计算系统100描述为具有硬盘、可移动磁盘四和可移动光盘31,但本 领域技术人员应当理解,计算系统100还可以包括可由计算机访问的其它类型的计算机可 读介质。例如,这种计算机可读介质可包括计算机存储介质和通信介质。计算机存储介质 可包括以用于存储诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任何方 法或技术实现的易失性和非易失性、以及可移动和不可移动介质。计算机存储介质还可包 括,RAM、ROM、可擦除可编程只读存储器(EPROM)、电可擦可编程只读存储器(EEPROM)、闪存 或其它固态存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁带盒、磁带、磁盘 存储或其它磁性存储设备、或能用于存储所需信息且可以由计算系统100访问的任何其它 介质。通信介质能以诸如载波或其它传输机制等已调制数据信号来体现计算机可读指令、 数据结构、程序模块或其它数据,并且包括任何信息传递介质。术语“已调制数据信号”可 指的是以在信号中编码信息的方式设定或更改其一个或多个特征的信号。作为示例而非限 制,通信介质包括有线介质,诸如有线网络或直接线连接,以及无线介质,诸如声学、射频、 红外线和其他无线介质。上述的任意组合也可以包含在计算机可读介质的范围内。多个程序模块能存储在硬盘27、磁盘四、光盘31、ROM M或RAM 25上,包括操 作系统35、一个或多个应用程序36、复制应用程序60、程序数据38和数据库系统55。操 作系统35可以是能控制联网的个人或服务器计算机的操作的任何合适的操作系统,如 Windows XP、Mac OS X、Unix变型(例如Linux 和BSD )等。复制应用程序60将 参考图2-3在以下段落中更详细地描述。用户可通过诸如键盘40和定点设备42等输入设备向计算系统100中输入命令和 信息。其它输入设备可以包括话筒、操纵杆、游戏手柄、圆盘式卫星天线、扫描仪等等。这些 和其它输入设备通过耦合到系统总线23的串行端口接口 46连接到CPU 21,但是可以通过 诸如并行端口、游戏端口或通用串行总线(USB)等其它接口连接。监视器47或其它类型的显示设备也可经由接口,诸如视频适配器48连接至系统总线23。除监视器47之外,计算系 统100还可包括其它外围输出设备,如扬声器和打印机。此外,计算系统100可以使用到一个或多个远程计算机49的逻辑连接在联网环境 中工作。逻辑连接可以是办公室、企业范围计算机网络、内联网和因特网中常见的任何连 接,如局域网(LAN)51和广域网(WAN)52。当在LAN联网环境中使用时,计算系统100可通 过网络接口或适配器53连接到局域网51。当在WAN联网环境中使用时,计算系统100可包 括调制解调器M、无线路由器或用于通过诸如因特网等广域网52来建立通信的其它装置。 或为内置或为外置的调制解调器讨可经由串行端口接口 46连接到系统总线23。在联网环 境中,相对于计算系统100所描绘的程序模块或各其部分可被储存在远程存储器存储设备 中。可以理解,所示的网络连接是示例性的,且可以使用在计算机之间建立通信链路的其他 手段。应该理解,此处描述的各种技术可以结合硬件、软件或两者的组合来实现。因此, 各种技术或其某些方面或部分,可以采用包含在诸如软盘、CD-ROM、硬盘驱动器或任何其它 机器可读存储介质等有形介质中的程序代码(即,指令)的形式,其中,当程序代码被加载 至诸如计算机等机器并由其运行时,该机器成为用于实现该各种技术的装置。在程序代码 在可编程计算机上执行的情况下,计算设备可包括处理器、该处理器可读的存储介质(包 括易失性和非易失性的存储器和/或存储元件)、至少一个输入设备、以及至少一个输出设 备。可以实现或利用此处所描述的各种技术的一个或多个程序可以使用应用程序编程接口 (API)、可重用控件等。这样的程序可以用高级过程语言或面向对象编程语言来实现,以与 计算机系统通信。然而,如果需要,程序可以用汇编语言或机器语言来实现。在任何情形中, 语言可以是编译语言或解释语言,且与硬件实现相结合。图2示出其中可包括和实践此处所描述的各种技术的事务式复制系统的示意图。 在一个实现中,复制系统200可以包括发布者210、分发者220、一个或多个流230和订阅者 2400发布者210可以是将其数据发送到另一服务器或数据库的服务器或数据库。发布者 210可以包含作为被发送到订阅者服务器或数据库的一个或多个制品的集合的一个或多个 发布。在事务式复制中,制品是要被复制的内容,并且可以是整个表、从表中选择的行、从表 中指定的列或存储的过程。分发者220可以通过复制系统200来管理数据流。分发者220可以包含跟踪需要 从发布者210复制的变更(对发布的变更)的分发数据库。在一个实现中,发布者210可 以用作其自己的分发者220。在另一实现中,远程数据库服务器可以用于保存分发数据库。订阅者240可以是从发布者210或任何其他数据库接收数据的服务器或数据库。 订阅是订阅者240上的服务器或数据库将要接收的数据组。订阅可以包括一个或多个发 布。此外,订阅可以是推订阅或拉订阅。推订阅是在发布服务器周期性地将事务推送到订 阅服务器或数据库的情况下的订阅。拉订阅是在订阅服务器周期性地连接到分发数据库并 拉取信息的情况下的订阅。在常规的复制系统中,数据变更通常通过分发者220和订阅者240之间的单个连 接来应用。虽然单个连接可以确保事务按照该事务在发布者210上发生的准确次序在订阅 者处应用,但是这种方法可能存在性能损失,因为订阅者240可能利用不足,尤其是在请求 来自负载较重的发布者210的情况下。
图2中的复制系统200可以通过利用订阅者240处的多个流230来应用数据变更 以克服常规事务式复制系统的某些限制。在一个实现中,分发者220可以将其从发布者210 接收的数据变更存储在命令队列中。分发者220随后可以读取数据变更并在数据变更中排 序,并且将数据变更发送到可以将分发者220连接到订阅者MO的流230中的任一个。如上所述,在将数据变更发送到不同的流230时,可以按照与数据变更存储在命 令队列中不同的次序来在订阅者240处应用数据变更。在一个实现中,无序地应用数据变 更可能违反冲突的数据变更之间的一个或多个因果一致性约束。以下提供了诸如主键约 束、唯一约束和外键约束等因果一致性约束的描述。主键约束违反在约束违反的一个示例中,表“tabl”可以具有表“tabl”的列“k”上的主键“kl”。 数据变更可以包括删除带有主键“kl”的行然后再次在表“tabl”上插入主键“kl”。因此, 数据变更可以如下…delete from tabl where k = kl…insert tabl values(kl,...)…如上所示,两个数据变更发生冲突,因为两个数据变更都对主键列值“kl”执行动 作。以此方式,如果“delete from tabl where k = kl (从tabl中删除k = kl处的值)” 数据变更和“insert tabl values (kl,...)(将值(kl,…)插入tabl) ”数据变更被分派 到不同的流中,则“insert tabl values (kl,...)”数据变更可能在“delete from tabl where k = kl”数据变更之前应用。在这种情况下,将发生主键违反,因为主键“kl”已经存 在于主键列“k”中。唯一约束违反在约束违反的另一示例中,表“tabl”可以具有列“k”上的主键和对列“X”的唯 一键约束。例如,数据变更可以包括将行(kl,...,xl,...)的主键从“kl”更新为“k2”。 在该示例中,更新数据变更等价于删除数据变更后跟插入数据变更,即“delete from tabl where k = kl” 数据变更应该在 “insert tablvalues (k2, · · ·,xl,· · ·)(将值(k2, · · ·, xl,...)插入tabl) ”数据变更执行之前执行,如下所示。…delete from tabl where k = kl/ * 行(kl,…,xl,…)insert tabl values (k2,…,xl,…)…然而,这两个数据变更发生冲突,因为两个数据变更都对唯一约束列值“xl”执行 动作。如果"delete from tabl where k = kl,,数据变更禾口“insert tablvalues (k2,..., xl,...) ”数据变更被分派到不同的流中,则会发生唯一约束违反。在这种情况下,“insert tabl values(k2,...,xl,···)”数据变更可能在“delete fromtabl where k = kl”数 据变更之前应用。此处,因为“xl”已经存在于表“tabl”中,所以,如果“insert tabl values(k2,· ·.,xl,· ··)”数据变更在“delete from tab !where k = kl”数据变更之前应insert tab2 values (xl,...) insert tabl values (kl,... , xl,
用,则会发生唯一约束违反。外键约束违反在约束违反的又一示例中,表“tabl”可以具有列“k”上的主键和外键列“X”。 表“tabl”中的外键列“X”指的是表“tab2”的主键列“X”。在以下提供的数据变更中,行 (xl, ..·)被插入到表“tab2”中然后行(kl, ...,xl,...)被插入到表“tabl”中。……然而,这两个数据变更发生冲突,因为表“tabl”中的列“X”具有依赖于表“tab2” 中的列 “X” 的外键引用。当 “insert tab2 values (xl,· · ·)(将值(kl,· · ·,xl,· · ·)插 Λ tabl) ”数据变更和 “insert tabl values (kl, · · ·,xl,…)(将值(kl, · · ·,xl,…) 插入tabl) ”数据变更被分派到不同的流中时,会发生外键约束违反。例如,“insert tabl values (kl, · · ·,xl,…)”数据变更可能在 “inserttab2 values (xl,...) ” 数据变 更之前应用。如果“insert tabl values (kl,...,xl,···)” 数据变更在“insert tab2 values (xl,...) ”数据变更之前应用,则会发生外键约束违反,因为行(xl,...)不存在于 表“tal32” 中。对于以下删除情况会发生相似的情形…delete from tabl where k = kl/ * 删除行(kl,· · ·,xl,· · ·)* /delete from tab2 where χ = xl…如果按照相反次序应用这两个数据变更,则会发生外键约束违反,因为表“tabl” 具有引用表“tab2”中的行xl的外键约束。如果在应用“delete from tablwhere k = kl (从tabl中删除k = kl处的值),,数据变更之前从表“tab2”删除xl,则会发生外键约 束违反,因为行(kl, ...,xl,....)仍旧指代表“tab2”中的行Xl0图3示出根据此处描述的各种技术的一个或多个实现的用于将冲突数据变更分 派到多个流中的方法的流程图。以下对方法300的描述参考图1的计算系统100和图2的 复制系统200来进行。应当理解,尽管方法300指示了操作执行的特定次序,但在某些实现 中这些操作的特定部分可按照不同的次序执行。在一个实现中,用于分派冲突的数据变更 的方法可以由复制应用程序60来执行。在步骤310处,复制应用程序60可以从源站点接收包括所有数据变更以及可在目 的地站点处应用的数据变更的次序的日志。该日志可以包括在源站点处执行的逻辑数据变 更。在一个实现中,源站点可以是发布者210并且目的地站点可以是订阅者M0。由此,复 制应用程序60可被存储在分发者220中。在步骤320处,复制应用程序60可以从在步骤310处接收的日志中提取所有的数 据变更。在步骤330处,在从日志中提取数据变更之后,复制应用程序60可以为从日志中 提取的每一数据变更中的每一约束生成散列值。在一个实现中,被标记为供复制的表可能 具有主键约束、唯一约束、外键约束或其组合。由此,对于“插入”或“删除”数据变更,复制应用程序60可以使用散列算法为每一约束生成一个或多个散列值。散列算法可被配置成 为两个或更多相同的约束生成同一散列值。例如,如果第一数据变更(例如,从表1中的列 k删除kl)具有对表1的列k的主键约束,则复制应用程序60可以为关于列k和表1的主 键约束生成散列值。然后,如果第二数据变更(例如,将kl插入到表1的列k)也具有对表 1的列k的主键约束,则复制应用程序60可以为第二数据变更生成与其为第一数据变更所 生成的相同的散列值。以此方式,复制应用程序60能够通过标识数据变更是否具有相同的 散列值来确定两个或更多数据变更是否冲突。为了生成散列值,主键约束、唯一约束和外键 约束的所有列的值可被记录到计算机系统100中。在一个实现中,复制应用程序60可以如下地为“更新”数据变更生成散列值。如 果没有修改主键列,则复制应用程序60可以为主键约束生成一个散列值。然而,如果修改 了主键约束的列,则复制应用程序60可以记录主键约束的所有列的之前和之后的映像。复 制应用程序60可以为经修改的主键约束的之前的映像生成第一散列值并为之后的映像生 成第二散列值。如果修改了唯一约束的列,则复制应用程序60可以将唯一约束的所有列的值的 之前的映像和之后的映像记录在计算机系统100中。复制应用程序60随后可以为该唯一 约束的之前的映像生成第一散列值并为之后的映像生成第二散列值。如果修改了外键约束的列,则复制应用程序60可以将外键约束的所有列的值的 之前的映像和之后的映像记录在计算机系统100中。复制应用程序60随后可以为该外键 约束的之前的映像生成第一散列值并为之后的映像生成第二散列值。在步骤340处,复制应用程序60可以将为单个数据变更生成的所有散列值串接 成二进制串。复制应用程序60随后可以将该二进制串与单个数据变更相关联。在一个实 现中,复制应用程序60可以串接散列值,从而使得二进制串的第一部分可以包括为相应的 数据变更生成的主键约束散列值的数量、唯一约束散列值的数量以及外键约束散列值的数 量。二进制串的第二部分可以包括数据变更被定向到的表的标识号(ID)以及与主键约束 的列的值相对应的散列值。二进制串的第三部分可以包括唯一约束的ID以及与唯一约束 的列的值相对应的散列值。在一个实现中,如果数据变更不具有唯一约束,则二进制串可以 不包括唯一约束。二进制串的第四部分可以包括外键约束所引用的表的ID以及与外键约 束的列的值相对应的散列值。在一个实现中,如果数据变更不具有外键约束,则二进制串可 以不包括外键约束。在步骤350处,复制应用程序60可以确定在步骤330处生成的散列值是否存在于 散列表中。散列表可以包括可能已经被分派到一个或多个流中的数据变更的记录。在一个 实现中,散列表中的每一条目可以包括约束散列值、约束ID和其中已经分派数据变更的流 的ID。对于主键约束,约束ID可以是数据变更要被定向到的表的ID。对于唯一约束,约束 ID可以是唯一约束的ID。对于外键,约束ID可以是该外键引用的表的ID。表可以具有一 个主键约束、零个或多个唯一约束、以及零个或多个外键约束。在一个实现中,可以组织散列表,使得已经分派但尚未提交的数据变更的每一个 约束可以在散列表中具有一个条目。散列表的条目可以包括约束对(即,约束散列值、约束 ID),其中约束ID是数据变更被定向到的表的ID、唯一约束的ID或者外键引用的表的ID。 约束散列值可以包括相应的主键列值的散列值、唯一约束列值的散列值或外键列值的散列值。散列表中的每一条目还可以包含相应的数据变更被分派到的流的ID。在一个实现中, 散列表的同一桶中的所有条目可以双链接在一起。由此,散列到同一桶中的条目可以由双 链接链结在一起(即,每一条目具有两个指针一个指向其下一条目,另一个指向其前一条 目)。在另一实现中,同一流的散列表中的所有条目可以链接到栈。每一流具有指向该栈的 顶部的指针。回头参考步骤350,如果复制应用程序60没有在散列表中找到匹配条目,则复制 应用程序60可以继续至步骤360。在步骤360处,复制应用程序60可以遵循如日志中所指示的次序将数据变更分派 到多个流中。在一个实现中,复制应用程序60可以通过将主键的散列值散列到流ID中来 将数据变更分派到命令中。通过将主键的散列值散列到流ID中,复制应用程序60可以将 数据变更平均地分发到多个流中。在一个实现中,为了将数据变更平均地分发到多个流中, 复制应用程序60可以使用模运算来将所生成的散列值映射到流ID。例如,在具有64个流 的复制系统200中,如果复制应用程序60为特定数据变更生成散列值123,则复制应用程序 60可以将特定数据变更映射到等于59的流ID(即,123% 64 = 59)。在分派了当前数据变 更之后,复制应用程序60可以将当前数据变更的约束ID、约束散列值和流ID作为新的条目 添加到散列表中。回头参考步骤350,如果复制应用程序60在散列表中找到匹配条目,则复制应用 程序60可以确定匹配条目中的数据变更和正在评估的当前数据变更是冲突的数据变更。 在一个实现中,匹配条目可以具有与正被分派的数据变更相同的约束ID和相同的约束散 列值。在确定数据变更是冲突的之后,复制应用程序60可以继续至步骤370。在步骤370处,复制应用程序60可以将正被评估的当前数据变更分派到匹配条目 的数据变更被分派到的同一流中来确保数据变更按照其原始次序来执行。通过将当前数据 变更分派到匹配条目的数据变更被分派到的同一流中,复制应用程序60可以确保在将数 据变更应用于目的地站点时不会发生因果一致性违反。在一个实现中,每一数据变更可以 被分派到一个流中,随后被应用于目的地站点,然后在目的地站点处提交。在分派了当前数据变更之后,如果当前数据变更的约束值不存在于散列表的任何 一个条目中,则复制应用程序60可以将当前数据变更的约束ID、约束散列值和流ID作为新 的条目添加到散列表中。例如,当前数据变更可以具有两个约束散列值,从而使得第一约束 散列值在散列表中的至少一个条目中列出而第二约束散列值未在散列表中列出。此处,复 制应用程序60可能无法向散列表添加对应于第一约束散列值的新条目,因为第一约束散 列值已经在散列表的一个条目中列出。然而,复制应用程序60可以将对应于第二约束散列 值的新条目添加到散列表,因为第二约束散列值不存在于散列表中。分派数据变更可以包括将数据变更分派或发送到流(即,将数据变更放入该流的 缓存中)。应用数据变更可以包括在提交相关联的事务之前在目的地站点处执行所缓存的 数据变更。提交数据变更包括提交数据变更的相关联的事务。在一个实现中,当前数据变更可能与散列表中一个以上的条目冲突。在这种情况 下,在具有冲突的数据变更的流之间,复制应用程序60可以扼住包含最少数量的数据变更 的流,并立即应用和提交其他流的数据变更。在应用并提交其他流的数据变更之后,复制应 用程序60可以恢复被扼住的流并将当前数据变更分派到该流中。通过扼住当前数据变更的流,复制应用程序60可以确保先前冲突的数据变更可以在当前数据变更之前在目的地 处应用,从而使得数据变更按照正确的次序在目的地处执行。在另一实现中,复制应用程序 60可以延迟或扼住当前数据变更的分派,直到提交了所有匹配散列表条目的数据变更。例如,假设表“tabl”具有列“k”的主键和引用表“tab2”的主键列“X”的外键列 “X”。源站点可以执行以下数据变更…delete from tabl where k = kl/ * 删除行(kl,· · ·,xl,· · ·)* /insert tab2 values (x2,…)insert tabl values (kl,…,xl,…)…在该实现中,如果在将“insert tabl values (kl,...,x2,···)(将值(kl,..., x2,...)插入tabl)”数据变更分派到流中之前将“delete from tabl where k = kl (从 tabl删除k = kl处的值)”数据变更分派到流1并且将“insert tab2 values (x2, ···) (将值(x2,...)插入tab》”数据变更分派到流2,则复制应用程序60可以在散列表中找 到两个匹配条目。因此,复制应用程序60可以将“insert tabl values (kl,...,x2,···),, 数据变更分派到流3中并停止或扼住流3,直到已经应用了流1和流2中的数据变更并已 经提交了这些流的事务。在已经提交了事务之后,随后可以从散列表中移除那些提交的条 目,并且复制应用程序60随后可以将“insert tabl values (kl, . . .,x2,...)”数据变更 分派到包含最少数量的数据变更的流中。虽然在以上各段中描述了用于分派数据变更的各 种实现,但是应该注意,在以上描述的任何实现中,在将数据变更分派到一个或多个流中之 后,可以在单个事务中将数据变更传递到目的地站点并因此一起应用。原子地复制数据变更在一个实现中,在复制一批数据变更时,复制应用程序60或在目的地站点处提交 该批中的所有数据变更,或者不提交该批中的任何数据变更。以此方式,复制应用程序60 确保目的地站点处的数据与源站点处的数据一致。因此,在使用多流复制一批数据变更时, 复制应用程序60可以调用分派器线程来启动根事务。在一个实现中,分派器线程可以将数 据变更分派到流230的缓存中。每一流230可以具有保存被分派到相应的流中但尚未在目 的地站点处应用的数据变更的固定的缓存大小。在分派器线程将数据变更分派到流230的 缓存中后并且在目的地站点处应用数据变更之前,每一流230可以调用可以将与缓存中的 数据变更相关的嵌套事务加入到根事务中的工作者线程。此处,根事务可以包括多个嵌套 事务,从而使得同一根事务的所有嵌套事务可要么被全部提交要么被全部中止。由此,某些 嵌套事务被提交而其他嵌套事务被中止是不可能的。在一个实现中,在应用数据变更时,嵌套事务可以使用锁。同一根事务的两个不同 的嵌套事务可以使用这些锁来指示两个不同的嵌套事务彼此不兼容。例如,在第一嵌套事 务执行数据变更之后,它可以保持对与该数据变更相关的数据块的锁。随后,如果第二嵌套 事务试图对相同的数据块作出冲突的数据变更,则可以阻塞后一个数据变更(即,由第二 嵌套事务进行),直到前一嵌套事务提交。一旦前一嵌套事务提交,则可以将前一嵌套事务 的锁转移到父根事务。由此,后一个数据变更可以不再与前一数据变更冲突,并可以恢复 后一个嵌套事务。在一个实现中,如果后一个嵌套事务被中止,则同一根事务的所有嵌套事务,包括任何先前提交的嵌套事务也被中止。在先前的示例(即,“delete from tabl where k = kl”数据变更被分派到流1) 中,约束对(表“tabl”,具有值kl)可能已经存在于散列表中。此处,如果“insert tabl value (kl, . . .,x2,...)”数据变更被分派到流1,则可以将约束对(表“tab2”,具有值x2) 作为新的条目插入到散列表中并与流1相关联。为了确保经由流2应用的“insert tab2 values (x2,...)”数据变更对流1可见,复制应用程序60可以提交流2上的嵌套事务。在 提交了流2上的嵌套事务之后,复制应用程序60可以将嵌套事务的锁转移到父(即,根事 务)。由此,这些所转移的锁将不会阻塞流1上的“insert tabl values (kl, . . . x2,...)” 数据变更。在一个实现中,被分派到一个流的数据变更可以首先被追加到该流的缓存。在流 的缓存已满时,随后可以将该缓存中的数据变更应用于目的地站点,并且可以从缓存中移 除这些数据变更。在一个实现中,工作者线程可以在提交其嵌套事务之前多次应用数据变 更。当工作者线程提交其嵌套事务时,该嵌套事务的锁被转移到父(即,根事务)。在该转 移之后,任何后来的冲突的数据变更都不会被这些锁阻塞。在工作者线程提交其流的嵌套事务进而伴随提交流中的所有先前数据变更之后, 复制应用程序60随后可以从散列表中移除对应于链接在栈中的那些数据变更的所有条 目。在一个实现中,散列表可以包括被散列到同一桶中并随后由双链接链结在一起的条目。 散列表的桶中的双链接可以用于高效地从桶中移除条目。在从散列表中移除条目之后,工 作者线程可以启动新的嵌套事务并将其加入到根事务中。被分派到该工作者线程的流中的 后续数据变更可以被包装到这一新的嵌套事务中。在一个实现中,同一根事务的并行嵌套事务的所有日志记录可以链接到一个单链 中。这一单链可以确保在中止的情况下可以正确地撤消嵌套事务。嵌套事务的任何失败可 以中止同一根事务的所有先前提交的嵌套事务。死锁当复制应用程序60将冲突的数据变更应用于多个流中的目的地站点时,会发生 死锁。在一个实现中,在以下情况中在数据变更本身之间可能不存在死锁(1)每一数据变 更只修改一行;( 不同时排定任何两个冲突的数据变更(涉及同一约束对)(即,一个数 据变更在前一冲突的数据变更已经完成之前不会开始);以及C3)对于任意两个冲突的数 据变更,它们或者被分派到同一嵌套事务中并因此被分派到同一流中,或者前一嵌套事务 应该在后一数据变更开始之前提交前一冲突数据变更。然而,由于目的地站点处的锁升级或由于在源站点和目的地站点之间使用不同的 锁粒度(例如,行锁在目的地站点处被禁用,而在源站点处被启用),可能存在死锁。此处, 复制应用程序60可以检测这种类型的死锁并中止整个根事务。复制应用程序60随后可以 使用将主键散列值散列到流ID中的不同散列函数以降低再次流入同一死锁的可能性,来 再次应用整批。如果散列表的大小成为一个问题,则复制应用程序60可以通过在应用了缓 存中的所有当前数据变更之后提交嵌套事务来提高提交的频率。一旦工作者线程提交了其 嵌套事务,则随后可以从散列表中移除对应于该嵌套事务中包括的该数据变更的条目。在 一个实现中,更频繁的提交还可以降低死锁的可能性。在另一实现中,复制应用程序60可以通过在多个匹配条目位于散列表中的情况下消除在分派数据变更之前发生的提交来降低提交的数量。此处,可能需要预处理一批中 的所有数据变更来标识冲突的数据变更的聚类。随后可以将任意两个不同的数据变更分类 到同一聚类中。随后可以将同一聚类的数据变更分派到同一流中。可以将数据变更的不同 聚类分派到同一流中并在同一嵌套事务中提交。这将减少嵌套事务的总数,但对数据变更 的预处理可能需要可能使性能降级的额外的一轮读取数据变更。 尽管用结构特征和/或方法动作专用的语言描述了本主题,但可以理解,所附权 利要求书中定义的主题不必限于上述具体特征或动作。相反,上文所描述的具体特征和动 作是作为实现权利要求的示例形式来公开的。
权利要求
1.一种用于分发一个或多个数据变更的方法,所述方法包括(a)从源站点接收日志,其中所述日志包括要在目的地站点处应用的所述数据变更;(b)为所述数据变更中的一个生成一个或多个散列值;以及(c)基于所述散列值将所述数据变更中的一个分派到多个流中的一个中,其中所述多 个流将所述源站点连接到所述目的地站点。
2.如权利要求1所述的方法,其特征在于,生成所述散列值包括 标识所述数据变更中的一个的一个或多个约束;标识每一约束的约束ID ;以及 使用散列算法为每一约束ID生成约束值。
3.如权利要求2所述的方法,其特征在于,还包括 将所述约束值和所述约束ID串接成二进制串;以及 将所述二进制串与所述数据变更中的一个相关联。
4.如权利要求2所述的方法,其特征在于,分派所述数据变更中的一个包括标识表中的具有所述数据变更中的一个的所述约束ID和所述约束值的第一条目,其 中所述表包括多个条目,每一条目具有先前分派的数据变更的约束ID、约束值和流ID ;以 及将所述数据变更中的一个发送到所述多个流中与所述流ID相对应的一个流。
5.如权利要求1所述的方法,其特征在于,分派所述数据变更中的一个包括 启动具有多个嵌套事务的根事务;将所述数据变更中的一个发送到所述多个流中的一个的缓存,其中所述缓存包括已经 被分派但尚未在所述目的地站点处应用的一个或多个数据变更; 将与所述数据变更相关的嵌套事务加入到所述根事务中; 将所述数据变更应用于所述目的地站点; 提交所述嵌套事务;以及 在所述目的地站点处提交所述根事务。
6.如权利要求2所述的方法,其特征在于,分派所述数据变更中的一个包括 在具有一个或多个条目的表中搜索所述约束ID和所述约束值,其中每一条目包括关于先前分派的数据变更的约束ID和约束值的信息;确定所述表中没有一个条目包括所述数据变更中的一个的所述约束ID和所述约束 值;以及将所述数据变更中的一个发送到所述多个流中的任意一个。
7.如权利要求6所述的方法,其特征在于,还包括将所述数据变更中的一个的所述约 束ID和所述约束值以及流ID存储到所述表中的条目,其中所述流ID与所述多个流中的任意一个相对应。
8.如权利要求2所述的方法,其特征在于,分派所述数据变更中的一个包括 标识表中的两个或更多条目中的、所述数据变更中的一个的所述约束ID和所述约束值,其中所述表包括多个条目,每一条目具有先前分派的数据变更的约束ID、约束值和流 ID,并且其中所述两个或更多条目包括与所述多个流中用于两个或更多先前分派的数据变 更的两个或更多流相对应的两个或更多流ID ;将所述数据变更中的一个发送到所述多个流中的一个; 扼住所述多个流中的一个;以及 提交所述多个流的其余部分。
9.如权利要求1所述的方法,其特征在于,还包括对所述数据变更中的每一个重复步 骤(a)到(c)。
10.如权利要求1所述的方法,其特征在于,所述源站点是发布者。
11.如权利要求1所述的方法,其特征在于,所述目的地站点是订阅者。
12.—种其上存储有计算机可执行指令的计算机可读存储介质,所述计算机可执行指 令在由计算机执行时使得所述计算机从源站点接收日志,其中所述日志包括要在目的地站点处应用的一个或多个数据变更;标识所述数据变更中的一个的一个或多个约束;标识每一约束的约束ID ;使用散列算法为每一约束ID生成约束值;以及基于所述约束ID和所述约束值将所述数据变更中的一个分派到多个流中的一个中, 其中所述多个流将所述源站点连接到所述目的地站点。
13.如权利要求12所述的计算机可读存储介质,其特征在于,所述计算机可执行指令 还包括在由计算机执行时使得所述计算机执行以下动作的计算机可执行指令将所述约束值和所述约束ID串接成二进制串;以及 将所述二进制串与所述数据变更中的一个相关联。
14.如权利要求12所述的计算机可读存储介质,其特征在于,分派所述数据变更中的 一个的所述计算机可执行指令还包括在由计算机执行时使得所述计算机执行以下动作的 计算机可执行指令标识表中具有所述数据变更中的一个的所述约束ID和所述约束值的第一条目,其中 所述表包括多个条目,每一条目具有先前分派的数据变更的约束ID、约束值和流ID ;以及 将所述数据变更中的一个发送到所述多个流中与所述流ID相对应的一个。
15.如权利要求14所述的计算机可读存储介质,其特征在于,所述计算机可执行指令 还包括在由计算机执行时,使得所述计算机将所述数据变更中的一个的所述约束ID和所 述约束值以及所述流ID存储到所述表中的第二条目的计算机可执行指令。
16.一种计算机系统,包括 至少一个处理器;以及存储器,所述存储器包括在由所述至少一个处理器执行时使得所述至少一个处理器执 行以下动作的程序指令(a)从源站点接收日志,其中所述日志包括要在目的地站点处应用的一个或多个数据 变更;(b)为所述数据变更中的一个生成一个或多个散列值;(c)在表中标识具有所述数据变更中的一个的散列值中的至少一个的一个或多个条 目,其中所述表包括多个条目,每一条目具有先前分派的数据变更的散列值和流ID ;(d)将所述数据变更中的一个分派到所述多个流中的一个;以及(e)扼住所述多个流中的一个。
17.如权利要求16所述的计算机系统,其特征在于,使得所述至少一个处理器生成所 述散列值的所述程序指令包括被配置成执行以下动作的程序指令标识所述数据变更中的一个的一个或多个约束; 为每一约束创建约束ID;以及 使用散列算法为每一约束ID生成约束值。
18.如权利要求17所述的计算机系统,其特征在于,所述存储器还包括被配置成执行 以下动作的程序指令将所述约束值和所述约束ID串接成二进制串;以及 将所述二进制串与所述数据变更中的一个相关联。
19.如权利要求16所述的计算机系统,其特征在于,所述存储器还包括使得所述至少 一个处理器将所述数据变更中的一个的散列值以及与所述多个流中的一个相对应的流ID 存储到所述表中的条目的程序指令。
20.如权利要求16所述的计算机系统,其特征在于,所述存储器还包括使得所述至少 一个处理器对所述数据变更中的每一个重复步骤(a)到(e)的程序指令。
全文摘要
一种用于分发一个或多个冲突的数据变更的方法。该方法包括从源站点日志中提取数据变更并将数据变更应用于目的地站点。该方法包括随后标识每一数据变更的一个或多个约束并为每一所标识的约束生成散列值。该方法包括随后基于散列值将数据变更分派到多个流中。散列值用于标识冲突的数据变更并确定应该怎样通过多个流来发送数据变更以使得数据变更在多个流中并行地应用而不违反任何因果一致性约束。该方法包括随后在单个事务中将多个流中的数据变更提交给目的地站点,从而创建一致的事务视图。
文档编号G06F17/30GK102122289SQ201110008510
公开日2011年7月13日 申请日期2011年1月7日 优先权日2010年1月7日
发明者A·奥克斯, M·哈本, Q·郭, R·王 申请人:微软公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1