首页> 中国专利> 通过网络以事务形式办理文件操作的方法与系统

通过网络以事务形式办理文件操作的方法与系统

摘要

一种通过网络执行以事务形式办理的远程文件操作的系统包括客户机和服务器。该客户机与服务器的每一个包含事务管理器(TM)和文件系统(FS)。该客户机还包括重定向器(RDR),而该服务器包括服务器应用程序(SRV)。RDR接收对远程事务文件操作的请求。作为响应,该RDR从该请求中检索事务。该RDR可使用TM来封送该事务,以向服务器发送。该RDR通过网络向服务器发送该事务。SRV组件接收该事务,服务器的TM和FS随即使用该事务来执行文件操作。随后,服务器通过网络向客户机返回该文件操作的结果。

著录项

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2015-05-20

    专利权的转移 IPC(主分类):G06F15/00 变更前: 变更后: 登记生效日:20150506 申请日:20040722

    专利申请权、专利权的转移

  • 2009-03-04

    授权

    授权

  • 2006-12-20

    实质审查的生效

    实质审查的生效

  • 2006-08-30

    公开

    公开

说明书

技术领域

以下所述的各种实施例一般涉及网络通信,尤其但非排他地涉及启用通过网络的以事务形式办理的文件操作方法与系统。

发明背景

一直以来,事务都由数据库和事务处理系统所提供。通过将许多操作组合在一起成为单个原子操作,即,其每个单独操作的结果共同成败的一组操作,事务提供了一种应用程序编程人员需要的简化的失败模型。如果只有一个操作失败,无论有多少个操作与此事务相关联,该组中的所有操作的效果就被“撤销”或回退。对于任意数量的失败,都提供了操作之中的该一致性,且最终各个事务处理系统到达两个状态之一,其中,要么应用所有的操作,要么不应用任何操作。

发明概述

依照各个所描述的实施例的各方面,提供了一种在一个网络上以事务形式办理文件操作的方法与系统。在一方面,一计算平台(即,客户机)可以通过网络远程地访问另一计算平台(即,服务器)上的文件。在这一方面,该客户机和服务器的每一个包含一事务管理器(TM)和一文件系统(FS)。客户机还包含一重定向器(RDR),而服务器包含一服务器组件(SRV)。

在操作中,重定向器(RDR)接收到对远程以事务形式办理的文件操作的请求。响应于此请求,RDR从请求中查寻此事务,并将此事务封送(marshal)以向服务器传送(例如,在一实现中由TM处理)。然后,RDR将事务信息(例如,在一实现中为封送二进制大对象(blob))通过网络发送到服务器。SRV接收该事务信息,然后其TM和FS用此信息进行文件操作。随即,服务器通过网络将文件处理结果返回给客户机。

另一方面,RDR允许对一个文件打开一个以上远程文件操作事务。当RDR接收到对以事务形式办理的远程文件操作的新请求,则RDR判定在此客户机上是否此远程文件的“脏”版本(即,已被写过的版本)已知。RDR随即使用该脏版本,而非文件的原始版本,用于新请求。在某些实施例中,对于一个给定的文件,RDR一次只允许打开单个以事务形式办理的写操作。

在又一个方面,RDR判定对以事务形式办理的远程文件操作的新请求是否可以使用在此客户机上已知的文件信息。如果可以使用相同的文件信息,则RDR就使用该同一文件信息,而非存储文件信息的另一副本。

在再一方面,RDR可以把机会锁与给定远程文件的事务相关联。在一个实施例中,该锁并不禁止本地服务器访问此文件,但会引发此服务器向客户机发送锁已被破坏的消息。RDR随即可检查对于给定的文件锁是否已被破坏,进而确定对以事务形式办理的远程文件操作的新请求是否可以使用已在此客户机上高速缓存的文件信息。

附图的简要描述

参考附图描述了非限制、非穷举实施例,其中,若非另外指明,贯穿各个视图,同样的参考标号是指同样的部件。

图1所示是可以使用以事务形式办理的远程文件操作的系统的示例;

图2示出图1的系统的客户机和服务器的组件的示例;

图3和图3A示出图2的客户机与服务器之间以事务形式办理的远程文件操作的示例处理流程;

图4示出图2的客户机和服务器的多个远程文件访问的示例;

图5示出通过网络进行事务的两阶段提交的示例处理流程;

图6示出实现事务管理的组件的示例;

图7示出内核级事务的示例处理流程;

图8示出一个安全特征的示例;以及

图9示出一个通用的计算机环境,根据不同的实施例,此环境可用以实现本文描述的各种技术。

较佳实施例的详细描述

示例环境示例

如前所述,在数据库与事务处理系统中使用了事务,但在下述实施例中,事务被用于远程文件操作。图1示出了系统100,其中,客户机可通过网络101在客户机上以事务形式办理文件操作。在图1的示例网络环境中,多个客户机计算设备105、110、115和120——或亦可称之为客户机设备——通过网络101与至少一个服务器设备125耦合。网络101用以代表各种常规网络的拓扑结构和类型的任意一种,包括有线和/或无线网络。网络101还可使用常规网络协议之中的任意一种,包括公有和/或私有协议。例如,网络101可以包含因特网,以及至少一个或多个局域网(LAN)、广域网(WAN)的部分。

客户机设备105可包括各种常规计算设备中的任意一种,包括但不限于,台式个人电脑(PC)、工作站、大型计算机、因特网设备和游戏控制台。此外,与网络101相关联的客户机设备还可包括个人数字助理(PDA)110、膝上计算机115以及蜂窝电话120,等等,这些设备可经由有线和/或无线链路与网络101进行通信。另外,客户机设备105、110、115和120的一个或多个可以包括同类设备,或者可以包括不同类设备。

服务器设备125可以向计算设备105、110、115和120提供各种数据和/或功能的任一种。这些数据可以是公开可用的或者可选择地受限的,例如,仅限于某些用户,或仅当支付了适当的费用时才可用,等等。

服务器设备125是网络服务器和应用程序服务器的至少一个,或两者的组合。服务器设备125是作为内容来源的任何设备,而客户机设备105、110、115和120包括接收此类内容的任何设备。因而,在一个对等网络中,作为内容来源的设备即称作服务器设备,而接收内容的设备即称作客户机设备。依照本文描述的示例实施例,这两类设备都能够加载并运行软件程序,包括操作系统和应用程序。此外,数据与功能可以在客户机设备105、110、115和120之间共享。即,服务器设备125对各个客户机设备来说,并非仅有的数据和/或功能源。

在数据源130或135处,为服务器设备125或客户机设备105、110、115和120的任一个准备和/或提供了包括操作系统和应用程序的软件程序,以供其执行。为保持一致性起见,如本领域中所已知的,此后的讨论均称之为“应用程序”,应用程序单独或组合地至少包括软件程序、操作系统和应用程序中的任一个。此外,应用程序可以离线地从数据源130,或在线地从数据源135传播到服务器设备125。并且,应用程序通常在线地从服务器设备125或数据源135传播到客户机设备105、110、115和120。离线传播的装置和方法也是已知的。

依照下述的各种实施例,设备105、110、115、120和125中或在其之间的数据和功能的至少一个的传播可以被实现为事务。更具体地来说,事务是一组操作,它们在设备105、110、115、120和125之一内,或在诸如图1的示例等网络环境下,作为单个原子操作被同步或异步地执行。下面将结合图2-7,描述通过网络上以事务形式办理的远程文件操作的一个示例。

以事务形式办理的远程文件操作

图2示出了系统100的两个设备(例如,从设备105、110、115、120和125中选出)的组件,上述设备作为客户机202和服务器204运行,目的是以事务形式办理的的远程文件操作。在此实施例中,客户机202和服务器204均使用MicrosoftWindows操作系统的一个版本。在其它实施例中,可以使用不同的操作系统。

在此实施例中,客户机202包含应用程序212、输入/输出(I/O)管理器214、文件系统(FS)216、重定向器选择器218、事务管理器(TM)222以及重定向器(RDR)220。在此实施例中,服务器204包括服务器组件(SRV)234、I/O管理器214A、FS 216ATM 222A。在此实施例中,客户机202和服务器204可通过网络100(图1)相互通信。在某些实施例中,这些组件是用软件实现的。

在这个“Windows”实施例中,I/O管理器214和214A、FS 216和216A是由NT文件系统(NTFS)实现的,而重定向器选择器218是由多重UNC供应器(MUP)实现的,其中UNC是统一命名协定的缩写。因而,重定向器选择器218在此亦称为MUP 218。另外,MicrosoftWindows操作系统RDR和SRV(包含附加功能)分别实现了RDR 220和SRV 234。对于MicrosoftWindows操作系统的RDR和SRV的示例性添加将会在下面描述。此外,在此实施例中,TM 222和TM 222A是作为内核层事务管理器来实现的,接下来将做更详细的描述。其它实施例可以使用不同的I/O管理器、文件系统、重定向器选择器、TM和/或RDR。

