会话失败后的自动事务重试的制作方法
【专利摘要】本文描述了用于从客户端与数据库服务器之间的会话失败中恢复的技术。可以在客户端与第一数据库服务器之间建立会话,并且可以打开事务以处理多个数据库命令。可以在数据库服务器处从客户端接收与事务相关联的一个或多个命令。每一收到命令具有相关联的命令标识符。事务日志存储与每一收到命令相关联的命令标识符并且指示每一收到命令是否在数据库服务器处已被成功执行。在会话失败之后,重建会话,并且从客户端接收进一步命令的命令标识符。如果确定与进一步命令相关联的命令标识符已被存储在事务日志中,则无需执行命令,并且事务可以继续。
【专利说明】会话失败后的自动事务重试
[0001] 背景
[0002] 数据库服务器是响应于从计算机应用接收到的请求来向其提供数据库服务的产 品。此类数据库服务可以包括但不限于存储、检索、分析或操纵数据库数据。取决于实现, 这些应用可以在数据库服务器在其上运行的同一机器上运行,或者可以在经由一个或多个 网络连接至数据库服务器在其上运行的该机器的其他机器上运行。为将请求发送给数据库 服务器,应用连接到数据库服务器并且与其建立所谓的会话。会话表示应用与数据库服务 器之间正在进行的交互式信息交换。会话在某一时间点被设置或建立,并且随后在稍后的 时间点被拆毁。所建立的会话通常涉及从应用向数据库服务器以及从数据库服务器向应用 发送不止一个消息。
[0003] 在应用发起了与数据库服务器的会话之后,可以在应用与服务器之间打开事务以 执行一系列数据库操作。事务可以是原子的(atomic)以使得所有数据库操作都发生或者 没有一个数据库操作发生。由此,应用可以向数据库服务器发送命令以供在事务的上下文 内执行。在某一时间点,应用与数据库服务器之间建立的连接可能失败。例如,在应用与数 据库服务器在不同机器上运行的场景中,在数据库服务器在其上运行的机器被关闭或崩溃 的情况下或者在连接这些不同机器的网络存在问题的情况下连接可能失败。如果连接失 败,则会话本身失败,并且由数据库服务器当前正在处理的事务失败。由于事务失败,无论 数据库服务器是否已开始处理事务的操作,事务的所有操作都失败。结果,应用必须实现重 试逻辑以重新尝试整个事务。然而,重试逻辑在应用中实现起来很复杂。此外,当这一应用 被移至云环境时,存在更多因云服务本质引起会话失败的可能性。由此,可能需要修改应用 以便能够更好地处理云中的数据库接入失败。
[0004] 概述
[0005] 提供本概述是为了以简化的形式介绍将在以下【具体实施方式】中进一步描述的概 念选择。本概述并不旨在标识所要求保护主题的关键特征或必要特征,也不旨在用于限制 所要求保护主题的范围。
[0006] 提供了用于从客户端与数据库服务器之间的会话失败中恢复并且用于允许以高 效方式完成在会话失败期间处于进程中的事务的方法和系统。在数据库服务器处维护事务 日志以跟踪执行事务内部的命令的进展。如果客户端与数据库服务器之间发生会话失败并 且随后会话被重建,则事务日志可以被引用以使得事务能够从失败点继续,而无需从开头 重新开始事务并且重新执行事务内部的命令。
[0007] 本文还描述了包含存储计算机代码/指令的计算机可读存储介质的计算机程序 产品,该代码/指令用于允许从会话失败中恢复,并且允许完成会话失败期间处于进程中 的事务,以及允许本文描述的附加实施例。
[0008] 下面将参考各个附图,详细描述本发明的进一步特点和优点,以及本发明的各实 施例的结构和操作。值得注意的是,本发明不仅限于此处所描述的特定实施例。本文呈现 这些实施例仅用于说明性的用途。基于本文所包含的描述,其它实施例对于相关领域的技 术人员将是显而易见的。
【专利附图】
【附图说明】
[0009] 合并在此并作为说明书一部分的附图与说明书一起示出了本发明的实施例,且进 一步用于解释本发明的原理的作用,并且使相关领域的技术人员能够实现并使用本发明。 [0010] 图1是根据一实施例的在客户端与数据库服务器之间会话失败的情况下允许事 务完成的示例系统的框图。
[0011] 图2是根据一示例实施例的图1所示的客户端的框图。
[0012] 图3是根据一示例实施例的图1所示的数据库服务器的框图。
[0013] 图4A和4B描绘了根据一示例实施例的在数据库服务器处执行的用于执行在数据 库服务器与客户端之间的会话中的事务的过程的流程图。
[0014] 图5描绘了根据一示例实施例的用于生成会话、事务和命令标识符的过程的流程 图。
[0015] 图6描绘了根据一示例实施例的在数据库服务器处执行的用于标识先前定义的 会话的过程的流程图。
[0016] 图7描绘了根据一示例实施例的被配置成标识与先前定义的会话相关联的事务 和命令的数据库服务器的会话管理器的框图。
[0017] 图8是根据一示例实施例的在系统中的客户端与数据库服务器之间的信息流的 序列图,该系统在会话失败的情况下允许事务完成。
[0018] 图9示出了根据一示例实施例的用于复制会话状态的过程。
[0019] 图10描绘了根据一示例实施例的在第二数据库服务器处执行的从第一数据库服 务器与客户端之间的会话失败中恢复的过程的流程图。
[0020] 图11是根据一示例实施例的便于从会话失败中恢复的示例系统的框图,其中状 态相关的信息经由共享存储器的使用在第一数据库服务器与第二数据库服务器之间被共 享。
[0021] 图12是根据一示例实施例的便于从会话失败中恢复的示例系统的框图,其中状 态相关的信息经由消息收发在第一数据库服务器与第二数据库服务器之间被共享。
[0022] 图13是可用于实现各实施例的示例性的基于处理器的系统的框图。
[0023]当结合其中相同的附图标记标识对应的元素的附图时,本发明的特征和优点将从 以下阐述的详细描述中变得更加显而易见。在附图中,相同的参考标号一般指相同的、功能 上相似的和/或结构上相似的元素。其中元素第一次出现的附图由对应的参考标号中最左 侧的数字指示。
【具体实施方式】
[0024] I.引言
[0025] 以下详细描述参考示出本发明的示例性实施例的附图。但是,本发明的范围不限 于这些实施例,而是由所附权利要求书定义。因此,诸如所示实施例的修改版本之类的在附 图所示之外的实施例仍然由本发明所包含。
[0026] 本说明书中对"一个实施例"、"实施例"、"示例实施例"等的引用指的是所述实施 例可包括特定的特征、结构或特点,但是每一实施例不一定包括该特定的特征、结构或特 点。此外,这些短语不一定指相同的实施例。此外,当结合实施例描述具体特征、结构或特性 时,应当理解在相关领域的技术人员的知识范围内能够结合其他实施例来实现具体特征、 结构或特性,无论是否被显式地描述。
[0027] 本文描述的各实施例便于从客户端与数据库服务器之间的会话失败中恢复,并且 允许高效地完成在此类失败会话期间处于进程中的事务。客户端可以发起在数据库服务器 处实现多个数据库命令的事务,数据库命令诸如存储/写入数据、检索/读取数据以及更新 /修改所存储的数据库的数据之类的命令。在一实施例中,事务也可以是原子事务。根据原 子事务,"原子性"得到保证,以使得针对数据库该事务的所有数据库命令都被执行,或者没 有一个该事务的数据库命令被执行。这一原子性的保证防止对数据库的更新部分地发生, 部分地发生与整体上拒绝事务相比会造成更大的问题。因此,通常,在处理原子事务期间的 连接失败造成整个事务失败,从而造成事务的所有命令要被重复。各实施例允许遭受连接 失败的事务从失败点继续,而不是必须从开头被重试。
[0028] 章节II描述了用于以允许从会话失败中恢复的方式进行数据库查询的示例实施 例。章节III描述了其中第一数据库服务器与客户端之间的会话失败在客户端与第二数据 库服务器之间被恢复的示例实施例。章节IV描绘了可以被用于实现本文描述的各实施例 的示例性的基于处理器的计算机系统。最后,章节V提供一些总结性评述。
[0029] 尽管本文描述的实施例在包括数据库服务器的系统中实现,但相关领域的技术人 员可以容易地理解,本文描述的概念可以容易地扩展到其中在第一实体至第二实体之间建 立会话以供执行数据请求并且其中需要从会话失败中恢复的任何系统是期望的。这样的系 统可以包括但不限于各种各样的客户端一服务器系统、对等系统等中的任意系统。
[0030] 本发明的多个示例性实施例在以下描述。应当理解,在此提供的任何章节/子章 节标题不旨在限制。本文档中描述了各实施例,并且任何类型的实施例可被包括在任何章 p/于早下。
[0031] II.用于以允许恢复的方式在客户端与数据库服务器之间进行会话的示例实施例
[0032] 图1是根据一实施例的便于从会话失败中恢复并且允许在会话失败期间打开的 事务继续的示例系统100的框图。系统100在本文仅作为说明来描述而非旨在限制。然而, 相关领域的技术人员将理解本文描述的实施例可以在除系统100以外的系统中实现。
[0033] 如图1所示,系统100包括客户端102,客户端102经由通信信道106a通信地连接 至第一数据库服务器104a,并且经由通信信道106b通信地连接至第二数据库服务器104b。 数据库服务器l〇4a和104b旨在表示响应于经由通信信道106a和106b接收客户端(诸如 客户端102)所生成的命令来对存储在其可访问的一个或多个数据库中的数据执行操作的 实体。数据库服务器l〇4a和104b中的每一个所执行的操作可以包括例如,存储、检索、分 析和/或操纵数据库数据。数据库服务器l〇4a和104b各自可实现为在单个机器上或跨多 个机器执行的计算机程序。如相关领域技术人员将理解地,这样的机器可以包括物理机或 虚拟机。在一个实施例中,数据库服务器104a和104b各自可以是华盛顿州雷蒙德市的微 软公司发布的MICROSOFTSQLSERVER?的实例。然而,这仅仅是示例而非旨在限制。
[0034] 在一个实施例中,数据库服务器104a和104b各自包括被配置成执行从一个或多 个客户端(诸如客户端102)接收到的命令的独立数据库服务器。在替换实施例中,数据库 服务器l〇4a和104b可以被包括在运行在机器群集上的多个数据库服务器实例中,并且可 被用于以允许故障转移和高可用性的方式服务来自多个客户端(诸如客户端102)的请求。 在又一实施例中,数据库服务器104a和104b各自可以包括被用于实现云数据库服务的多 个数据库服务器实例之一,云数据库服务诸如但不限于华盛顿州雷蒙德市的微软公司提供 的MICROSOFTSQLAZURE?。在各实施例中,可以呈现与数据库服务器104a和104b类似的 任何数量的数据库服务器,包括数十个、数百个以及甚至更大数量的数据库服务器。
[0035] 客户端102旨在表示生成命令并且将命令发送给数据库服务器104a和104b由此 供执行的实体。例如,如图1所示,客户端102包括命令生成器112。命令生成器112可以 被配置成为随事务的每一命令生成ID。每次将事务的命令传送给数据库服务器时,事务内 特定命令的命令ID也被传送给数据库服务器。可以生成事务自身的标识符以标识事务,并 且可以任选地将标识符与每一命令ID-起传送。当事务在会话(例如虚拟会话)范围内 在客户端102与数据库服务器之间进行时,标识会话的会话标识符也可被生成,该会话标 识符可以也与每一命令一起传送或可以不与每一命令一起传送。数据库服务器可以为客户 端执行的命令的示例包括存储、检索、和/或修改数据库数据的命令。
[0036] 客户端102可以被实现为在一个或多个机器上执行的一个或多个计算机程序。例 如,客户端102可以在任何类型的固定或移动计算设备中实现,包括桌面计算机(例如,个 人计算机等)、移动计算机或计算设备(例如,Palm?设备、R頂Blackberry?设备、个人 数字助理(PDA)、膝上型计算机、笔记本计算机、平板计算机(例如,AppleiPad?)、上网本 等等)、移动电话(例如,蜂窝电话、智能电话,诸如AppleiPhone、GoogleAndroid?手机、 MicrosoftWindows?手机等)或其它类型的固定或移动设备。
[0037] 客户端102以及数据库服务器104a和104b各自可以由经由特定通信基础架构彼 此连接的不同机器来执行。进一步根据这一实现,可以按与特定通信基础架构相对应的方 式建立通信信道l〇6a和106b。例如,在其中通信基础架构包括诸如局域网(LAN)、广域网 (WAN)或网络的组合(诸如因特网)之类的网络的实施例中,已知联网协议可以用于建立 客户端102与数据库服务器104a和104b之间的通信信道106a和106b。作为另一示例, 在其中数据库服务器l〇4a和104b被包括在云数据库服务中的实施例中,可经由网关机器 建立通信信道l〇6a和106b,该网关机器充当客户端102在其上运行的机器与数据库服务 器104a和104b在其上运行的机器之间的中介。这一网关设备当存在时可以允许在特定时 间在客户端102与数据库服务器104a和104b中的一个之间进行通信。用于建立通信信道 106a和106b的又一些通信基础架构和相关联的方法是可能的。
[0038] 客户端102与数据库服务器104a和104b中的一者或两者可以在同一机器上执行 也是可能的。根据这一实现,通信信道106a和106b中的一者或两者可以包括两个实体在 其上执行的机器内部的信道。
[0039] 一般而言,通信信道106a和106b用于将客户端102所生成的命令分别传输给数 据库服务器l〇4a和104b中的一者或两者,以使得数据库服务器104a和/或104b可以执 行这样的命令。数据库服务器l〇4a和104b还可以经由通信信道106a和106b将所请求的 数据、出错消息、或其他信息返回给客户端102。根据某些实施例,客户端102与数据库服务 器104a和104b之间交换信息的方式由这两个实体都支持的标准应用层协议来管控。例如, 在特定实施例中,应用层协议包括表格数据流(MS-TDS)协议,如华盛顿州雷蒙德市的微软 公司发布的表格数据流协议规范的版本20120328中定义的。然而,这只是示例并且可以使 用其他协议。
[0040] 根据特定实施例,为了出于调用数据库服务器104a和104b的服务目的与数据库 服务器104a和104b交互,客户端102连接到数据库服务器104a和104b之一并且与其建立 本文所谓的会话。例如,客户端102可以与数据库服务器104a连接以建立会话。会话表示 客户端102与数据库服务器104a之间正在进行的交互式信息交互。可以在某一时间点设 置或建立会话并且随后在稍后的时间点结束会话。在所建立的会话期间,客户端102可以 与数据库服务器l〇4a进行任何数量的事务,并且可以向数据库服务器104a发送每一事务 内的任何数量的命令。数据库服务器l〇4a可以响应于执行或尝试执行这样的命令来向客 户端102返回结果、出错码或其他信息(当会话在客户端102与数据库服务器104b之间被 建立时客户端102可以另选地以类似方式与数据库服务器104b交互)。例如,客户端102 可以向数据库服务器l〇4a传送SQL(结构化查询语言)命令(诸如SELECT查询)或其他 命令。SELECT查询可以用于从数据库服务器管理的一个或多个数据库表检索数据(例如, 一个或多个行和/或列)。客户端102可以传送其他类型的命令,包括将数据写入数据库 (例如,写入一个或多个表的一个或多个行和/或列)、修改数据库的数据等的命令。
[0041] 当数据库服务器104a从客户端102接收在原子事务内的写入和/或更新命令时, 数据库服务器l〇4a可以不执行对数据库的实际写入/更新,直到接收到事务的所有命令。 例如,为在实际数据库中作出写入/更新做准备时,数据库服务器l〇4a可以通过在临时存 储器(例如,高速缓存存储器)中执行某种数据库操纵来部分地执行这些命令。数据库服 务器104a还可以使用锁(例如,锁定数据库记录)来防止其他人(例如,其他客户端)将 数据写入数据库的受命令影响的部分,这取决于客户端要求的隔离级别。当客户端102已 将事务的所有命令传送给数据库服务器l〇4a时,客户端102可以将提交命令传送给数据库 服务器l〇4a。提交命令指令数据库服务器104a完全地执行事务的所有命令,这可以导致 数据库服务器l〇4a实际上向数据库写入数据和/或修改数据库中的数据。在数据库服务 器104a完全地执行事务的所有命令之后,数据库服务器104a可以将提交完成响应传送给 客户端102。
[0042] 如图1所示,数据库服务器104a包括事务日志管理器116a,并且数据库服务器 104b包括事务日志管理器116b。事务日志管理器116a和116b为其相应的数据库服务器 类似地运作。此外,可以呈现同样包括与事务日志管理器116a和116b类似的事务日志管 理器的附加数据库服务器。出于简要目的,会话管理器114a和事务日志管理器116a被描 述成如下,并且本说明书旨在表示会话管理器114b和事务日志管理器116b的功能(以及 可以在其他数据库服务器中呈现的又一些事务日志管理器的功能)。
[0043] 第一数据库服务器104a的会话管理器114a与客户端(诸如客户端)建立会话以 处理客户端的数据库查询。例如,会话管理器114a可以从客户端接收会话标识符,该会话 标识符被用于与客户端建立会话并且被会话管理器114a用于标识与所建立的会话相关联 的通信。替换地,会话管理器114a可以被配置成为会话生成会话标识符,并且将会话标识 符传送给客户端。此外,会话管理器114a允许与客户端的事务在所建立的会话中打开,并 且从客户端接收事务范围内的命令。会话管理器114a使得对收到命令的响应能够在适当 时传送给客户端102。会话管理器114b按照与会话管理器114a为第一数据库服务器104a 运作的类似方式为第二数据库服务器l〇4b运作。
[0044] 事务日志管理器116a被配置成生成事务日志108。事务日志108包含表示数据库 服务器104a与客户端102之间的事务在任何特定时间的状态的信息。由此,事务日志108 可用于从客户端102与数据库服务器104a之间的会话失败中恢复处于进程中的事务。事 务日志108可以包括各种类型的事务信息。例如,事务日志管理器116a可以将客户端102 与数据库服务器l〇4a之间打开的事务的事务标识符存储在事务日志108中。此外,事务日 志管理器116a可以将与由客户端102生成且由数据库服务器104a接收到的每一事务命令 相关联的命令标识符存储在事务日志108中。
[0045] 更进一步地,对于事务的每一命令,事务日志管理器116a可以将关于命令是否已 被成功执行的指示存储在事务日志108中。这意味着对于一命令,事务日志管理器116a可 以在事务日志108中指示是否已经针对数据库服务器104a可访问的数据库执行了该命令 (就该命令可以在提交事务之前被执行而言)、以及是否返回了响应(例如,数据)。例如, 对于读取命令,事务日志管理器116a可以指示可应用数据是否已从数据库中被读取并且 被存储在临时存储(例如,高速缓冲存储器等)中和/或事务日志108本身中以便在从客 户端102接收到提交指令之后传送给客户端102,或者数据是否已被传送给客户端。对于写 入命令,事务日志管理器116a可以指示在从客户端102接收到提交指令之后要写入数据库 的数据是否已准备好被写入(例如,是否被存储在临时存储中),或者数据是否已被写入数 据库。类似地,对于修改命令,事务日志管理器116a可以指示在从客户端102接收到提交 指令之后修改数据是否已准备好被写入到数据库(例如,是否被存储在临时存储中),或者 修改数据是否已被写入数据库。
[0046] 事务日志管理器116a的上述操作使得会话管理器114a和事务日志管理器116a 能够辅助数据库服务器l〇4a(或其他数据库服务器,诸如数据库服务器104b)从客户端102 与数据库l〇4a之间的会话失败中恢复。例如,如果客户端102与数据库服务器104a之间 发生会话失败(例如,由于连接失败、数据库服务器l〇4a中的失败等)从而造成正在处理 的事务的命令没有得到响应,则客户端102可以将命令与命令标识符以及事务的和失败会 话的标识符一起重新传送给数据库服务器l〇4a。数据库服务器104a可以重新建立失败会 话,并且可以将收到事务及命令标识符与事务日志108作比较。如果事务日志108的事务 标识符与收到事务标识符相匹配,并且收到命令标识符与事务日志108中所指示的命令相 匹配,则该命令已经被数据库服务器104a接收到,并且关于该命令是否已经被成功执行的 指示可以被检查。如果该命令未被成功执行,则此时可以执行该命令。如果事务日志108 与收到事务标识符相匹配,但收到命令标识符与事务日志108中所指示的命令不匹配,则 该命令先前未被数据库服务器l〇4a接收到,并且因此可以作为事务的新命令来对待。失败 会话可以按此方式来重建,并且事务可以在客户端102与数据库服务器104a之间从失败点 继续。
[0047] 替换地,如本文描述的,事务日志管理器116a可以向另一数据库服务器(诸如数 据库服务器l〇4b)提供事务日志108的副本,被示为经复制的事务日志110。如果在打开 事务中间在客户端102与数据库服务器104a之间发生会话失败,则客户端102可以将该命 令与会话、事务以及命令标识符一起重传。经重传的命令可以由数据库服务器l〇4b而不是 数据库服务器l〇4a来接收。这可能是因为数据库服务器104a由于系统崩溃或其他原因而 不运作。数据库服务器104b可以将收到命令标识符和事务标识符与存储在经复制的事务 日志110中的那些标识符作比较,并且如果存在匹配,则该命令已经被数据库服务器104a接收到,并且关于该命令是否已经被成功执行的指示可以在经复制的事务日志110中被检 查。如果指示该命令未被成功执行,则此时可以由第二数据库服务器l〇4b执行该命令。如 果经复制的事务日志110包括对收到的事务标识符的匹配,但收到的命令标识符与事务日 志108中所指示的命令不匹配,则该命令先前未被数据库服务器104a接收到,并且因此数 据库服务器l〇4b可以将该命令作为事务的新命令来对待。失败会话可以按此方式在客户 端102与数据库服务器104b(而不是数据库服务器104a)之间被重建,并且在客户端102 与数据库服务器l〇4b之间从失败点继续。
[0048] 如下参考图2-10来描述根据各个实现的关于系统100的组件的结构、功能和操作 的更多信息。
[0049] 具体而言,图2是示出根据一个示例实施例的客户端200的各个组件的框图。客 户端200是图1所示的客户端102的一示例。如图2所示,客户端200包括应用202和数 据库驱动程序204。应用202包括使其用户能够执行各种功能的计算机程序,这些功能中 的至少一些要求执行数据库操作。为便于执行这些数据库操作,应用202被编程为与数据 库驱动程序204交互。在一实施例中,应用202可以被认为包括在客户端200中(如图2 所示)或可以与客户端200分开。例如,在一个实施例中,应用202和客户端200可以在公 共计算设备上操作,并且应用202可以访问客户端200以与数据库服务器处的数据库通信。 应用202可以是(例如,使用SQL查询或提供给数据库驱动程序204的其他类型的数据库 请求)访问存储在数据库中的数据的任何类型的应用。数据库驱动程序204操作以便在应 用202或各种其他应用中的任意个与数据库服务器之间建立连接,并且出于从数据库服务 器获取服务的目的利用这一连接。
[0050] 在一个实施例中,数据库驱动程序204提供可由各种应用用于调用其功能的应用 编程接口(API) 212。如图2中进一步示出,数据库驱动程序204还包括命令ID生成器218、 解析器220和协议层222。命令ID生成器218形成图1的命令生成器112的示例。图2的 这些特征被描述成如下。
[0051] 命令ID生成器218被配置成在事务范围内为客户端200所生成的每一命令生成 ID以供传输至数据库服务器以及供数据库服务器执行。在一个实施例中,命令ID生成器 218为这样生成的每一命令生成唯一的ID。当客户端200将命令发送给数据库服务器时, 客户端200还将与该命令相关联的命令ID发送给该数据库服务器(并且可任选地包括相 关联的事务标识符和会话标识符)。例如,在一个实施例中,命令及其对应的命令ID被包括 在从客户端200传送给数据库服务器的同一消息内。
[0052] 解析器220被配置成根据特定应用层协议(诸如但不限于MS-TDS)来解码要发送 给数据库服务器的命令并且解释从中接收到的信息。在一个实施例中,协议层222旨在表 示硬件(例如,一个或多个处理器)中执行的一个或多个计算机程序,该计算机程序由数据 库驱动程序204用于将解析器220产生的已编码命令携带到数据库服务器并且从中接收已 编码?目息。
[0053] 根据图2所示的实施例,会话ID生成器328和命令ID生成器218所执行的功能 是在数据库驱动程序204级而不是在应用202级执行的。这是有利的,因为这可以减轻被 设计成调用数据库驱动程序204的应用(诸如应用202)的程序员必须将旨在从事务和会 话失败中恢复的特征编程到其应用的负担。另外,通过在数据库驱动程序级而不是在应用 级合并这样的功能,本文描述的实施例可以有利地降低这些应用的复杂度。
[0054] 图3是示出根据又一示例实施例的数据库服务器300的各个元素的框图。数据库 服务器300是图1所示的数据库服务器104a和104b的一个示例。如图3所示,在该又一 示例实施例中,数据库服务器300包括会话管理器302,引擎304,事务日志管理器306,远程 复制会话状态处理程序308,解析器310和协议层312。会话管理器302包括会话ID生成 器328和事务ID生成器330。
[0055] 会话管理器302与客户端(诸如图2的客户端200)建立会话以处理该客户端的 数据库查询。例如,会话管理器302可以生成会话标识符或者可以从客户端接收会话标识 符,该会话标识符被用于与客户端建立会话并且被会话管理器302用于标识与所建立的会 话相关联的通信。例如,会话管理器302的会话ID生成器328被配置成为客户端200与数 据库服务器之间建立的每一会话生成ID,以完成从应用202接收到的数据请求(例如,SQL SELECT查询等)。在一个实施例中,会话ID生成器328为每一会话生成唯一的ID。会话 ID可以如图3所示地由会话ID生成器328在数据库服务器300处生成、或者作为替换可以 在客户端处生成并且传送给该数据库服务器以建立会话,并且可任选地被包括在所建立的 会话范围内发生的去往和来自该数据库服务器的后续通信中(以便将这些通信标识为在 该会话范围内)。
[0056] 此外,会话管理器302可以使得事务在所建立的会话范围内被打开,并且可以从 客户端接收与事务相关联的命令。例如,会话管理器302的事务ID生成器330被配置成在 会话范围内为由客户端200打开的与数据库服务器的每一事务生成ID。在一个实施例中, 事务ID生成器330为每一不同事务生成唯一的ID。数据库服务器300可以将事务ID传送 给客户端以打开(例如,开始)事务。替换地,客户端可以为所打开的事务生成事务ID,并 且将所生成的事务ID传送给数据库服务器300。
[0057] 在会话和事务失败的情况下,会话管理器302可以在会话失败之后所传送的通信 中从客户端接收会话标识符,并且如果在该通信中接收到的会话标识符与存储在会话的会 话状态中的会话标识符相匹配,则使得失败会话能够被重建。此外,会话管理器302可以从 客户端接收与失败事务相对应的事务标识符,并且如果在该通信中接收到的事务标识符与 存储在会话的事务日志中的事务标识符相匹配,则使得失败事务能够继续。
[0058]引擎304被配置成与一个或多个数据库(诸如与数据库服务器300相关联的数据 库316)交互,以便基于收到命令对存储其中的数据执行各种操作,其中这些操作包括但不 限于存储、读取、分析和/或修改数据库数据。
[0059] 事务日志管理器306旨在表示以上参考图1的系统100描述的事务日志管理器 116a和116b的一个实现,并且由此执行归属于事务日志管理器116a和116b中的每一个 的功能。例如,事务日志管理器306可以生成存储所打开的事务的事务标识符的事务日志 324,与事务的每一收到命令相关联的命令标识符,以及关于每一收到命令是否已经被成功 执行(部分地还是完全地执行)的指示。事务日志324是以上描述的事务日志108的一个 示例。事务日志324可以被包括在所建立的由会话管理器302管理的会话的会话状态320 中。例如,会话管理器302可以将会话的会话标识符存储在会话状态320中。此外,可以将 与会话相关联的临时存储的数据(诸如引擎304响应于一个或多个命令从数据库316检索 到的数据)存储在会话状态320中(例如,在传送给客户端之前)。如图3所示,可以将会 话状态320存储在状态数据储存库318中。状态数据储存库318 (以及本文其他地方描述 的任何其他状态数据储存库)可包括任何类型的存储机制中的一个或多个,包括(例如,在 硬盘驱动器中的)磁盘、(例如,在光盘驱动器中的)光盘、诸如RAM设备(例如,用于临时 存储的高速缓存存储器)等存储器设备、和/或任何其他合适类型的存储介质。
[0060] 更进一步地,在生成会话状态320之后,会话管理器302可任选地将会话状态320 复制(例如,拷贝)到至少一个附加数据库服务器(如图3中由向左的箭头标记320指示 的)。经复制的会话状态使得一个或多个附加数据库服务器能够重建当前会话,并且在当前 会话失败的情况下继续任何打开的事务。
[0061] 可任选地呈现远程复制会话状态处理程序308。远程复制会话状态处理程序308 被配置成从其他数据库服务器接收经复制的会话状态。例如,如图3所示,远程复制会话状 态处理程序308从远程服务器(图3中未示出)接收经复制的会话状态322,并且将经复制 的会话状态322存储在状态数据储存库318中。经复制的会话状态322使得数据库服务器 300能够对重建失败会话作出响应,并且对于在不同数据库服务器处失败的会话,继续失败 会话的打开事务。如图3所示,经复制的会话状态322包括经复制的事务日志326。经复制 的事务日志326是来自另一数据库服务器的事务日志的副本,并且可用于在数据库服务器 300处继续在其他数据库服务器处打开的事务。
[0062] 解析器310被配置成根据特定应用层协议(诸如但不限于MS-TDS)来解释数据库 服务器300接收到的客户端生成的命令并且编码要发送给各客户端的信息。在一个实施例 中,协议层312旨在表示硬件(例如,一个或多个处理器)中执行的一个或多个计算机程 序,该计算机程序由数据库服务器300用于将解析器310产生的已编码信息携带到适当客 户端并且从中接收已编码命令。
[0063] 图4A和4B描绘了根据一示例实施例的在数据库服务器处执行的用于执行与数据 库服务器和客户端之间的事务相关联的命令的过程的流程图400。出于说明目的,现在将继 续参考上面参考图1-3所述的示例实施例来描述流程图400。然而,流程图400的方法不限 于那些实施例。
[0064] 如图4A所示,流程图400的方法在步骤402处开始。在步骤402,与客户端建立 第一会话以处理客户端的数据库查询。例如,如上所述,数据库服务器的会话ID生成器 328(图3)可以生成用于标识特定会话的会话标识符。在一实施例中,会话ID生成器328 可以执行图5所示的流程图500的步骤502。在步骤502,为第一会话生成会话标识符。会 话ID生成器328可以按任何方式生成会话标识符,包括使先前生成的会话标识符的数值递 增,按随机或伪随机方式生成会话标识符,或按另一方式生成会话标识符。
[0065] 参考图1,数据库服务器104a可以将会话标识符传送给客户端以发起与该数据库 服务器的会话。例如,数据库服务器l〇4a可以在经由通信信道106a所传送的通信中将会 话标识符传送给客户端102,并且可以存储会话标识符(例如,存储在会话状态320中),以 及可以与客户端102建立会话。例如,参考图3,会话管理器302可以与客户端建立会话,并 且可以从客户端接收确认。在建立会话时,客户端与数据库服务器可以协商会话的各个参 数,包括验证和加密技术/协议等。操作从步骤402行进至步骤404。
[0066] 注意,在替换实施例中,客户端102可以生成会话标识符,并且可以将所生成的会 话标识符传送给数据库服务器l〇4a以建立会话。
[0067] 参考图4A,在步骤404,打开第一会话的事务以便为客户端执行与事务相关联的 多个命令。例如,如上所述,数据库服务器l〇4a可以打开与客户端102的事务以执行一系列 数据库命令。事务可以是原子事务,以使得事务的所有数据库命令都被执行,或者没有一个 数据库命令被执行(在存在失败的情况下)。数据库服务器300的事务ID生成器330 (图 3)可以生成用于标识特定事务的事务标识符。例如,在一实施例中,事务ID生成器330可 以执行如图5所示的流程图500的步骤504。在步骤502,为事务生成事务标识符。事务ID 生成器330可以按任何方式生成事务标识符,包括使先前生成的事务标识符的数值递增, 按随机或伪随机方式生成事务标识符,或按另一方式生成事务标识符。
[0068] 参考图1,数据库服务器104a可以将会话标识符传送给客户端以便(例如,响应 于从客户端接收到的请求)发起与客户端的会话。例如,数据库服务器l〇4a可以将事务标 识符传送给客户端以便发起或打开与数据库服务器的事务。客户端102可以在经由通信信 道l〇6a所传送的通信中从数据库服务器104a接收事务标识符,并且可以存储收到事务标 识符,以及可以打开与客户端102的事务。例如,参考图3,事务日志管理器306可以将事务 标识符存储在为事务生成的事务日志324中。客户端102和/或数据库服务器104a可以 传送事务被打开的确认。操作从步骤404行进至步骤406。
[0069]回头参考图4A,在步骤406,从客户端接收与事务相关联的至少一个命令,每一收 到命令与相关联的命令标识符一起被接收。在各实施例中,在已打开事务范围内可以将任 何数量的命令从客户端102传送给数据库服务器104a,包括读取、写入或更新数据库数据 的命令。数据库服务器l〇4a可以对这些命令中的每一个作出响应。数据库服务器104a可 以接收与一个或多个收到命令中的每一个相关联的命令ID。如以上讨论的,这样的命令ID 可以由客户端200内的命令ID生成器218 (图2)生成并且连同其关联命令一起传送给数 据库服务器l〇4a。例如,在一实施例中,命令ID生成器218可以为每一命令执行如图5所 示的流程图500的步骤506。在步骤504,为命令生成命令标识符。命令ID生成器218可 以按任何方式生成命令标识符,包括使先前生成的命令标识符的数值递增(例如,按顺序 生成命令标识符),按随机或伪随机方式生成命令标识符,或按另一方式生成命令标识符。
[0070] 参考图2所示的客户端200的实现,这样的命令可以由解析器220编码,并经由协 议层222发送给数据库服务器104a。参考图3所示的数据库服务器300的实现,已编码命 令可以经由协议层312接收并且由解析器310解释。操作从步骤406行进至步骤408。
[0071] 回头参考图4A,在步骤408,生成事务日志,该事务日志存储命令标识符并且指示 每一收到命令是否已经被成功执行。在各实施例中,数据库服务器l〇4a尝试执行数据库服 务器104a在步骤406接收到的每一命令。参考图3所示的数据库服务器300的实现,引擎 304可以执行命令,包括检索所请求的数据、写入数据、以及修改数据库316中的数据。在等 待传送给客户端102时,读取数据可任选地存储在会话状态320中。在原子事务的情况下, 在数据库316中写入和修改数据可能不被完全执行直到从客户端102接收到提交指令。事 务日志管理器306被配置成将与事务的每一收到命令相关联的命令标识符存储在事务日 志324中。此外,事务日志管理器306将关于每一收到命令是否已经被成功执行(例如,部 分地或完全地执行)的指示存储在事务日志324中。操作从步骤408行进至步骤410。
[0072] 在步骤410,在第一会话中的失败之后,从客户端接收重建第一会话的请求、与事 务相关联的进一步命令以及该进一步命令的命令标识符。如上所述,客户端与数据库服务 器之间的会话可能经历会话失败。会话失败可能出于各种原因而发生,包括客户端与数据 库服务器之间的网络失败、或数据库服务器中的失败(例如,服务器崩溃等)。在一实施例 中,这样的失败之后,可以恢复客户端与数据库服务器之间的会话,并且在会话失败时打开 的任何事务可以按高效方式继续。
[0073] 参考图1,在会话失败之后,客户端102可以尝试与数据库服务器104a重建失败 会话。在这种情况下,客户端102可以在重建会话的请求中将用于失败会话的会话标识符 重新传送给数据库服务器l〇4a。此外,客户端102可以将进一步命令与该进一步命令的命 令标识符一起传送给数据库服务器l〇4a。数据库服务器104a可以在同一通信中或在分开 的通信中从客户端102接收重建会话的请求以及命令的重传。操作从步骤410行进至步骤 412〇
[0074] 回头参考图4A,在步骤412,重建与客户端的第一会话。数据库服务器104a可以分 析接收到的重建会话的请求,以确定是否重建与客户端102的会话。例如,在一实施例中, 数据库服务器l〇4a可以执行图6所示的过程。图6描绘了根据一示例实施例的在数据库 服务器处执行的用于标识先前定义的会话的过程的流程图600。
[0075] 如图6所示,流程图600以步骤602开始。在步骤602,在传送给数据库服务器的 通信中从客户端接收会话标识符以重建会话。如上所述,数据库服务器l〇4a可以在重建会 话的请求中从客户端102接收用于失败会话的会话标识符。
[0076] 在步骤604,确定在该通信中接收到的会话标识符与存储在会话状态中会话标识 符相匹配。在一实施例中,数据库服务器l〇4a可以将在步骤602中接收到的会话标识符与 存储在一个或多个会话状态中的各会话标识符作比较,以确定收到会话标识符是否针对预 先存在的会话。
[0077] 例如,在一实施例中,图3的会话管理器302可以执行该比较。图7是根据一示例 实施例的图3的会话管理器302的框图。如图7所示,会话管理器302可以包括会话ID比 较器702、事务ID比较器704以及命令ID比较器706。会话ID比较器702被配置成将通 信中从客户端接收到的会话标识符与存储在会话状态中的会话标识符作比较。会话ID比 较器702可以通过将在请求中接收到的用于重建会话的会话标识符与事务日志108(图1) 中的会话标识符作比较来执行步骤604。如果会话标识符匹配,则会话ID比较器702指示 匹配,并且会话管理器302可以使得会话能够被重建。如果收到会话标识符与所存储的会 话状态中的会话标识符不匹配,则会话ID比较器702指示未找到匹配。在这种情况下,会 话管理器302可能无法使得会话被重建。(作为替代,在不同的数据库服务器处发生匹配的 情况下,会话可能潜在地用该不同的数据库服务器来重建)。操作从图4A中的步骤412前 进至图4B中的步骤414。
[0078] 参考图4B,在步骤414,确定命令标识符是否已经存储在该进一步命令的事务日 志中。在一实施例中,从客户端102接收到的该进一步命令可以是客户端102对先前所传 送的命令的重传,该先前所传送的命令可能已经被数据库服务器104a接收到和/或成功执 行或者可能由于会话失败而未被数据库服务器l〇4a接收到和/或成功执行。例如,由于会 话失败,客户端102可能未从数据库服务器104a接收到关于该命令的确认,并且由此可能 甚至不知晓该命令是否被数据库服务器104a接收到。
[0079] 数据库服务器104a可以分析接收到的重新传送的命令以确定如何继续。数据库 服务器l〇4a可以确定事务日志108中是否指示了收到命令的命令标识符。例如,在一实施 例中,参考图7,会话管理器302的事务ID比较器704可以将收到命令的事务标识符与存储 在事务日志108中的事务标识符作比较,以确定命令是否是打开事务的一部分。如果事务 标识符没有存储在事务日志108中,则数据库服务器104a可以将该命令作为不同事务的一 部分来对待。如果事务标识符存储在事务日志108中,则该进一步命令被认为是打开事务 的一部分。会话管理器302的命令ID比较器706随后可以将接收到的进一步命令的命令 标识符与存储在事务日志108中的任何命令标识符作比较。在找到匹配的情况下操作前进 至步骤416。如果接收到的命令标识符与事务日志108中的任何命令标识符都不匹配,则操 作前进至步骤418。
[0080] 在步骤416,确定是否成功执行了该进一步命令。由于该进一步命令的命令标识符 位于事务日志中,因此该命令是先前在数据库服务器l〇4a处从客户端102接收到的。根据 步骤416,会话管理器302 (图3)可以访问事务日志324以寻找关于是否成功执行了该进一 步命令的指示。如果指示是未成功执行该进一步命令,则操作前进至步骤418。如果指示是 成功执行了该进一步命令,则操作前进至步骤422。
[0081] 在步骤418,尝试执行该进一步命令。由于该进一步命令被指示为未被成功执行 (这可能意味着根本没有执行该进一步命令),因此尝试执行该进一步命令。例如,引擎 304(图3)可以执行该进一步命令(例如,读取、写入和/或更新数据)。如上所述,如果打 开事务是原子事务,则该进一步命令可以被部分地执行。操作从步骤418前进至步骤420。
[0082] 在步骤420,用命令标识符以及关于该进一步命令是否已经被成功执行的指示来 注释事务日志。在一实施例中,在执行命令之后,事务日志管理器306 (图3)可以用已执行 命令的命令标识符(在事务日志324中尚不存在的情况下)来注释事务日志324,并且可以 在事务日志324中指示该命令是否被成功执行(例如,部分地或完全地执行)。操作从步骤 420前进至步骤424。
[0083] 在步骤422,避免重新执行该进一步命令。由于该进一步命令被指示为被成功执 行,因此无需再次执行该进一步命令。例如,在数据库服务器l〇4a先前从客户端102接收 到该进一步命令时,该进一步命令可能先前已被执行。操作从步骤422前进至步骤424。
[0084] 在步骤424,确定是否从客户端接收到另一命令。在各实施例中,在步骤410接收 到的该进一步命令可以是打开事务的最后一个命令,或者对于打开事务可能接收到附加命 令。如果从客户端102接收到打开事务的另一命令(例如,如与该命令一起接收到的事务 标识符所指示的,和/或由在事务仍处于打开时接收到的命令所指示的等),则操作前进至 步骤426。如果未接收到另一命令,则操作前进至步骤430。
[0085] 在步骤426,尝试执行该命令。按照与步骤418中类似的方式,引擎304 (图3)可 以执行该命令(例如,读取、写入和/或更新数据)。如上所述,如果打开事务是原子事务, 则该命令可以被部分地执行。操作从步骤426前进至步骤428。
[0086] 在步骤428,用命令标识符以及关于该命令是否已经被成功执行的指示来注释事 务日志。类似于步骤420,在执行命令之后,事务日志管理器306(图3)可以用已执行命令 的命令标识符(在事务日志324中尚不存在的情况下)来注释事务日志324,并且可以在事 务日志324中指示该命令是否被成功执行。操作从步骤428前进至步骤424。
[0087] 在步骤430,从客户端接收事务的提交指令。在客户端102向数据库服务器104a 提交打开事务的所有命令(并且接收到对应的确认)之后,客户端102可以将提交命令传 送给数据库服务器l〇4b以提交事务。操作从步骤430前进至步骤432。
[0088] 在步骤432,提交事务。数据库服务器104a(例如,会话管理器302)导致事务的 所有命令被完全地执行(例如,对数据库316中的数据作出写入和/或更新等)。可以向 客户端102传送任何要传送给客户端102的数据(例如,由于数据库读取等)。数据库服 务器104a可以将提交确认传送给客户端102。此外,事务日志管理器306可以在事务日志 324中将事务指示为已完成,或者可以删除事务日志324。流程图400的操作完成。
[0089] 因此,通过生成和存储事务日志108,事务日志管理器306 (图3)使得客户端102 和数据库服务器l〇4a能够从会话失败中恢复并且继续打开事务。在(诸如通过接收连接 或通信失败/出错的指示)检测到失败之后,客户端102可以重新传送当前命令(与命令 标识符一起)、事务标识符、以及失败会话的会话标识符。数据库服务器l〇4a可以接收命 令、事务标识符以及会话标识符,并且会话可以在客户端102与数据库服务器104a之间重 建。此外,打开事务可以继续,并且命令在先前未执行的情况下可以被执行。
[0090] 图8是示出根据一实施例的客户端102与数据库服务器104a之间的示例信息流 的序列图800。本文描述序列图800仅仅为了便于进一步理解系统100可以促成从会话失 败中恢复的方式,而不旨在作为限制。
[0091] 如图8中所示,序列图800所描绘的信息流在客户端102向数据库服务器104a发 送打开新连接的请求802时开始。响应于接收到请求802,数据库服务器104a向客户端102 发送会话已建立响应804 (会话已建立响应804可以包括要建立的新会话的会话标识符), 由此建立所请求的连接。
[0092] 在建立连接之后,客户端102向数据库服务器104a传送开始事务请求806以打开 事务(被称为事务Tl)。数据库服务器104a可以向客户端102传送包括要建立的新事务的 事务标识符的响应(图8中未示出),由此指示该事务处于打开。
[0093] 在客户端102打开与数据库服务器104a的事务之后,客户端102生成命令(被 称为"命令I(Commandl) ")以供传输给数据库服务器104a。客户端102随后向命令1应 用被称为"唯一ID(UniqueID) "的方法以获取与其相关联的唯一ID,被称为"CmdIDI(命令 ID1) "。这在图8中被示为事件808。
[0094] 在客户端102获取与命令1相关联的唯一标识符CmdIDl之后,客户端102向数据 库服务器104a发送命令1及其相关联的唯一IDCmdIDl两者作为消息810的一部分。会 话标识符和事务标识符可以任选地与命令1 一起被发送,以分别标识命令1在已建立会话 和打开事务的范围内。
[0095] 如上所述,数据库服务器104a接收命令1并且至少部分地执行命令1。数据库服 务器104a(例如,图3的事务日志管理器306)可以将命令标识符以及关于命令是否被成功 执行的指示存储在事务日志108中。数据库服务器104a可以向客户端102传送指示命令 1被接收到的确认(图8中未示出)。
[0096] 在传送命令1之后,客户端102生成另一命令(被称为"命令2(Command2) ")以 供传输给数据库服务器l〇4a。客户端102随后向命令2应用唯一ID方法以获取与其相关 联的唯一ID,被称为"命令ID2(CmdID2) "。这在图8中被示为事件812。
[0097] 在客户端102获取与命令2相关联的唯一标识符CmdID2之后,客户端102向数据 库服务器104a发送命令2及其相关联的唯一IDCmdID2两者作为消息814的一部分。会 话标识符和事务标识符可以任选地与命令2 -起被发送,以分别标识命令2在已建立会话 和打开事务的范围内。
[0098] 在消息814被发送之后,客户端102接收发生了错误的指示816。这样的错误可能 由客户端102与数据库服务器104a之间的某种通信失败造成,或者由建立在客户端102与 数据库服务器l〇4a之间的会话的中断造成。
[0099] 由于发生了这样的错误,客户端102无法确定数据库服务器104a是否接收到命令 2 (例如,因为未接收到确认)以及事务是否失败。如果事务失败并且事务是原子事务,则事 务将必须从其开始处被重试。
[0100] 因此,客户端102可以重建与数据库服务器104a的新会话,该新会话作为与先前 中断的会话相同的虚拟会话的一部分。例如,客户端102可以在消息818中将失败会话的 会话标识符重新传送给数据库服务器l〇4a以重建会话。此外,客户端102可以将命令2连 同其唯一IDCmdID2以及事务标识符一起作为消息820的一部分重新传送给数据库服务器 104a〇
[0101] 注意,在会话失败之后如果数据库服务器l〇4a正运作,并且在会话失败后如果在 预定时间量期满之后没有从客户端102接收到请求重建第一会话的通信,则数据库服务器 104a可以删除事务日志108。例如,数据库服务器104a可以假定事务将不会继续,并且可 以删除事务日志108以节省存储(例如,高速缓存存储器)空间。
[0102] 在数据库服务器104a接收到命令2、其唯一IDCmdID2以及事务标识符时,数据 库服务器104a检查以确定CmdID2是否已经被存储在(与事务标识符相关联的)事务日志 108中。这可能需要检查与事务相关联的所有命令ID。如果CmdID2已经被存储在事务日 志108中,则数据库服务器104a可以向客户端102发送指示命令2被接收到的确认(图8 中未示出)。如果事务日志108中未找到CmdID2,则数据库服务器104a可以至少部分地执 行命令2,并且可以向客户端102传送指示命令2被接收到的确认(图8中未示出)。
[0103] 在事务的所有命令已经从客户端102传送给数据库服务器104a(且确认接收到) 时,客户端102传送提交指令822以导致已打开事务(事务Tl)在数据库服务器104a处被 提交。提交指令822可以包括用于向数据库服务器104a标识要提交的事务的事务标识符。 如上所述,作为响应,数据库服务器l〇4a提交事务。当完成时,数据库服务器104a可以向 客户端102传送指示事务被提交的响应(图8中未示出)。
[0104] 如前所示,系统100有利地操作以确保数据库服务器104a能从会话失败中恢复, 并且即使客户端102多次发送同一命令,也不会执行命令超过一次。这种无论接收到多少 次执行命令也不超过一次的能力被称为"幂等命令执行"。这允许在数据库驱动程序级处理 客户端处102的数据库命令,由此解除应用程序员必须将重试特征包括在应用中的负担, 由此简化应用逻辑。
[0105] III.使用不同数据库服务器从客户端与数据库服务器之间的会话失败中恢复的 各示例实施例
[0106] 如上所述,客户端与数据库服务器之间的数据库查询会话可能经历会话失败(例 如,在图4A中流程图400的步骤410之前)。会话失败可能出于各种原因而发生,包括客户 端与数据库服务器之间的网络故障、或数据库服务器中的故障。在一实施例中,这样的失败 之后,代替恢复客户端与同一数据库服务器之间的会话和任何打开事务,可以用不同数据 库服务器来恢复会话和打开事务。例如,原始数据库服务器可能不可用于参与新会话(可 能未正确地运作等)。由此,不同数据库服务器可用于恢复与客户端的会话和各事务。不同 数据库服务器可以按高效方式继续在会话失败时处于打开的任何事务。
[0107] 例如,参考图1,可以将事务日志108复制(拷贝)到另一数据库服务器(诸如数 据库服务器l〇4b)以允许从客户端102与数据库服务器104b之间可能发生的会话失败中 恢复。如图1所示,可以将事务日志108复制到数据库服务器104b作为经复制的事务日志 110。在一实施例中,数据库服务器104a可以执行图9所示的步骤902以复制事务日志。在 步骤902,将会话状态复制到至少一个附加数据库服务器902。参考图3的示例,会话管理 器302可以将会话状态320传送给可访问数据库316 (或其副本)的一个或多个附加数据 库服务器。通过复制会话状态320,事务日志324也可以被复制到该附加数据库服务器。
[0108] 由此,在(诸如通过接收网络连接或通信失败/错误的指示)检测到失败之后,客 户端102可以重新传送失败会话的会话标识符。数据库服务器104b可以接收会话标识符, 诸如通过将通信路由给数据库服务器104b而不是数据库服务器104a(例如,由于数据库服 务器104a未运作等)的网络网关设备。在另一实施例中,客户端102可以包括数据库服务 器列表,并且在与当前数据库服务器的会话失败时(例如,在一次或多次重试之后,等等) 可以尝试该列表中的不同数据库服务器。数据库服务器104b可以基于同一会话标识符与 客户端102建立会话。随后,可以在数据库服务器104b处处理客户端102所传送的事务的 命令,其中经复制的事务日志110用于管理事务。
[0109] 图10描绘了根据一示例实施例的在第二数据库服务器处执行的从第一数据库服 务器与客户端之间的会话失败中恢复的过程的流程图100。出于说明目的,现在将继续参考 上面参考图1-3所述的示例实施例来描述流程图1000。然而,流程图1000的方法不限于那 些实施例。
[0110] 如图10所示,流程图1000的方法在步骤1002处开始。在步骤1002,在第二数据 库服务器处从第一数据库服务器接收经复制的会话状态。例如,如图3所示,远程复制会话 状态处理程序308可以从第一数据库服务器接收经复制的会话状态322。如图3所示,经复 制的会话状态322包括经复制的事务日志326。在图1的示例中,第二数据库服务器104b 可以在接收自第一数据库服务器l〇4a的经复制的会话状态中接收经复制的事务日志110。 如上所述,经复制的事务日志110是存储与客户端102和数据库服务器104a之间的打开事 务有关的信息的事务日志108的副本。
[0111] 在步骤1004,在第二数据库服务器处从客户端接收与客户端建立会话的请求。在 客户端102与数据库服务器104a之间的会话中检测到失败时,客户端102可以尝试通过传 送请求来重建会话。数据库服务器104b可以间接地从客户端102接收请求,诸如通过选择 活跃数据库服务器来对针对特定域或服务器群集的数据库请求作出响应的网络网关设备。 替换地,数据库服务器l〇4b可以直接地从客户端102接收请求。例如,客户端102可以包括 相关联的数据库服务器(例如,处理针对一个或多个公共数据库的请求的数据库服务器) 列表以及这些数据库服务器中的每一个的地址(例如,IP地址等等)。客户端102可以首 先尝试与数据库服务器l〇4a重建会话,并且在数据库服务器104a没有响应的情况下可以 试图通过与列表中的一不同数据库服务器直接通信来与该数据库服务器重建会话。在当前 示例中,重建会话的请求由作为替换数据库服务器的数据库服务器104b来接收。
[0112] 在步骤1006,确定包括在请求中的会话标识符与包括在经复制的会话状态中的会 话标识符相匹配。例如,如上所述,会话管理器302 (图3)的会话ID比较器702可以将请 求中接收到的会话标识符与经复制的会话状态中的会话标识符作比较。
[0113] 在步骤1008,在第二数据库服务器处与客户端建立第二会话。在步骤1006如果会 话标识符匹配,则会话ID比较器702指示匹配,并且会话管理器302可以使得会话能够被 重建并且可以存储如此的指示。如果收到会话标识符与所存储的会话状态中的会话标识符 不匹配,则会话ID比较器702指示未找到匹配。在这种情况下,会话管理器302可能无法 使得会话被重建。
[0114] 在步骤1010,在第二数据库服务器处从客户端接收与第二会话相关联的进一步命 令。客户端102可以向数据库服务器104b传送先前传送给数据库服务器104a的可能由于 会话失败而未被接收和/或执行的命令所传送的命令(例如,命令标识符和事务标识符) 可以在通信信道l〇6b上传送并且可以由数据库服务器104b接收。
[0115] 此时,操作可以按以上参考图4B中所示的流程图400针对第一数据库服务器104a 描述的类似方式在第二数据库服务器l〇4b处继续(使用经复制的事务日志110)(从图10 的步骤1010前进至图4B的步骤414以执行步骤414-432)。换言之,可以确定步骤1010中 接收到的进一步命令是否具有已经存储在经复制的事务日志110中的标识符(步骤414)。 如果是,则可以确定进一步命令是否被执行(步骤416),并且要么可以执行进一步命令(步 骤418)且向经复制的事务日志110注释(步骤420),要么可以不执行进一步命令(步骤 422)。如果命令标识符尚未存储在经复制的事务日志110中,则进一步命令可以被执行(步 骤418)并且可以向经复制的事务日志110注释(步骤420)。可以处理在第二数据库服务 器104b处接收到的进一步命令(步骤424-428),并且可以在第二数据库服务器104b处提 交事务(步骤430-432)。以此方式,第二数据库服务器104b继续并且提交在数据库服务器 104a处打开的事务,而无需必须多次执行任何命令。
[0116] 以此方式,事务日志的复制用于在不同于最初与客户端建立会话的数据库服务器 处继续事务。在图3的实施例中,每一数据库服务器可以包括用于存储会话状态的副本的 对应储存库(例如,状态数据储存库318)-一会话状态的副本要么是在第一数据库服务器 (例如,图1的数据库服务器104a)处的原始副本(会话状态320,包含事务日志324),要么 是在附加数据库服务器(例如,图1的数据库服务器l〇4b)处的经复制的副本(经复制的 会话状态322,包含经复制的事务日志326)。注意,可以使用其他办法来实现这一目标。
[0117] 例如,图11是利用共享存储器方案实现该目的的示例系统1100的框图。系统1100 包括客户端102、第一数据库服务器104a、第二数据库服务器104b、第一会话管理器114a、 第二会话管理器114b、第一事务日志管理器116a以及第二事务日志管理器116b,并且以与 图1的系统100基本类似的方式来操作。然而,在系统1100中,代替使用复制来确保第二 事务日志管理器116b可访问第一事务日志管理器116a所生成的事务日志的单独副本,可 以使用共享状态数据储存库1102。根据这一方案,第一事务日志管理器116a和第二事务 日志管理器116b两者都能够访问存储在共享状态数据储存库1102中处于用于会话的公共 会话状态1104的同一事务日志1106。因此,第一数据库服务器104a存储在共享数据储存 库1102中的会话状态和事务信息随后可由第二数据库服务器104b访问(例如,以恢复和/ 或继续数据库服务器104a与客户端102之间的失败会话)。同样,第二数据库服务器104b 存储在共享数据储存库1102中的会话状态和事务信息随后可由第一数据库服务器104a访 问。
[0118] 图12是利用消息收发方案实现同一目标的示例系统1200的框图。系统1200包 括客户端102、第一数据库服务器104a、第二数据库服务器104b、第一会话管理器114a、第 二会话管理器114b、第一事务日志管理器116a以及第二事务日志管理器116b,并且以与图 1的系统100基本类似的方式来操作。然而,在系统1200中,代替使用复制或共享储存库, 而使用消息收发方案。根据这一方案,第一会话管理器114a被配置成将会话状态1206 (例 如,会话ID、命令ID,检索到的数据、和/或进一步的数据)存储在状态数据储存库1202中, 并且第一事务日志管理器116a将事务日志1208存储在会话状态1206中。在第二事务日 志管理器116b确定它将需要访问事务日志1208(例如,以恢复和/或继续数据库服务器 104a与客户端102之间打开的事务)时,第二事务日志管理器116b可以向可访问状态数据 储存库1202的实体1204传送消息,并且实体1204将对应数据发送给第二事务日志管理器 116b〇
[0119] IV.示例性的基于处理器的系统实现
[0120] 客户端102、数据库服务器104a、数据库服务器104b、命令生成器112、会话管理 器114a、会话管理器114b、事务日志管理器116a、事务日志管理器116b、客户端200、应用 202、数据库驱动程序204、API212、会话ID生成器328、事务ID生成器330、命令ID生成 器218、解析器220、协议层222、数据库服务器300、会话管理器302、引擎304、事务日志管 理器306、远程复制会话状态处理程序308、解析器310、协议层312、会话ID比较器702、事 务ID比较器704、命令ID比较器706、实体1204、流程图400、流程图500、流程图600、步骤 902、以及流程图1000可以以硬件或硬件以及软件和/或固件的任何组合来实现。例如,客 户端102、数据库服务器104a、数据库服务器104b、命令生成器112、会话管理器114a、会话 管理器114b、事务日志管理器116a、事务日志管理器116b、客户端200、应用202、数据库驱 动程序204、API212、会话ID生成器328、事务ID生成器330、命令ID生成器218、解析器 220、协议层222、数据库服务器300、会话管理器302、引擎304、事务日志管理器306、远程复 制会话状态处理程序308、解析器310、协议层312、会话ID比较器702、事务ID比较器704、 命令ID比较器706、实体1204、流程图400、流程图500、流程图600、步骤902、和/或流程 图1000可以实现为被配置成在一个或多个处理器中执行且存储在计算机可读存储介质中 的计算机程序代码。替换地,客户端102、数据库服务器104a、数据库服务器104b、命令生成 器112、会话管理器114a、会话管理器114b、事务日志管理器116a、事务日志管理器116b、客 户端200、应用202、数据库驱动程序204、API212、会话ID生成器328、事务ID生成器330、 命令ID生成器218、解析器220、协议层222、数据库服务器300、会话管理器302、引擎304、 事务日志管理器306、远程复制会话状态处理程序308、解析器310、协议层312、会话ID比 较器702、事务ID比较器704、命令ID比较器706、实体1204、流程图400、流程图500、流程 图600、步骤902、和/或流程图1000可以实现为硬件逻辑/电子电路。
[0121] 例如,在一实施例中,客户端102、数据库服务器104a、数据库服务器104b、命令生 成器112、会话管理器114a、会话管理器114b、事务日志管理器116a、事务日志管理器116b、 客户端200、应用202、数据库驱动程序204、API212、会话ID生成器328、事务ID生成器 330、命令ID生成器218、解析器220、协议层222、数据库服务器300、会话管理器302、引擎 304、事务日志管理器306、远程复制会话状态处理程序308、解析器310、协议层312、会话ID 比较器702、事务ID比较器704、命令ID比较器706、实体1204、流程图400、流程图500、流 程图600、步骤902、和/或流程图1000中的一个或多个可以一起实现在片上系统(SoC)中。 SoC可包括集成电路芯片,该集成电路芯片包括以下一个或多个:处理器(如微控制器、微 处理器、数字信号处理器(DSP)等等)、存储器、一个或多个通信接口、和/或用于执行其功 能的更多的电路和/或嵌入的固件。
[0122] 图13描绘了可以被用来实现本文描述的各实施例的示例性的基于处理器的计算 机系统1300。例如,系统1300可以用于实现客户端102、数据库服务器104a、数据库服务器 104b、客户端200、和/或数据库服务器300及其各个子组件。对此处所提供的系统1300的 描述只是为了说明,并非旨在进行限制。实施例也可以在相关领域的技术人员所知的更多 类型的计算机系统中实现。
[0123] 如图13所示,系统1300包括处理单元1302、系统存储器1304,以及将包括系统存 储器1304的各种系统组件耦合到处理单元1302的总线1306。处理单元1302可包括一个或 多个处理器或处理核心。总线1306表示若干类型的总线结构中的任何总线结构类型的一 个或多个,包括存储器总线或存储器控制器、外围总线、加速图形端口,以及使用各种总线 体系结构中的任何一种的处理器或局部总线。系统存储器1304包括只读存储器(ROM) 1308 和随机存取存储器(RAM) 1310。基本输入/输出系统1312 (BIOS)储存在ROM1308中。
[0124] 系统1300还具有一个或多个以下驱动器:用于读写硬盘的硬盘驱动器1314、用于 读或写可移动磁盘1318的磁盘驱动器1316、以及用于读或写诸如⑶R0M、DVDR0M、蓝光? 盘或其他光介质之类的可移动光盘1322的光盘驱动器1320。硬盘驱动器1314、磁盘驱动 器1316,以及光驱动器1320分别通过硬盘驱动器接口 1324、磁盘驱动器接口 1326,以及光 盘驱动器接口 1328连接到总线1306。驱动器以及它们相关联的计算机可读介质为计算机 提供了针对计算机可读指令、数据结构、程序模块,及其他数据的非易失存储器。虽然描述 了硬盘、可移动磁盘和可移动光盘,但是,也可以使用诸如闪存卡、数字视频盘、随机存取存 储器(RAM)、只读存储器(ROM)等等之类的其他类型的计算机可读介质来存储数据。
[0125] 数个程序模块可被储存在硬盘、磁盘、光盘、ROM或RAM上。这些程序模块包括操 作系统1330、一个或多个应用程序1332、其他程序模块1334以及程序数据1336。根据各个 实施例,程序模块可以包括可由处理单元1302执行以实现以下各项的任何或全部功能和 特征的计算机程序逻辑(例如,计算机代码或指令):客户端102、数据库服务器104a、数据 库服务器104b、命令生成器112、会话管理器114a、会话管理器114b、事务日志管理器116a、 事务日志管理器116b、客户端200、应用202、数据库驱动程序204、API212、会话ID生成器 328、事务ID生成器330、命令ID生成器218、解析器220、协议层222、数据库服务器300、会 话管理器302、引擎304、事务日志管理器306、远程复制会话状态处理程序308、解析器310、 协议层312、会话ID比较器702、事务ID比较器704、命令ID比较器706、实体1204、流程图 400、流程图500、流程图600、步骤902、和/或流程图1000。
[0126] 用户可以通过诸如键盘1338和指点设备1340之类的输入设备向系统1300中输 入命令和?目息。
[0127] 其它输入设备(未示出)可包括话筒、控制杆、游戏手柄、游戏控制器、扫描仪、触 摸屏和/或触摸平板、用于接收语音输入的语音识别系统、用于接收手势输入的手势识别 系统、诸如此类。
[0128] 在一个实施例中,结合显示器1344提供触摸屏以允许用户通过向触摸屏上的一 个或多个点施加触摸(例如通过手指或指示笔)来提供用户输入。这些及其他输入设备常 常通过耦合到总线1306的串行端口接口 1342连接到处理单元1302,但是,也可以通过其他 接口,诸如并行端口、游戏端口、通用串行总线(USB)端口,来进行连接。
[0129] 显示器1344还通过诸如视频适配器1346之类的接口连接到总线1306。除了显示 器1344之外,系统1300还可包括其他外围输出设备(未示出),如扬声器和打印机。
[0130] 系统1300通过网络适配器或接口 1350、调制解调器1352或其它用于在网络上建 立通信的适当手段连接到网络1348 (例如,局域网或诸如因特网之类的广域网)。调制解调 器1352(可以是内置的或外置的)通过串行端口接口 1342连接到总线1306。
[0131] 如此处所用的,术语"计算机程序介质"以及"计算机可读介质"用于泛指物理介 质,诸如用于实现系统存储器1304的ROM1308和RAM1310、与硬盘驱动器1314相关联的 硬盘、可移动磁盘1318、可移动光盘1322,以及其他介质,诸如闪存卡、数字视频盘等。
[0132] 如上文所指示的,计算机程序和模块(包括应用程序1332及其他程序模块1334) 可被储存在ROM1308、RAM1310、与硬盘驱动器1314相关联的硬盘、可移动磁盘1318或可 移动光盘1322上。这样的计算机程序也可以通过网络接口 1350或串行端口接口 1342来 接收。这些计算机程序在由处理单元1302执行时使得系统1300能够实现此处所讨论的实 施例的特征。相应地,这样的计算机程序表示系统1300的控制器。
[0133] 如此处所用的,术语"计算机程序介质"、"计算机可读介质"以及"计算机可读存 储介质"被用于泛指介质,诸如与硬盘驱动器1314相关联的硬盘、可移动磁盘1318、可移 动光盘1322,以及其他介质,诸如闪存卡、数字视频盘、随机读取存储器(RAM)、只读存储器 (ROM)等。这些计算机可读存储介质与通信介质相区别且不重叠(不包括通信介质)。通 信介质通常在诸如载波等已调制数据信号中承载计算机可读指令、数据结构、程序模块或 者其它数据。术语"已调制数据信号"是指使得以在信号中编码信息的方式来设置或改变 其一个或多个特性的信号。作为示例而非限制,通信介质包括无线介质,如声学、RF、红外和 其它无线介质。各个实施例也针对这些通信介质。
[0134] 如上文所指示的,计算机程序和模块(包括应用程序1332及其他程序模块1334) 可被储存在硬盘、磁盘、光盘、ROM或RAM上。这样的计算机程序也可以通过网络接口 1350、 串行端口接口 1342或任何其他接口类型来接收。这样的计算机程序,当由应用执行或加载 时,使得系统1300能实现此处所讨论的本发明的实施例的特征。因此,这样的计算机程序 表示系统1300的控制器。
[0135] 实施例还涉及包括存储在任何计算机可用介质上的软件的计算机程序产品。这 样的软件,当在一个或多个数据处理设备中执行时,使数据处理设备如此处所描述的那样 操作。本发明的各实施例使用现在已知的或将来已知的任何计算机可使用或计算机可读 介质。计算机可读介质的示例包括,但不仅限于,诸如RAM、硬盘驱动器、软盘、CDROM、DVD ROM、zip磁盘、磁带、磁存储设备、光存储设备、MEM(存储器)、基于纳米技术的存储设备等 等之类的存储设备。
[0136] V.结论
[0137] 虽然以上描述了不同的实施例,但应当理解的是它们只是作为示例而非限制。对 于相关领域的技术人员显而易见的是,可以对其做出各种改变而不背离本发明的精神和范 围。因此,此处所公开的本发明的宽度和范围不应被上述所公开的示例性实施例所限制,而 应当仅根据所附权利要求书及其等同替换来定义。
【权利要求】
1. 一种数据库服务器中的方法,包括: 与客户端建立第一会话以处理所述客户端的数据库查询; 打开所述第一会话的事务以执行与所述客户端的所述事务相关联的多个命令; 从所述客户端接收与所述事务相关联的至少一个命令,每一收到命令与相关联的命令 标识符一起被接收; 生成事务日志,所述事务日志存储与每一收到命令相关联的所述命令标识符并且指示 每一收到命令是否已被成功执行; 在所述第一会话中的失败之后,从所述客户端接收重建所述第一会话的请求、与所述 事务相关联的进一步命令以及所述进一步命令的命令标识符; 与所述客户端重建所述第一会话; 确定所述进一步命令的命令标识符是否已被存储在所述事务日志中;以及 如果确定与所述进一步命令相关联的所述命令标识符未被存储在所述事务日志中, 尝试执行所述进一步命令,以及 用与所述进一步命令相关联的所述命令标识符以及关于所述进一步命令是否已被成 功执行的指示来注释所述事务日志。
2. 如权利要求1所述的方法,其特征在于,进一步包括: 从所述客户端接收所述事务的提交命令;以及 提交所述事务。
3. 如权利要求1所述的方法,其特征在于,如果确定在接收到所述进一步命令之际与 接收到的所述进一步命令相关联的所述命令标识符已被存储在所述事务日志中,则执行以 下步骤: 根据所述事务日志确定具有所述命令标识符的先前接收到的命令已被成功执行,所述 命令标识符被确定为已存储在所述事务日志中;以及 避免重新执行先前接收到的命令。
4. 如权利要求1所述的方法,其特征在于,进一步包括: 经历由于在所述第一会话期间所述客户端与所述数据库服务器之间的连接中的失败 引起的或所述数据库服务器中的失败引起的所述第一会话中的失败。
5. 如权利要求1所述的方法,其特征在于,所述与客户端建立第一会话包括: 将所述第一会话的会话标识符存储在会话状态中; 所述生成事务日志包括: 将所述事务日志存储在所述会话状态中;以及 所述与所述客户端重建所述第一会话包括: 在传送给所述数据库服务器的通信中从所述客户端接收所述会话标识符以重建所述 第一会话,以及 确定在所述通信中接收到的所述会话标识符与存储在所述会话状态中所述会话标识 符相匹配。
6. 如权利要求5所述的方法,其特征在于,进一步包括: 将所述会话状态复制到至少一个附加数据库服务器,经复制的会话状态使得所述至少 一个附加数据库服务器能够在所述第一会话失败的情况下继续所述事务。
7. 如权利要求1所述的方法,其特征在于,进一步包括: 在未从所述客户端接收到请求重建所述第一会话的通信的情况下,在所述第一会话失 败之后在预定时间量期满后删除所述事务日志。
8. 一种系统,包括: 第一数据库服务器,包括: 会话管理器,所述会话管理器与客户端建立第一会话以处理所述客户端的数据库查 询,打开所述第一会话的事务以执行与所述客户端的所述事务相关联的多个命令,并且从 所述客户端接收与所述事务相关联的至少一个命令,每一收到命令与相关联的命令标识符 一起被接收;以及 事务日志管理器,所述事务日志管理器生成存储与每一收到命令相关联的所述命令标 识符并且指示每一收到命令是否已被成功执行的事务日志; 在所述第一会话中的失败之后,所述会话管理器从所述客户端接收重建所述第一会话 的请求、与所述事务相关联的进一步命令以及所述进一步命令的命令标识符; 所述会话管理器与所述客户端重建所述第一会话,并且确定所述进一步命令的命令标 识符是否已被存储在所述事务日志中;以及 如果所述会话管理器确定与所述进一步命令相关联的所述命令标识符未被存储在所 述事务日志中,则所述进一步命令尝试被执行,并且所述事务日志管理器用与所述进一步 命令相关联的所述命令标识符以及关于所述进一步命令是否已被成功执行的指示来注释 所述事务日志。
9. 如权利要求8所述的系统,其特征在于,在接收到所述进一步命令之际,如果所述会 话管理器确定与接收到的所述进一步命令相关联的命令标识符已被存储在所述事务日志 中,并且如果所述会话管理器根据所述事务日志确定具有所述命令标识符的接收到的所述 进一步命令已被成功执行,所述命令标识符被确定为已存储在所述事务日志中,则接收到 的所述进一步命令不被重新执行。
10. -种计算机程序产品,包括其上记录有计算机程序逻辑的计算机可读介质,所述计 算机程序逻辑包括: 用于使得处理器能够执行权利要求1-7中任一项的计算机程序逻辑装置。
【文档编号】G06F17/30GK104508663SQ201380040029
【公开日】2015年4月8日 申请日期:2013年7月26日 优先权日:2012年7月27日
【发明者】M·A·内林克斯, L·F·F·多斯 桑托斯, O·伊格那特, D·B·洛美特, Q·布拉德利, R·拉姆, C·J·马弗德, P·吉沃德加克, B·姆更丹 申请人:微软公司