图3示出客户机202和服务器204(见图2)之间以事务形式办理的远程文件操作的示例处理流程。参考图2和图3,根据一个实施例,以事务形式办理的远程文件操作如下执行。

在框302中,RDR 220接收对驻留在服务器204的文件进行以事务形式办理的文件操作的请求。典型的文件操作包括创建新文件、读文件、写文件、复制文件、重命名文件,等等。在此实施例中,对以事务形式办理的文件操作的请求是由应用程序212生成的,它是如图2所示的用户级应用程序。此请求使用包含事务上下文的字段的结构。I/O管理器214接收此请求,并判定此请求是针对本地文件还是远程文件。在此实施例中,I/O管理器214是MicrosoftWindows操作系统的一个标准组件。例如,应用程序212可以通过以UNC名称(以\\server\share\subdirectory\filename的形式)对I/O管理器214的调用来作出请求。I/O管理器214随即将此请求传递给MUP 218。对一个事务可以有多个句柄,而对一给定文件亦可有多个事务。另一方面,如果此请求是针对客户机上的一个文件,则I/O管理器214将以标准方式把请求传递给NTFS 216。

然后,MUP 218查找执行该请求所需的重定向器。在此例中,重定向器是RDR220。在这个实施例中,MUP 218是MicrosoftWindows操作系统的一个标准组件。在此实施例中,RDR 220是MicrosoftWindows操作系统RDR的一个版本,但具有附加功能,因此RDR可TM 222交互来执行事务。这些附加功能包括以下能力,例如,从请求中为以事务形式办理的文件操作检索事务上下文、为以事务形式办理的文件操作分配FCB、通过网络向远程设备发送事务、为以事务形式办理的文件操作接收回复(包括文件标识符和版本标识符)、在TM 222指示下执行事务操作、以及向TM 222登记为资源管理器,从而RDR 220可以获知事务的状态。在某些实施例中,RDR 220如在共同提交且共同转让的待决美国专利申请第09/539,233号中描述的来实现,此专利申请于2000年3月30日提交,名为“Transacted FileSystem(以事务形式办理的文件系统)”,申请号为[代理案卷号MS1-1781US]。登记为资源管理器将在下面描述。RDR 220包含用于缓冲事务的资源、高速缓存映射、文件控制块(FCB)、文件对象扩展(FOBX)以及处理事务和请求所需的其它结构。

在框304中,RDR 220从TM 222检索事务,并封送该事务以向客户机204发送。在一实施例中,RDR 220通过调用由TM 222对外设置的API(其实施例在下面进行描述)来检索事务,随后通过对事务信息进行格式化(例,封送二进制大对象)来封送该事务,以使用被扩展成支持事务的SMB协议的一个版本来发送。一个示例性实施例的SMB扩展将在下文结合表1-3进行总结。在框306,RDR 220向服务器204发送事务与请求,如箭头236所示。在框308,RDR 220从服务器204接收文件操作的结果。例如,服务器204发送对该请求的响应,此响应包含前述的文件和版本标识符。在此实施例中,SRV234是MicrosoftWindows操作系统SRV的一个版本,但具有附加功能,因此SRV可经网络与客户机交互,以使用SMB的扩展来执行事务,包括在以事务形式办理的远程文件操作过程中向客户机传送文件和版本标识符。

  扩展  描述  增加一个新命令:  NT_TRANSACT_CREATE2        增加一个新的能力位:  CAP_TXF    SMB FIND(寻找)请求  增加一个新的标志:  SMB_FIND_TRANSACTED_  OPERATION。FIND请求  (REQ_FIND_FIRST2)结构  在表4中定义,响应结构在表  5中定义。  扩展ECHO(回显)命令,  以发送事务状态改变的通知。  此请求/响应结构在表6和表7  中定义。  取一个已封送的事务,并通过网络发送两个  结构:  REQ_CREATE_WITH_EXTRA_OPTIONS  RESP_CREATE_WITH_EXTRA_OPTIONS。  这两个结构分别在表2和表3中定义,且是SMB  结构的扩展:  REQ_CREATE_WITH_SD_OR_EA和  RESP_EXTENDED_CREATE+WITH_SD_OR_EA  CAP_TXF由服务器设置或重置,来表示此服  务器是否支持事务。CAP_TXF是SMB协商响应  的一部分。在此实施例中,CAP_TXF被定义为  0x20000,以表示此服务器支持事务。  SMB_FIND_TRANSACTED_OPERATION  表事务正在使用中。之所以使用这个标志,是因  为在此实施例中,寻找操作是基于路径而非基于  句柄的。在此实施例中,这个标志被定义为0x20。  如果这个标志被置位,则在FIND和ECHO命令  的最后发送事务信息。   扩展SMBECHO命令是提供从服务器到客户  机的事务操作的预准备、准备、提交、回退状态  的通知。

表1

REQ_CREATE_WITH_EXTRA_OPTIONS

  字段  内容描述  _ULONG(Flags)  创建标志NT_CREATE_xxx
  字段  内容描述  _ULONG(RootDirectoryFid)  ACCESS_MASK DesiredAccess  LARGE_INTEGER AllocationSize  _ULONG(FileAttributes)  _ULONG(ShareAccess)  _ULONG(CreateDisposition)  _ULONG(CreateOptions)  _ULONG(SecurityDescriptorLength)  _ULONG(EaLength)  _ULONG(NameLength)  _ULONG(ImpersonationLevel)  _UCHAR SecurityFlags  _ULONG(TransactionLength)  _ULONG(EfsStreamLength)   UCHAR Buffer[1]  UCHAR Name[]  相对打开的可任选目录  预期的访问(NT格式)  初始分配大小,以字节计  文件属性  共享访问  文件存在或不存在所采取的行动  创建新文件的选项  SD的长度,以字节计  扩展属性(EA)的长度,以字节计  名称的长度,以字符计  安全服务质量(QOS)信息  安全QOS信息  已封送事务上下文的长度,以字节计  已加密文件系统($EFS)流的长度,以  字节计  文件名的缓冲区,在数据缓冲区中与  DWORD(4字节)的边界对齐  文件名(非以NUL结尾)

表2

RESP_CREATE_WITH_EXTRA_OPTIONS

  字段  内容描述  UCHAR OplockLevel  UCHAR ExtendedResponse  _USHRT(Fid)  _ULONG(CreateAction)  _ULONG(EaErrorOffset)  TIME CreationTime  授予的机会锁级别  对于扩展响应设为1  文件ID  所采取的行动  EA错误的偏移量  文件创建的时间
  字段  内容描述  TIME LastAccessTime  TIME LastWriteTime  TIME ChangeTime  _ULONG(FileAttributes)  LARGE_INTEGER AllocationSize  LARGE_INTEGER EndOfFile  _USHORT(FileType)  _USHORT(DeviceState)  BOOLEAN Directory  UCHAR VolumeGuid[16]  UCHAR FieldId[8]  _ULONG(MaximalAccessRights)  _ULONG(GuestMaximalAccessRights)  LARGE_INTEGER FilesystemFid;     _ULONG(VersionNum)  文件被访问的时间  文件最近一次被写入的时间  文件最近一次改变的时间  文件属性  所分配的字节数  文件偏移量的结尾  文件的文件类型  IPC设备(例,管道)的状态  若此结构是目录,则为TRUE  卷GUID(全局唯一ID)  文件ID  会话所有者的访问权限  客人最大的访问权限  服务器上的NTNTFS Fid,用以区分  有着同样路径名的不同文件。当使用事务  (TxF)时,同样的路径名可能指两个不  同的文件。  所打开文件的TxF版本号

表3

REQ_FIND_FIRST2

 字段  内容描述 _USHORT(SearchAttributes) _USHORT(SearchCount) _USHORT(Flags)  搜索属性  返回的最大条目数  附加信息:位设置为  0-此请求后停止搜索  1-到达终点则停止搜索  2-返回继续键
 字段  内容描述 _USHORT(InformationLevel) _ULONG(SearchStorageType) UCHAR Buffer[1]  信息级别  搜索储存类型  文件名

表4

RSP_FIND_FIRST2

 字段  内容描述 _USHORT(Sid) _USHORT(SearchCount) _USHORT(EndOfSearch) _USHORT(EaErrorOffset) _ULONG(SearchStorageType) _USHORT(LastNameOffset)  搜索句柄  返回条目数量  上一条目已返回否?  若有EA错误,则为EA列表的偏移量  搜索储存类型  如果服务器需要继续搜索,则为对上一  条目的文件名的数据偏移量;否则为0

表5

REQ_ECHO

字段  内容描述UCHAR WordCount_USHORT(SearchCount)_USHORT(EndOfSearch)_USHORT(EaErrorOffset)_USHORT(LastNameOffset)  参数词计数=1  返回的条目数量  上一条目已返回否?  若有EA错误,则为EA列表的偏移量 如果服务器需要继续搜索,则为对上一  条目文件名的数据的偏移量;否则为0

表6

RSP_ECHO

 字段  内容描述 UCHAR WordCount _USHORT(SequenceNumber) _USHORT(ByteCount) UCHAR Buffer[1]  参数词计数=1  此回显的序列号  数据字节计数;最小=4  回显的数据

                              表7

图3A根据一个实施例,更为详细地描述了框302(见图3)。在框312中,RDR 220为所请求的文件操作检索事务上下文。在打开以事务形式办理的的远程文件时,RDR 220判定事务是否已与此请求相关联。例如,在一个实施例中,是通过把事务附加到线程的方式来将其与请求相关联,但在其它实施例中,可以使用不同的方法来将事务与请求相关联。在一个实施例中,RDR 220通过检查此请求是否有与其相关联的事务句柄来执行这个操作。若有,则该请求被加入到已经存在的事务中。若无,RDR 220非事务请求的标准方式处理此请求。

RDR 220随即对此请求分配一FCB。如前所述,具有多个请求的多个事务可打开一给定文件。因而在框302(见图3)的一个实施例中,执行框314的操作,RDR 220可判定对是否有现存的FCB可用于该请求。在此实施例中,RDR 220检查请求的文件(即,路径名)及与作出请求的线程相关联的事务上下文是否与现存FCB的那些相匹配。例如,如果在同一事务中提出了两个对同一文件的写操作请求,则在处理第二个请求时,对于第一个请求应该已经存在FCB。因为两个操作都是写操作,同一个FCB可以同时被两者所使用。

如果在框314中,RDR 220判定存在具有同一事务上下文、同一文件(即,路径名)和同一版本的FCB,则在框316中,为该请求使用此现存FCB。在某些实现中,RDR 220会使用具有最新版本的FCB。例如,如果文件的读操作在尚未提交的同一文件的写操作之后,则RDR 220会使用当前由写操作所使用的文件的版本。这个方法考虑到对高速缓存的更高效率的利用。

然而,如果在框314中,无法为此请求使用现存的FCB,则在框318中,RDR为此请求创建一个新的FCB。在一个可选的实施例中,为每个请求创建一个新的FCB。

图4示出对于同一文件的多个尚未提交的事务请求的示例。如图4所示,操作401相对应于对文件的读操作的请求,。即,此文件操作是“读打开”。操作401有句柄H1和事务T1与其相关联。RDR 220(图2)所请求的文件版本记为版本A。假设对此文件,这是首个尚未提交的事务,则从服务器204(图2)中检索版本A,并将其缓存在客户机202中(见图2)。

之后,对于同一文件请求操作402。在此例中,操作402也是读操作,它具有句柄H2和事务T2。因为该事务与操作401的事务不同,因此RDR 220从服务器204再次检索该文件的版本A。

在此例中,然后在与操作402相同的事务中,对同一文件请求操作403。因此,操作403有句柄H3,且被加入到事务T2中。然而,此例中的操作403是写操作,因而RDR 220在本地记住(例,高速缓存)该文件的版本B。版本B有时被称为“脏版本”。

接下来,在与操作402和403的相同事务中,对于同一文件请求操作404。因而,操作404有句柄H4,且被加入到事务T2中。在此例中,操作404是读操作。在此实施例中,作为框314(见图3A)的结果,RDR 220会为操作404记住并可能高速缓存版本B。

在一个不同的事务中,对于同一文件请求操作405。因而,操作405有句柄H5,且被与一新事务T3相关联。因为该事务与先前的操作所属事务均不同,在一个实施例中,RDR 220再次从服务器204检索此文件的版本A。在另一实施例中,RDR 220无需向服务器204(图2)查询即可认识到版本A仍是当前版本,随即使用此“本地”版本A。例如,此可选的实施例可以使用机会锁,从而可以得知驻留在服务器204上的文件的任何更新的版本。即,RDR 220可以将一机会锁与该文件相关联,此锁并不禁止对服务器204上的文件的写操作,但引发服务器204发信号通知RDR 220该锁已被破坏。在这样的情况下,RDR 220从而得知版本A不再是当前版本。在又一实施例中,RDR 220可以向服务器204查询,以判定该文件的当前版本,然后重用与当前版本相关联的现存FCB。

接下来,在操作406中,提交事务T2。这具有改变服务器204上的版本的效果。在服务器204上存储的该新版本被记为版本C。如前所述,由于RDR 220在所有远程事务期间登记为资源管理器,因此RDR 220知道服务器204具有该文件的新版本。

接下来,在与操作401相同的事务中,对同一文件请求操作407。于是,操作407有句柄H6,且被加入到事务T1。然而,因为RDR 220知道服务器204上该文件的版本C,因此RDR 220为此操作记住并可能高速缓存版本C。在某些实施例中,RDR 220从服务器204检索版本C。

类似地,当由与操作405相同的事务对同一文件请求操作408时,操作408有句柄H7,且被加入到事务T3中。因为RDR 220知道服务器204上该文件的版本C,因此RDR 220也为该操作记住并可能高速缓存版本C。

图5示出依据一个实施例,如何将缓存在客户机202(见图2)的数据转储清除到(即,持久地保存)服务器204(图2)。参考图2和5,依据一个实施例,客户机202如下所述地地将数据转储清除到服务器204。

在框502中,生成数据的应用程序作出调用或者发出请求以提交事务。该调用或请求被传递给TM 222。作为响应,TM 222生成一个预准备通知(将在下面结合示例事务管理器进行描述)。

在此实现中,RDR 220从TM 222接收到预准备通知,如框504所示。作为响应,RDR 220通过网络将数据转储清除到SRV 234。SRV 234进而将数据传递给NTFS 216A。这些操作由框506表示。在某些实施例中,服务器204的TM 222A发信号通知RDR 220预准备操作何时完成。框504和506帮助确定在执行准备操作(将在下面结合示例事务管理器进行描述)前,要从客户机202写到服务器204的数据已在服务器204上存在。

在框508中,RDR 220从TM 222接收到准备通知(将在下面结合示例事务管理器进行描述)。在一个实施例中,响应于准备通知,RDR 220向服务器204发送准备通知的消息,此消息被传递给TM 222A。TM 222A进而将该准备通知传递给NTFS 216A。这些操作由框510和512表示。该准备通知使得客户机202和服务器204以如下方式存储数据,即允许数据被提交或被回退。在某些实施例中,服务器204的TM 222A发信号通知RDR 220准备操作何时完成。随即使用标准的两阶段提交操作(例,使事务被提交或中止的操作)来处理数据,如框514所示。

尽管在上文中,事务管理被描述成使用单独的TM组件(即,TM 222和222A)来执行,然而在其它实施例中,事务管理的基础结构可被集成到文件系统的基础结构中。且在上述的集成实施例中,事务消息(例,预准备、准备、提交、中止等等,如下所述)在传输信道上随文件消息一同流动。

示例事务管理器

图6示出依照一个实施例在执行事务时所用的组件。组成特定事务的一组操作共有一些至少为本领域技术人员所知的属性,这些特性缩写为“ACID”,包括有“原子性”、“一致性”、“隔离性”以及“持久性”。更具体地:从事务中相应操作所得的数据更新要么都是永久性的,要么无一是永久性的(原子性);事务使底层数据处于一致的状态(一致性);事务更新的效果对其它并发运行的操作不可见,直到整个事务变为永久(隔离性);以及,当事务的输出已被确定的情况下,结果可确保不再改变(持久性)。

图6的内核级事务管理示例针对分布式事务的例子,此分布式事务牵涉一个以上设备,且需维持事务所期望的“ACID”特征。此外,尽管图6的示例参考了内核对象,然而此例绝非仅限于由内核对象所实现的事务。更具体地,此处所描述的事务可由内核对象之外的其它对象所实现,或者可由不同种类的事务管理器实现。

在图6中,对应于客户机应用程序600的事务至少使用在第一设备上的事务管理器605,以及第二设备上的客户机应用程序600B和事务管理器635。客户机应用程序600B与客户机应用程序600相关联。相互通信的事务管理器605和635可以是内核对象的集合,这些内核对象维护关于所有事务和资源的状态信息,此外还协调客户机应用程序与相关联的资源管理器(RM)之间的交互或协议。

图6的示例中的资源管理器,包括RM 625和RM 630,维护能够以稳定状态存储数据的至少一个底层资源的状态。这类资源的非排他示例包括数据库和消息队列。在图6的示例实施例中的第一设备中,RM 625对应于资源627;RM 630对应于资源632;在第二设备中,RM 655对应于资源657。

如图6所示,第一设备上的事务管理器605包括以下内核对象:事务对象(TX)610,资源管理器对象(RMO)615以及登记对象(EN)620;第二设备上的事务管理器635包括以下内核对象:TX 640,RMO 645以及EN 650。TX代表特定的事务,并可由参与此事务的操作打开。

RMO代表参与特定事务的资源。RMO对事务的参与包括接收两阶段提交消息。此外,RMO是持久的,因而对应的事务管理器知道哪个事务的输出结果可被发送到对应的RM。或者,RMO可以是暂时性的,从而使得客户机应用程序能够无需越过失败来管理持久性RMO,就可订阅事务通知流。

EN代表事务与资源管理器间的关系。资源管理器通过在其上创建登记来表示它将参与此事务。当RMO被请求对特定事务执行操作(例如准备、提交,等等),它使用EN来表示此参与。对特定事务,资源管理器可以有一个以上的登记对象(EN)。

参考图6和7的示例对于内核环境,如下描述了被实现来确保事务能成功地更新所有适当的文件的两截断提交协议。特别地,在客户机应用程序600打开与第一设备上的事务管理器605相对应的内核对象,而SRV 234(图2)打开与第二设备上的事务管理器635相对应的内核对象之后,“准备”阶段705就开始了,此时事务中的每一RM从对应的事务管理器发送(705)“准备”命令。当接到警报,RM通过使资源数据处于持久状态,使得各个资源中的数据能够被“提交”或者“回退”,来作好准备(710)。准备好之后,RM发送(715)一个确认消息给对应事务管理器的TX。

当解决事务时,即执行“提交”阶段720,由此,该事务管理器的TX向每个相关联的RM发送(725)“已提交”或“中止/回退”的事务结果。RM随即将此结果记录在相关联的日志中,并且底层数据则根据该事务结果被提交或被回退。替换实施例可允许易失性的登记,即对其事务的数据不是持久性的,因而这些数据也不被记入日志或恢复。

内核级的事务管理可通过使用应用程序接口(API)来实现,这些API适用的系统体系结构包括,但不限于,MicrosoftWin32应用编程接口和MicrosoftWindows操作系统。此处描述的API通过基于句柄的接口来展现,“句柄”指的是为API所设的对象。此外,除非明确地请求异步操作,否则相应内核对象——尤其是TX和RMO——的操作都是同步的。另外,对应于事务的不同实施例的操作可由此处描述的一个或多个API的各种组合来实现。亦即,某些实施例可以使用此文所描述的所有API,而其它实现可以使用其不同的组合。

下面将提供用来在TX内核对象上实现操作的API,以及API功能的对应描述(相关例程的更为详尽的描述将在之后进行):

·PreprepareEnlistment:亦称作“阶段0”处理,请求TX向所有相关联的RM发送预准备消息;

·PrepareEnlistment:请求TX向所有已登记的RM发送准备请求;

·CreateTransaction:打开新TX;

·OpenTransaction:打开已存在的TX;

·CommitTransaction:请求提交TX;

·RollbackTransaction:请求TX中止或回退该事务;

·SavepointTransaction:请求TX保存该事务状态;

·GetTransactionInfo:检索关于该TX的信息;以及

·SetTransactionInfo:设置关于该TX的信息。

下面将提供对RMO内核对象实现操作的API,以及对该API功能的相应描述(相关例程的更为详尽的描述将在之后进行):

·CreateResourceManager:创建表示资源的新RMO;

·OpenResourceManager:打开已存在的RMO;

·DestroyREsourceManager:销毁RMO,使之不再持久;

·GetResourceManagerInfo:检索关于RMO的信息;

·SetResourceMangerInfo:设置关于RMO的信息;

·CreateEnlistment:使RMO加入到一个事务中,并检索相关通知;以及

·GetNotificationResourceManager:排队等候并返回可用RM通知。

下面将提供用于在加入事务后由RMO内核对象在TX内核对象上实现操作的API,以及对该API功能的相应描述(相关例程更为详尽的描述将在之后进行):

·PrePrepareComplete:表明RM已完成了对应事务管理器所请求的预准备;

·PrepareComplete:表明RM已完成了对应事务管理器所请求的事务准备;

·RollbackComplete:表明RM已完成对应事务管理器所请求的对已执行事务工作的回退;以及

·CommitComplete:表明RM已完成对应事务管理器所请求的对事务的提交。

不幸的是,与用于实现事务管理的内核对象TX、RMO以及EN相关联的API可能会使一个或多个内核对象暴露在各种安全攻击之下。例如,恶意或无效的RM可以把自己登记到事务中,从而导致通过不响应函数调用,或强制事务中断的服务拒绝攻击。因而,涉及图6中的更进一步的说明性示例针对安全、内核级分布式事务。

图6的实施例通过向相应内核对象的至少一个应用安全描述符,为易受攻击的内核对象进一步提供一种安全解决方案,该描述符可包含访问控制列表(ACL)。

在第一设备中,向TX 610应用ACL 660,向RMO 615应用ACL 665,并向EN 620应用ACL 670。在第二设备中,向TX 640应用ACL 675,向RMO 645应用ACL 680,并向EN 650应用ACL 685。

ACL定义了特定用户或用户组被允许或拒绝通过特定对象行使的“权限”。更具体地,如图8的示例ACL 810所示,应用或附加到内核对象的ACL至少包括访问控制条目(ACE),该条目包含对应的安全标识符(SID)和一组对应的权限。图8中的ACE条目1-12分别包括了对应的SID 1-12,以及对应的权限1-12。

SID 1-12标识了可以试图在应用该ACL的内核对象上实现一个操作或一系列操作的用户或用户组。权限1-12指定了能够由此SID所标识的用户或用户组可对相应内核对象执行的一个操作或一系列操作,并进一步指定了该一个或多个操作对所标识的用户或用户组的可访问性。即,权限1-12可表明所标识的用户或用户组被允许执行指定的操作,或所标识的用户或用户组被禁止执行指定的操作。

下面是可由应用于TX的ACL中的权限1-12所指定的示例操作的列表,紧接着是该操作功能的描述。权限1-12进一步指定,对由相应SID所标识的用户或用户组,该操作在TX上是被允许或拒绝的。

·TRANSACTION_QUERY_INFORMATION:获得关于TX的信息;

·TRANSACTION_SET_INFORMATION:设置关于TX的信息;

·TRANSACTION_ENLIST:在此事务中向TX登记;

·TRANSACTION_COMMIT:使所有与TX相关联的数据更新为持久的;

·TRANSACTION_ROLLBACK:中止,即,回退TX上的操作;

·TRANSACTION_PROPOGATE:从TX向另一对象发送数据;

·TRANSACTION_SAVEPOINT:保存该事务的当前点;以及

·TRANSACTION_MARSHAL:向另一设备发送关于该事务的数据。

下面是应用于RMO的ACL中的权限1-12所指定的示例操作的列表,紧接着是该操作功能的描述。权限1-12进一步指定,对由相应SID所标识的用户或用户组,该操作在RMO上是被允许或拒绝的。

·RESOURCEMANAGER_QUERY_INFORMATION:获得关于RMO的信息;

·RESOURCEMANAGER_SET_INFORMATION:设置关于RMO的信息;

·RESOURCEMANAGER_RECOVER:在事务失败的时刻确定事务的状态;

·RESOURCEMANAGER_ENLIST:在事务中登记RMO;

·RESOURCEMANAGER_GET_NOTIFICATION:当事务被解决后,从事务管理器接收通知;

·RESOURCEMANAGER_REGISTER_PRORTOCOL:在事务中注册RMO所支持的协议;以及

·RESOURCEMANAGER_COMPLETE_PROPOGATION:根据事务解决设置资源。

下面是应用于EN的ACL中的权限1-12所指定的示例操作的列表,紧接着是该操作功能的描述。权限1-12进一步指定,对由相应SID所标识的用户或用户组,该操作在EN上是被允许或拒绝的。

·ENLISTMENT_QUERY_INFORMATION:获得关于EN的信息;

·ENLISTMENT_SET_INFORMATION:设置关于EN的信息;

·ENLISTMENT_RECOVER:在事务失败的时刻确定事务的状态;

·ENSLITMENT_REFERENCE:获得并引用(或解除引用)登记键;

·ENLISTMENT_SUBORDINATE_RIGHTS:回退事务并响应通知;以及

·ENLISTMENT_SUPERIOR_RIGHTS:执行高级事务管理器将执行的操作;

例如启动预准备、准备,或事务中的高级回退操作。

因此,每个内核对象TX、RMO以及EN可有分别对其应用的ACL。因而,当API试图在内核对象的相应一个上启动操作时,必须使该ACL有权确定,对于发起该API的用户或用户组,此操作是被允许还是被拒绝。

更特定情况下,当打开句柄来执行操作时,对照ACL中的SID来检查对应于该API的用户或用户组;生成被允许的操作的列表;然后对照对给定句柄上SID所允许的操作,来检查由该API所指示的操作。

用于保护内核对象间的事务管理并实施安全参数的替换实施例包括,依据MicrosoftWindows操作系统的安全模型,向参与事务的内核对象应用安全描述符。

如上所述,这些API被展示为基于句柄的接口,此接口被用来实现该安全模型。下文包括对上面所列出的、可在TX内核对象上实现操作的API的更详尽的描述。这些描述包含了对例程、相应参数和返回值的描述。

PreprepareEnlistment

(IN PHANDLE               TransactionHandle;

IN PHANDLE                ResourceManagerHandle)

·该例程通过向所有相关联的RM发出预准备请求来请求对一个事务进行“预准备”。预准备给于有类似于高速缓存属性的RM在事务进入已准备状态前将其高速缓存转储清除到可能其它RM的机会,在准备状态中,下游的RM将不能再接受改变。

·如果此例程未被调用,而事务参与者请求阶段0处理,则发出预准备请求,以请求何时接收准备。然而,如果没有PreprepareEnlistment,包括类似于高速缓存的RM的某些配置可能导致分布式情况下的不必要的事务回退。

·自变量:

TransactionHandle:提供表示需预准备的事务的句柄;

ResourceManagerHandle:向预准备该事务的高级TM/CRM提供句柄。只有该高级TM/CRM能够在此事务上调用PrepareEnlistment、SuperiorCommitTransaction和SuperioRollbackTransaction。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_TOO_LATE

PrepareEnlistment

(IN PHANDLE                   TransactionHandle;

IN PHANDLE                    ResourceMangerHandle);

·该例程通过向所有与其相关联的ResourceManager(资源管理器)发出准备请求,来请求“准备”事务。此请求启动了两阶段提交协议。

·发出PrepareEnlistment的事务参与者使得Transaction(事务)对象进入能够幸免于系统或应用程序崩溃的持久状态;为能交付结果,在任何类型的失败后,前述参与者对该事务执行恢复。若不能满足此要求,可能导致资源泄漏,以及不一致的事务结果。

·自变量:

TransactionHandle:为需准备的事务提供一个句柄;和

ResourceManagerHandle:向正在准备该事务的TM提供一个句柄。如果该事务已(经由对PreprepareEnlistment的调用)被预准备,则ResourceManagerHandle将在调用中所使用的高级TM/CRM与PreprepareEnlistment匹配。并且在此事务中,只有调用该API的高级TM/CRM被允许调用SuperiorCommittransaction和SuperiorRollbackTransaction。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_TOO_LATE

STATUS_RM_NOT_RECOVERABLE

CreateTransaction

(OUT  PHANDLE               TransactionHandle,

IN    ULONG                 DesiredAccess OPTIONAL;

IN    POBJECT_ATTRIBUTES    ObjectAttfibutes OPTIONAL;

IN    ULONG                 CreateOptions OPTIONAL;

IN    PHANDLE               ResourceManagerHandle

OPTIONAL;

IN    NOTIFICATION_MASK     NotificationMask OPTIONAL;

IN    LPVOID                TransactionKey OPTIONAL)

·该例程创建一个新的Transaction对象,并返回此新对象的句柄。

·可选地(若指定ResourceManagerHandle参数),当其被成功创建后,此例程在该事务上执行“Join(加入)”操作。

·客户机用CloseHandle API来关闭该事务句柄。如果最后一个事务句柄关闭,且没有任何人在该事务上调用CommitTransaction,则该事务被隐式地回退。

·自变量:

TransactionHandle:提供指向将收到该新事务句柄的位置的指针。

DesiredAccess:提供指明期望的访问级别的掩码。有效的访问掩码选项有:

SYNCHRONIZE            可在此句柄上执行同步操作

TRANSACTION_COMMIT     可用此句柄提交事务

TRANSACTION_PREPARE    可用此句柄提交事务

TRANSACTION_ROLLBACK   可用此句柄中止事务

TRANSACTION_SAVEPOINT  可用此句柄为该事务创建保

                       存点

TRANSACTION_JOIN       可用此句柄作为RM加入该

                             事务

TRANSACTION_READ_ATTRIBUTES  可读与事务相关联的属性

TRANSACTION_WRITE_ATTRIBUTES 可写与事务相关联的属性

ObjectAttributes:为一个可选对象属性结构提供一个指针;

CreateOptions:提供可选事务标记。有效的创建标志选项包括:

TRANSACTION_CREATE_PRESUMED_NOTHING    创建一个

                                      “假定为空”的

                                       事务

ResourceManagerHandle:提供接收关于指定事务的通知的ResourceManager的句柄;

NotificationMask:指明该资源管理器关于此事务所希望接收的通知;以及

TransactionKey:指定该RM所希望与此事务的任何通知一同接收的不透明指针值。RM可以此将通知与在该RM地址空间中的某个对象相关联,从而避免每当通知出现都需要进行查找。

·返回值:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER

STATUS_OBJECT_NAME_COLLISION

STATUS_OBJECT_NAME_INVALID

STATUS_PRIVILEGE_NOT_HELD

STATUS_INSUFFICIENT_RESOURCES

OpenTransaction

(OUT  PHANDLE               TransactionHandle,

IN    ACCESS_MASK           DesiredAccess,

IN    POBJECT_ATTRIBUTES    ObjectAttributes

IN    PHANDLE               ResourceManagerHandle

optional,

IN    NOTIFICATION_MASK     NotificationMask optional,

IN    LPVOID                TransactionKey optional);

·此例程查询一个存在的Transaction对象,然后返回此Transaction的句柄。调用者在ObjectAttributes的ObjectName字段中指定GUID的字符表示。

·可选地(若指定了ResourceManagerHandle参数),当该事务被打开后,此例程也在该事务上执行“Join”的操作。

·客户机用CloseHandle API来关闭该事务句柄。如果最后一个事务句柄关闭,且没有人在该事务上调用CommitTransaction,则该事务被隐式地回退。

·自变量:

TransactionHandle:提供一个指向若打开操作成功则将收该事务句柄的位置的指针。

DesiredAccess:提供指定期望的访问级别的掩码。

ObjectAttributes:提供指向可任选对象属性结构的指针;

ResourceManagerHandle:提供接收关于指定事务的通知的ResourceManager的句柄;

NotificationMask:指定该ResourceManager对于此事务可接收的通知;以及

TransactionKey:可任选地指定该RM希望与此事务的任何通知一同接收的不透明指针值。该RM可以此将通知与在该RM地址空间中的某个对象相关联,从而避免每当通知出现都需要进行查找。

·返回值:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER

STATUS_OBJECT_NAME_INVALID

STATUS_OBJECT_NAME_NOT_FOUND

STATUS_OBJECT_PATH_SYNTAX_BAD

STATUS_PRIVILEGE_NOT_HELD

STATUS_INSUFFICIENT_RESOURCES

CommitTransaction

(IN   PHANDLE               TransactionHandle,

IN    ULONG                 CommitOptions Optional);

·此例程请求提交与TransactionHandle相关联的事务。已被打开或创建的任何事务句柄可用Transaction Commit所期望的访问来提交。因为并不存在规定只有事务的创建者才允许提交它的限制。

·如果所讨论的事务先前未发出PrepareEnlistment请求,则可在所有登记的RM上启动两阶段提交协议。此调用可被视为由客户机所发出的单阶段提交请求。

·若事务先前已通过PrepareEnlistment被准备,则此例程不被调用。只有调用PrepareEnlistment的RM可以用例程SuperiorCommitTransaction来解析事务状态。

·自变量:

TransactionHandle:提供标明要提交的事务的句柄;以及CommitOptions:COMMIT_RETAINING事务将被提交。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_TRANSACTION_ABORTED

RollbackTransaction

(IN   PHANDLE                 TransactionHandle,

IN    SAVEPOINT               SavePoint            Optional,

IN    ROLLBACK_REASON         RollbackReason       Optional);

·此例程请求将与TransactionHandle相联的事务回退。如果指定可任选的SavePoint,且是有效的保存点,则此回退可以是部分回退。NULL的SavePoint参数表明该事务应被完全回退或中止。可提供可任选的RollbackReason结构;这将被保留在Transaction对象中,并可由感兴趣的事务参与者通过调用GetInformationTransaction来检索。

·自变量:

TransactionHandle:提供指明应被回退的事务的句柄;

SavePoint:提供指明事务的状态应当被回退到什么程度的SavePoint的名称;以及

RollbackReason:提供回退理由。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_TRANSACTION_COMMITTED

SavepointTransaction

(IN   PHANDLE                 TransactionHandle,

IN    LONG                    SavepointFlags Optional,

OUT   LPSAVEPOINT             SavePoint);

·此例程请求为与TransactionHandle相关联的事务生成一个“保存点”;该保存点用作后续的回退请求的目标。

·自变量:

TransactionHandle:提供指明对其应当建立保存点的事务的句柄;

SavepointFlags:可任选地提供影响保存点生成的一组标记;以及

SavePoint:提供指向储存保存点标识符的位置的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_TRANSACTION_COMMITTED

STATUS_TM_TRANSACTION_ABORTED

QueryInformationTransaction

(IN   HANDLE                  TransactionHandle,

IN    TRANSACTION_INFORMATION_CLASS

TransactionInformationClass,

OUT   PVOID                   TransactionInformation,

IN    ULONG                   TransactionInformationLength,

 OUT  PULONG                         ReturnLength Optional);

·此例程返回关于由TransactionHandle所表示的Transaction对象的请求信息。

·自变量:

TransactionHandle:提供指明对其请求信息的事务的句柄;

TransactionInformationClass:说明请求关于该Transaction对象的哪一类消息;

TransactionInformation:提供指向保存所请求的事务信息的缓冲区的指针。

TransactionInformationLength:说明TransactionInformation所指向的缓冲区的长度;以及

ReturnLength:提供指向将接收写到TransactionInformation缓冲区的信息的长度的位置。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_INVALID_INFO_CLASS

STATUS_INFO_LENGTH_MISMATCH

SetInformationTransaction

(IN   TRANSACTION_INFORMATION_CLASS

TransactionInformationClass,

IN    PVOID                    TransactionInformation,

IN    ULONG                    TransactionInformationLength);

·此例程设置关于TransactionHandle所表示的Transaction对象的请求信息。

·自变量:

TransactionHandle:提供指明将更改其信息的事务的句柄;

TransactionInformationClass:指明正在请求的是关于该Transaction对象的哪一类信息;

TransactionInformation:提供指向保存所请求的事务信息的缓冲区的指针。

TransactionInformationLength:说明由TransactionInformation所指向的缓冲区的长度;以及

ReturnLength:提供指向将接收写到TransactionInformation缓冲区的信息的长度的位置的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_INVALID INFO_CLASS

STATUS_INFO_LENGTH_MISMATCH

下文包括对上面所列的在RMO内核对象上实现操作的API的更详尽描述。这些描述包括例程、对应自变量和返回值的描述。

CreateResourceManager

(OUT  PHANDLE                     ResourceMangerHandle,

IN    ACCESS_MASK                 DesiredAccess         Optional,

IN    POBJECT_ATTRIBUTES          ObjectAttributes,

IN    ULONG                       CreateOptions         Optional,

IN    RM_NOTIFICATION_ROUTINE     NotificationRoutine

Optional);

·此例程创建一个表示资源的新ResourceManager对象。

·ResourceManager对象亦担当关于RM所加入的事务的TM通知的端点;RM通过调用GetNotificationResourceManager来请求这些通知。

·ResourceManager通常是永久性的对象,即,每次(系统或RM的)失败后,该对象必须被重新打开并且执行恢复。可通过指定RESOURCEMANAGER_NO_RECOVERY选项来创建ResourceManager对象的暂时性版本。暂时性RM不被强制或允许执行恢复。不可恢复RM选项允许应用程序或者RM接收关于事务进度的通知(例,PREPREPARE(预准备),PREPARE(准备),COMMIT(提交)),而无需被要求实现记录准备和执行恢复的完全复杂性。

·自变量:

ResourceManagerHandle:提供指向将接收新ResourceManager的句柄的位置的指针。

DesiredAccess:提供说明预期的访问级别的掩码。有效的访问掩码选项包括有:

SYNCHRONIZE                        同步句柄上的操作

RESOURCE_MANAGER_DESTROY           销毁该资源管理器

RESOURCE_MANAGER_READ_ATTRRIBUTES  读与资源管理器相

                                   关联的属性

RESOURCE_MANAGER_WRITE_ATTRIBUTES  写与资源管理器相

                                   关联的属性

ObjectAttributes:指定新RM对象的属性;这包括RM名;

CreateOptions:为已创建的对象指定选项;

RESOURCEMANAGER_NO_RECOVERY:ResourceManager对象是非永久性的,且不执行恢复操作;

RESOURCEMANAGER_COMMUNICATION:ResourceManager知道如何与其它计算机通信。ResourceManager可以用来封送或解封送(unmarshall)事务;

RESOURCEMANAGER_CLUSTER_RECOVERY:ResourceManager知道如何将失败到此群集中的其它节点的结果读出/发送到日志文件;以及

NotificationRoutine:指定当通知对该ResourceManager可用时要调用的通知例程。

·返回值:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER

STATUS_OBJECT_NAME_COLLISION

STATUS_OBJECT_NAME_INVALID

STATUS_PRIVILEGE_NOT_HELD

STATUS_INSUFFICIENT_RESOURCES

OpenResourceManager

(OUT  PHANDLE                 ResourceManagerHandle,

IN    ACCESS_MASK             DesiredAccess          Optional,

IN    POBJECT_ATTRIBUTES      ObjectAttributes,

IN    ULONG                   OpenOptions            Optional,

IN    RM_NOTIFICATION_ROUTINE           NotificationRoutine

Optional);

·此例程依名称打开一个存在的ResourceManager对象。如果目标ResourceManager对象是永久性的,但目前未打开,则此对象最初处于“恢复中”的状态,必须被恢复;当恢复完成,必须调用RecoveryCompleteResourceManager。

·自变量:

ResourceManagerHandle:提供指向将接收现存ResourceManager对象句柄的位置的指针;

DesiredAccess:提供说明对此对象所期望的访问的掩码。

ObjectAttributes:为该新RM对象指定属性;

OpenOptions:指定该对象的选项。有效选项包括有:

    RESOURCE_MANAGER_DET       该资源管理器接收详细的恢

    AILED_RECOVERY_NOTIFIC     复通知(包含关于通信端点

    ATIONS                     的附加信息),而非普通的

                               恢复通知;以及

    NotificationRoutine        指定当通知对此

                               ResourceManager可用时要

                               调用的通知例程。

·返回值:

STATUS_SUCCESS

STATUS_INVALID_PARAMETER

STATUS_OBJECT_NAME_INVALID

STATUS_OBJECT_NAME_NOT_FOUND

STATUS_OBJECT_PATH_SYNTAX_BAD

STATUS_PRIVILEGE_NOT_HELD

STATUS_INSUFFICIENT_RESOURCES

DestroyResourceManager

(IN   PHANDLE              ResourceManagerHandle);

·此例程销毁ResourceManager对象,使之不再持久。

·自变量:

ResourceManagerHandle:提供指明要销毁的ResourceManager对象的句柄。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_NEEDS_RECOVERY

QueryInformationResourceManager

(IN   HANDLE            ResourceManagerHandle,

IN    RESOURCEMANAGER_INFORMATION_CLASS

ResourceManagerInformationClass,

OUT   PVOID                     ResourceManagerInformation,

IN    ULONG                     ResourceManagerInformationLength,

OUT   PULONG                    ReturnLength              Optional);

·此例程返回关于由ResourceManagerHandle表示的RMO的请求信息。

·自变量:

ResourceManagerHandle:提供指明对其请求信息的ResourceManager的句柄;

ResourceManagerInformationClass:指明被请求的是关于该ResourceManager对象的哪类信息;

ResourceManagerInformation:提供指向存储所请求的ResourceManager信息的缓冲区的指针;

ResourceManagerInformationLength:说明由ResourceManagerInformation所指向的缓冲区的长度,以及

ReturnLength:提供指向接收写到该ResourceManagerInformation缓冲区中的信息的长度的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_INFALID_INFO_CLASS

STATUS_INFO_LENGTH_MISMATCH

SetInformationResourceManager

(IN   HANDLE         ResourceManagerHandle,

IN    RESOURCEMANAGER_INFORMATION_CLASS

                     ResourceManagerInformationClass,

IN    PVOID          ResourceManagerInformation,

IN    ULONG          ResourceManagerInformationLength);

·此例程设置关于由ResourceMaaagerHandle表示的RMO的请求信息。

·自变量:

ResourceMaaagerHandle:提供指明对其修改信息的ResourceManager的句柄;

ResourceManagerInformationClass:指明请求关于ResourceMaaager对象的哪一类信息;

ResourceMaaagerInformation:提供指向存储所请求的ResourceMaaager信息的缓冲区的指针;以及

ResourceMaaagerInformationLength:指明由

ResourceMaaagerInformation所指向的缓冲区的长度。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_INFALID_INFO_CLASS

STATUS_INFO_LENGTH_MISMATCH

CreateEnlistment

(IN   PHANDLE               ResourceManagerHandle,

IN    PHANDLE               TransactionHandle,

IN    NOTIFICATION_MASK     NotificationMask,

IN    LPVOID                TransactionKey       Optional);

·此例程使RMO“加入”一特定事务,并接收与其相关的通知。

·CreateEnlistment的调用是幂等的,一个RM可多次调用此例程,以改变其NotificationMask或TransactionKey。对CreateEnlistment的后续调用替换了通知掩码和事务键,而无需在此事务上创建新登记。

·NotificationMask可被用于请求多次接收通知。例如,正在接收PREPREPARE通知的RM可以通过调用JoinTransaction并指定PREPREPARE标志来请求另一个通知。因而,一个RM可接收多个PREPREPARE请求。上述请求可被拒绝,如果该事务已进行至超过本应接收所请求的通知的点的话,拒绝该请求是合适的。例如,当某个RM已被通知进行准备时,请求预准备则不能被批准。

·自变量:

ResourceManagerHandle:向RM提供句柄,以接收关于此指定事务的通知;

TransactionHandle:提供该RM希望加入的事务的句柄;

NotificationMask:指定RM愿意接收的关于此事务的通知。有效的掩码如下所述,且各掩码可以用OR(或)组合:

TRANSACTION_NOTIFY_MASK_RM:RM所期望的公用通知(PREPARE、COMMIT、ROLLBACK、SAVEPOINT)

TRANSACTION_NOTIFY_MASK_CRM:CRM或高级TM所期望的公用通知(PrePrepare_Complete、PrepareComplete、CommitComplete、RollbackComplete、SavebackComplete)

TRANSACTION_NOTIFY_PREPREPARE:预准备通知

TRANSACTION_NOTIFY_PREPARE:准备通知

TRANSACTION_NOTIFY_COMMIT:提交通知

TRANSACTION_NOTIFY_ROLLBACK:回退通知

TRANSACTION_NOTIFY_PREPREPARE_COMPLETE:预准备完成的通知

TRANSACTION_NOTIFY_PREPARE_COMPLETE:准备完成的通知

TRANSACTION_NOTIFY_COMMIT_COMPLETE:提交完成的通知

TRANSACTION_NOTIFY_ROLLBACK_COMPLETE:回退完成的通知

TRANSACTION_NOTIFY_SAVEPOINT_COMPLETE:保存点完成的通知;以及

TransactionKey:指定该RM希望与关于此事务的任何通知一同接收的不透明指针值。该RM可以此将通知与该RM地址空间中的某个对象相关联,从而避免每次通知出现时都需要执行查找。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_PARAMETER

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_TOO_LATE

GetNotificationResourceManager

(IN   PHANDLE                       ResourceManagerHandle,

IN    PTRANSACTION_NOTIFICATION     TransactionNotification,

IN    PLARGE INTEGER                Timeout Optional);

·此例程排队等候并返回RM通知(如果有任何可用的话)。

·自变量:

ResourceManagerHandle:提供指明该为其返回通知的ResourceManager的句柄;

TransactionNotification:提供指向将被填入首个可用通知的TRANSACTION_NOTIFICATION结构的指针;以及

Timeout:提供一时间,当等待通知变为可用时,调用者在该时间之前希望阻塞。如果当该超时到期时仍未有通知,则调用者返回STATUS_TIMEOUT。

·返回值:

STATUS_SUCCESS

STATUS_TIMEOUT

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

下文包括对上面所列的、由RMO内核对象在加入事务后在TX内核对象上实现操作的API更详尽的描述。这些描述包例程,对应自变量和返回值的描述。

PrePrepareComplete

(IN       PHANDLE           EnlistmentHandle);

·此例程表明,RM已完成了KTM所请求的事务的预准备处理(也称作“阶段0”)。

·自变量:

TransactionHandle:提供指示对其已完成预准备操作的事务的句柄。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_NOT_REQUESTED

PrepareComplete

(IN      PHANDLE             EnlistmentHandle);

·此例程表明RM已完成该KTM所请求的事务的准备。

·自变量:

TransactionHandlel:提供指明对其完成了准备操作的事务的句柄。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_NOT_REQUESTED

RollbackComplete

(IN    PHANDLE           EnlistmentHandle);

·此例程表明该RM已成功地如所请求地完成了对由事务所执行的工作的回退。如果RM无法成功地如所请求地回退该事务,它应当通过RollbackTransaction发出对完全回退的请求。

·自变量:

TransactionHandle:提供指明对其完成该回退操作的事务的句柄。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_NOT_REQUESTED

CommitComplete

(IN    PHANDLE            EnlistmentHandle);

·该例程表明RM已完成了如所请求地提交由事务执行的工作。

·自变量:

TransactionHandle:提供指示对其完成提交操作的事务的句柄。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

STATUS_TM_NOT_REQUESTED

另外,可以为内核对象提供传播例程。下面是此类例程的示例。

RegisteredProtocolAddressInformation

(IN   HANDLE                  ResourceManager,

IN    PROTOCOL_ID             ProtocolId,

IN    ULONG                   ProtocolInformationSize,

IN    PVOID                   ProtocolInformation Optional);

·此例程将资源管理器注册为特定协议的通信资源管理器。此程序还将二进制大对象与此协议相关联。在一个给定机器上,对一个协议仅可注册一个资源管理器。

·自变量:

ResourceManager:提供我们正在注册的资源管理器的句柄;

ProtocolId:此GUID标识该协议;

ProtocolInformationSize:ProtocolInformation的大小;

ProtocolInformation:可任选的与此协议相关联的二进制大对象;

·返回值:

STATUS_SUCCESS

STATUS_INVALID_HANDLE

MarshallTransaction

(IN   PHANDLE                     TransactionHandle,

IN    ULONG                       NumberOfProtocols,

IN PPROTOCOL_ID                   ProtocolArray,

IN ULONG                          BufferLength,

IN PVOID                          Buffer,

OUT PULONG                        BufferUsed Optional);

·此例程请求与TransactionHandle相对应的事务的表示被串行化到缓冲区。

·自变量:

TransactionHandle:提供指明是对其完成了提交操作的事务的句柄;

NumberOfProtocols:指明该协议数组的大小;

ProtocolArray:PROTOCOL_ID(GUID)数组,此数组指定了可用于封送该事务的协议。此数组须按优先级排序——数组中第一个协议是首选的协议,第二个协议是第二优选的协议,等等;

BufferLength:提供可用的缓冲区长度;

Buffer:提供指向应储存该事务的串行化的缓冲区的指针;以及

BufferUsed:提供指向应储存写入到缓冲区的实际字节的位置的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

GetProtocolAddressInformation

(IN    ULONG            AddressBufferSize,

OUT    PVOID            AddressBuffer,

OUT    PULONG           AddressBufferUsed Optional);

·此例程请求将表示该机器上已注册的所有协议的信息串行化至AddressBuffer。然后此信息可被传递到其它机器,并用作PushTransaction的自变量,以将事务入栈到生成该AddressInformation的机器。

·自变量:

AddressBufferSize:提供可用缓冲的长度;

AddressBuffer:提供可得缓冲的长度;

AddressBufferUsed:提供指向保存该事务的串行化的缓冲区位置的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

PullTransaction

(OUT  PHANDLE             TransactionHandle,

IN    ULONG               NumberOfProtocols,

IN    PCRM_PROTOCOL_ID    ProtocolArray,

IN    ULONG               BufferLength,

IN    PVOID               Buffer);

·此例程请求由事务管理器使缓冲区中的串行化所表示的事务变为可用。当该事务已被已注册的资源管理器之一成功地传播,则返回该新Transaction对象的句柄。

·自变量:

TransactionHandle:提供指向应保存表示该新事务的句柄的位置的指针;

NumberOfProtocols:说明协议数组的大小;

ProtocolArray:PROTOCOL_ID(GUID)数组,此数组说明了用于封送该事务的协议。此数组须按优先级排序——数组中第一个协议是首选的协议,第二个协议是第二优选的协议,等等;

BufferLength:提供可用缓冲区的长度;

Buffer:提供指向保存该事务的串行化的缓冲区的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

PushTransaction

(IN   HANDLE                    TransactionHandle,

IN    ULONG                     NumberOfProtocols,

IN    PCRM_PROTOCOL_ID          ProtocolArray,

IN    ULONG                     DestimationInfoLength,

IN    PVOID                     DestinationInfo,

IN    ULONG                     ResponseBufferLength,

OUT   PVOID                     ResponseBuffer,

OUT   PULONG                    ResponseBufferUsed Optional,

OUT   PULONG                    PushCookie Optional);

·此例程请求用入栈风格传播将该事务传播至目的机器。协议将按照其在ProtocolArray中所列的顺序被使用,直至有一个成功。如果无一协议成功地将该事务传播至目的机器,则该例程返回失败。

·自变量:

TransactionHandle:提供指向应被传播至远程机器的事务对象的指针。

DestinationInfoLength:提供可用的DestinationInfo的长度;

DestinationInfo:提供指向存储该目的的“端点”信息的缓冲区的指针。这可以是从对目的机器上的GetProtocolAddressInformation的调用所收到的结果;

ResponseBufferLength:提供可用的ResponseBuffer的长度。

ResponseBuffer:提供指向保存该事务的串行化的缓冲区的指针;以及

PushCookie:提供指向储存表示入栈请求的cookie的缓冲区的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

GetPushTransactionBuffer

(IN   HANDLE                      TransactionHandle,

IN    ULONG                       PushCookie,

IN    ULONG                       ResponseBufferLength,

OUT   PVOID                       ResponseBuffer,

OUT   PULONG                      ResponseBufferUsed Optional);   ·如果对PushTransaction的初始调用收到STATUS_BUFFER_TOO_SMALL返回代码,则此调用被用来检索对PushTransaction的调用的输出。在那种情况下,调用者将调用GetPushTransactionBuffer,并传入充足的缓冲区大小。

·自变量:

TransactionHandle:提供指向储存表示新事务的句柄的位置的指针;

ResponseBufferLength:提供可用缓冲区的长度;以及

ResponseBuffer:提供指向储存该事务的串行化的缓冲区的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

PropagationComplete

(IN   HANDLE                EnlistmentHandle,

IN    ULONG                 RequestCookie,

IN    ULONG                 BufferLength,

IN    PVOID                 Buffer);

·当CRM成功地完成传播完事务后,此例程由CRM调用。

·自变量:

TransactionHandle:提供指向储存表示新事务的句柄的位置的指针;

RequestCookie:提供在原始PROPAGATE通知自变量中接收到的RequestCookie,来指明已完成哪一个请求。

BufferLength:指明可用缓冲区的长度;以及

Buffer:提供指向保存该事务的串行化的缓冲区的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

PropagationFailed

(IN   HANDLE             ResourceManagerHandle,

IN    ULONG              RequestCookie,

IN    STATUS             PropStatus);

·CRM使用此例程来说明其未能如所请求地传播事务。

·自变量:

TransactionHandle:提供指向储存表示新事务的句柄的位置的指针;

BufferLength:提供可用缓冲区的长度;以及

Buffer:提供指向保存该事务的串行化的缓冲区的指针。

·返回值:

STATUS_SUCCESS

STATUS_ACCESS_DENIED

STATUS_INVALID_HANDLE

STATUS_INSUFFICIENT_RESOURCES

示例性计算环境

图9示出了一个通用计算机环境900,此环境可用来实现此文所描述的技术。计算机环境900仅仅是计算环境的一个示例,并非暗示了对该计算机和网络体系结构的使用范围和功能的任何限制。也不能认为计算机环境900对在示例计算机环境900环境中示出的任一组件或其组合具有任何依赖性或需求。

计算机环境900包括计算机902形式的通用的计算设备。计算机902的组件可包括但不限于,一个或多个处理器或处理单元904、系统存储器906、以及将包括处理器904在内的各种系统组件与系统存储器906耦合的系统总线098。

系统总线908表示一个或多个各种类型的总线结构,包括存储器总线或存储器控制器、外设总线、加速图形端口、以及使用任何总线体系结构的处理器或局部总线。作为例子,此类体系结构可包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强型ISA(EISA)总线、视频电子技术标准协会(VESA)局部总线、亦称作Mezzanine总线的外围部件互连(PCI)总线、PCI Express总线、通用串行总线(USB)、安全数字(SD)总线或IEEE 1394(即火线)总线。

计算机902可包括各种计算机可读介质。此类介质可以是计算机902可访问的任何介质,包括易失性或非易失性介质、可移动或不可移动介质。

系统存储器906包括易失性存储器形式(例如随机存取存储器(RAM)910);和/或非易失性存储器(例如只读存储器(ROM)912或闪存RAM))形式的计算机可读介质。基本输入/输出系统(BIOS)914存储于ROM 912或闪存RAM中,BIOS包含例如在启动时,帮助在计算机902内各元件间传递信息的基本例程。RAM 910通常含有处理单元904即时可访问和/或当前正在操作的数据和/或程序模块。

计算机902可包含其它可移动/不可移动,易失性/非易失性计算机存储介质。作为例子,图9示出了可读出与写入到不可移动,非易失性的磁介质(未画出)的硬盘驱动器916、可读出与写入到可移动,非易失性磁盘920(例,软盘)的磁盘驱动器918、以及可读出并/或写入到可移动,非易失性的光盘924(例如CD-ROM、DVD-ROM或其它光介质)的可移动,非易失性光盘驱动器922。硬盘驱动器916,磁盘驱动器918以及光盘驱动器922分别通过一个或多个数据介质接口925连接到系统总线908。可选择地,硬盘驱动器916、磁盘驱动器918以及光盘驱动器922可由一个或多各接口(未画出)连接到系统总线908。

盘驱动器及其相关联的计算机可读介质为计算机902提供计算机可读指令、数据结构、程序模块及其它数据的非易失性存储。尽管示例中示出了硬盘916、可移动磁盘920以及可移动光盘924,然而可以理解,可存储计算机可访问的数据的其它类型的计算机可读介质也可被用以实现该示例计算系统和环境,这些介质诸如磁带盒或其它磁存储设备、闪存卡、CD-ROM、数字多功能盘(DVD)或其它光存储、随机存取存储器(RAM)、只读存储器(ROM)、电可擦可编程只读存储器(EEPROM)等等。

任意数量的程序模块可被存储于硬盘916、磁盘920、光盘924、ROM 912和/或RAM 910中,这些程序模块包括,例如操作系统926、一个或多个应用程序928、其它程序模块930以及程序数据932。这些操作系统926、一个或多个应用程序928、其它程序模块930以及程序数据932的每一个(或其某种组合)都可以根据上述示例实施例来制定事务,以实现支持分布式文件系统的全部或部分常驻组件。

用户可通过输入设备,例如键盘934和定位设备936(例,“鼠标”),向计算机902输入命令和信息。其它输入设备938(未具体示出)可包括话筒、操纵杆、游戏垫、圆盘式卫星天线、串行端口、扫描仪和/或其它类似设备。上述及其它输入设备通过与系统总线908耦合的输入/输出接口940连接到处理单元904,但也可通过例如并行端口、游戏端口或通用串行总线(USB)之类的其它接口和总线结构连接。

显示器942或其它类型的显示设备也可通过如视频适配器944之类的接口连接到系统总线908。除显示器942之外,其它输出外围设备可包括例如扬声器(未示出)和打印机946等,这些设备可通过I/O接口940连接到计算机902。

计算机902可使用到一个或多个远程计算机,如远程计算设备948的逻辑连接在网络化环境下运作。举例来说,远程计算设备948可以是PC、,便携式计算机、服务器、路由器、网络计算机、对等设备或其它普通网络节点等等。这里将远程计算设备948描述成可包含许多或所有相对于计算机902所描述的元件和特征的便携式计算机。可选地,计算机902也可在非网络化环境下运作。

计算机902和远程计算机948之间的逻辑连接被描述成局域网(LAN)950和普通广域网(WAN)952。对于办公室、企业内部计算机网络、内联网和因特网来说,这样的网络环境是很常见的。

当于LAN网络环境下实现时,计算机902通过网络接口或适配器954连接到局域网950。当于WAN网络环境下实现时,计算机902通常包含调制解调器956,或用于通过广域网952建立通信的其它装置。调制解调器956对计算机902来说可以是内部的,亦可是外部的,它可通过I/O接口940或其它适当的机制连接到系统总线908。图示的网络连接只是示例,也可使用在计算机902与948间建立至少一个通信链路的其它装置。

在如相对于计算环境900所示的网络环境中,相对于计算机902所描述的程序模块或其一部分可以被存储在远程存储器存储设备中。举例来说,远程应用程序958驻留在远程计算机948的存储器设备中。为说明目的,应用或程序及其它可执行程序组件,例如操作系统,在此均被示出为分离的框,尽管可以认识到,这些程序与组件在不同的时刻驻留于计算设备902的不同储存组件中,且被计算机的至少一个数据处理器执行。

各种模块和技术在此处可以在诸如由一个或多个计算机或其它设备执行的程序模块等计算机可执行指令的上下文中描述。一般而言,程序模块包括例程、程序、对象、组件、数据结构等等,它们执行特定的任务或实现特定的抽象数据结构。这些程序模块及其类似物可作为本机代码执行,也可在如虚拟机器或其它当场(just-in-time)编译执行环境中被下载并执行。通常,程序模块的功能可按不同实施例的期望被组合或分发。

这些模块与技术的实现可以被存储于某种形式的计算机可读介质或通过其发送。计算机可读介质可以是计算机可访问的任何可用介质。作为示例而非局限,计算机可读介质可包含“计算机储存介质”和“通信介质”。

“计算机存储介质”包括易失性和非易失性,可移动和不可移动介质,这些介质可以用用于储存诸如计算机可读指令、数据结构、程序模块与其它数据等信息的任何方法或技术来实现。计算机存储介质包括,但不限于,RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光存储、盒式磁带、磁带磁盘存储或其它磁存储设备、或可用于存储期望信息且可被计算机访问的任何其它介质。

“通信介质”通常在诸如载波或其它传输机制等已调制数据信号中包含计算机可读指令、数据结构、程序模块或其它数据。通信介质也包括任何信息传递介质。术语“已调制数据信号”意指其一个或多个特征以对信号中的信息编码的方式被设置或改变的信号。仅作为一个非限制性的示例,通信介质包括有线介质,例如有线网络或直通连接,以及无线介质,例如声学,RF,红外及其它无线介质。任意上述介质的组合也包含在计算机可读介质范畴中。

贯穿此说明书,参考了“一个实施例”,“实施例”,或“示例实施例”,意指被详细描述的特征、结构或特性被包括在本发明的至少一个实施例中。因而,这类短语的使用可以指示不止一个实施例。此外,所描述的特征、结构或特性可在一个或多个实施例中以任何适当方式组合。

然而,相关领域的技术人员可以意识到,本发明无需一个或多个具体细节即可实现,或以其它方法、资源、材料等也可实现。在其它情况下,纯粹为避免使本发明的各方面模糊不清,众所周知的结构、资源或操作并未被详细示出或描述。

尽管示出并描述了本发明的示例实施例和应用,然而必须明白,本发明并不受上述精确配置和资源的限制。本领域的技术人员可以在不偏离要求保护的本发明的精神和分为的情况下,对此处揭示的本发明的方法与系统中的排列、操作与细节进行各种修正、修改与变更。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号