説明

ネットワーク上のトランザクション処理ファイルオペレーションのための方法およびシステム

【課題】ただ1つのオペレーションが失敗する場合、そのグループ中におけるすべてのオペレーションの効果は、そのトランザクションに関連するオペレーション数にかかわらず「元に戻され」るかまたはロールバックされる。各トランザクション処理システムは、これらのオペレーションのすべてが適用されている、あるいは、いずれも適用されていないという2つの状態の内のどちらか一方の状態に至る。
【解決手段】ネットワーク上でトランザクション処理リモートファイルオペレーションを実行するシステムのクライアントとサーバは、それぞれトランザクションマネージャとファイルシステムを含む。クライアントはリダイレクタも含むが、サーバはサーバアプリケーションを含む。RDRは、リモートトランザクション処理ファイルオペレーションを求める要求を受信しそれに応答して、RDRはこの要求からトランザクションを検索する。RDRは、ネットワーク上でトランザクションをサーバに対して送信する。

【発明の詳細な説明】
【背景技術】
【0001】
以下に説明する様々な実施形態は、一般にネットワーク通信に関し、より詳細には、それだけには限定されないが、ネットワーク上のトランザクション処理ファイルオペレーションを可能にする方法およびシステムに関する。
【0002】
トランザクションは、長い間、データベースおよびトランザクション処理システムによって提供されてきている。トランザクションは、いくつかのオペレーションを1つの原始的オペレーションに、すなわち個々のオペレーションの結果がともに有効か、または共倒れとなるというオペレーションのグループに一緒にグループ分けすることによって、アプリケーションプログラマにとって望ましい簡略化された失敗モデルを提供する。
【発明の概要】
【発明が解決しようとする課題】
【0003】
もし、ただ1つのオペレーションが失敗する場合には、そのグループ中におけるすべてのオペレーションの効果は、そのトランザクションに関連するオペレーション数にかかわらず、「元に戻され(undone)」、あるいはロールバックされる。オペレーションの間のこの連帯(solidarity)は、失敗の数がいくつの場合においても適用され、結局のところ各トランザクション処理システムは、これらのオペレーションのすべてが適用されている、あるいは、これらのオペレーションのいずれも適用されていないという2つの状態の内の、どちらか一方の状態に至る。
【課題を解決するための手段】
【0004】
記載される様々な実施形態の態様によれば、ネットワーク上でファイルオペレーションをトランザクション処理する方法およびシステムが提供される。一態様によれば、コンピューティングプラットフォーム(すなわち、クライアント)は、ネットワークを介して、別のコンピューティングプラットフォーム(すなわち、サーバ)上のファイルに遠隔でアクセスすることができる。この態様によれば、これらクライアントおよびサーバはそれぞれ、TM(transaction managerトランザクションマネージャ)およびFS(file systemファイルシステム)を含んでいる。このクライアントは、RDR(redirectorリダイレクタ)も含んでいるが、このサーバは、SRV(server componentサーバコンポーネント)を含んでいる。
【0005】
動作中においては、RDRは、リモートトランザクション処理ファイルオペレーション(remote transacted file operation)の要求を受信する。この要求に応答して、RDRはこの要求からのトランザクションについて調べ、(例えば、一実施形態におけるこのTMによって)サーバへ送信するためにこのトランザクションをマーシャリングする。次いでRDRは、ネットワーク上でこのトランザクション情報(例えば、一実施形態においてはマーシャリングブロブ(marshal blob))をサーバに送信する。SRVはトランザクション情報を受信し、次いでサーバのTMおよびFSは、トランザクション情報を使用してファイルオペレーションを実施する。次いで、サーバはネットワークを介してファイルオペレーションの結果をクライアントに返送する。
【0006】
他の態様においては、RDRは、1つのファイルに対して複数のリモートファイルオペレーショントランザクションがオープンであるようにすることができる。RDRがトランザクション処理リモートファイルオペレーションを求める新しい要求を受信するとき、RDRは、リモートファイルの「ダーティ(dirty)」バージョン(すなわち、書き込まれているバージョン)が、クライアント上で知られているかどうかを判定する。次いで、RDRはファイルについて元のバージョンの代わりに、新しい要求に対するダーティバージョンを使用する。一部の実施形態においては、RDRは、1つのトランザクション処理されたライトオペレーションが所与のファイルについて一時にオープンであることを可能にするだけである。
【0007】
さらに他の態様においては、RDRは、トランザクション処理されたリモートファイルオペレーションを求める新しい要求は、クライアント上ですでに知られているファイル情報を使用することができるかどうかを判定する。この同じファイル情報を使用することができる場合に、RDRは、このファイル情報のもう1つのコピーを記憶する代わりにこの同じファイル情報を使用する。
【0008】
さらに他の態様においては、RDRは、所与のリモートファイルについてのトランザクションに便宜的ロックを関連づけることができる。一実施形態においては、このロックは、ローカルサーバがファイルにアクセスすることを妨げないが、サーバに、ロックが解除されているというメッセージをクライアントに対して送信させる。次いで、トランザクション処理リモートファイルオペレーションを求める新しい要求が、クライアント中にすでにキャッシュされているファイル情報を使用することができるかどうかを判定するに際し、RDRは所与のファイルについてロックが解除されたかどうかを検査することができる。
【0009】
非限定的で非網羅的な実施形態について、以下の図を参照しながら説明する。別に指定をしていない限り、様々な図面全体にわたって、同一の参照番号は同一の要素を示している。
【発明の効果】
【0010】
本発明においては、一定のトランザクションを構成するオペレーションのグループは、少なくとも当業者には「原子性」、「一貫性」、「隔離性」、および「永続性)」を含む頭字語「ACID」として知られている特性を、全体として有している。より詳細には、トランザクションの各オペレーションからもたらされるデータの更新は、すべて不変であるか、あるいはどれも不変でなく(原子性)、トランザクションは、基礎をなすデータを一貫した状態にし(一貫性)、トランザクション更新の効果は、全体のトランザクションが不変となるまでは他の同時に実行されるオペレーションから見えず(隔離性)、またトランザクションに対する結果が決定された後は、この結果は決して変化しないことが保証される。
【図面の簡単な説明】
【0011】
【図1】トランザクション処理リモートファイルオペレーションを使用することができるシステムの一実施例を示す図である。
【図2】図1のシステムのクライアントおよびサーバのコンポーネントの一実施例を示す図である。
【図3】図2のクライアントとサーバの間のトランザクション処理リモートファイルオペレーションについての実施例の処理フローを示す図である。
【図3A】図2のクライアントとサーバの間のトランザクション処理リモートファイルオペレーションについての実施例の処理フローを示す図である。
【図4】図2のクライアントおよびサーバによる複数のリモートファイルアクセスの一実施例を示す図である。
【図5】ネットワーク上のトランザクションの2相コミットを実施するための一実施例の処理フローを示す図である。
【図6】トランザクション管理を実装するためのコンポーネントの一実施例を示す図である。
【図7】カーネルレベルトランザクションについての一実施例処理フローを示す図である。
【図8】セキュリティフィーチャの一実施例を示す図である。
【図9】様々な実施形態による、本明細書中で説明される技法を実装するために使用できる一般的なコンピュータ環境を示す図である。
【発明を実施するための形態】
【0012】
実施例のネットワーク環境
前述のように、トランザクションは、データベースおよびトランザクション処理システムにおいて使用されてきているが、以下の実施形態においては、トランザクションは、リモートファイルオペレーションのために使用される。図1は、クライアントがネットワーク101を介してクライアント上でファイルオペレーションをトランザクション処理することができるシステム100を示している。図1の実施例のネットワーク環境においては、クライアント装置と呼ぶこともできる複数のクライアントコンピューティングデバイス105、110、115、および120が、ネットワーク101を介して少なくとも1つのサーバ装置125に結合されている。ネットワーク101は、有線ネットワークおよび/または無線ネットワークを含むことができる様々な従来のネットワークトポロジおよびタイプのいずれをも表すことが意図されている。ネットワーク101はさらに、パブリックプロトコルおよび/または独自開発プロトコルを含めて、様々な従来のネットワークプロトコルのうちのいずれをも利用することができる。ネットワーク101は、例えばインターネット、ならびに場合によっては1つまたは複数のLAN(local area networkローカルエリアネットワーク)、WAN(wide area networkワイドエリアネットワーク)などの少なくとも一部分を含むことができる。
【0013】
クライアント装置105は、それだけには限定されないが、デスクトップPC(personal computerパーソナルコンピュータ)、ワークステーション、メインフレームコンピュータ、インターネットアプライアンス、およびゲーミングコンソール(gaming console)を含めて様々な従来のコンピューティングデバイスのうちのいずれも含むことができる。さらに、ネットワーク101に関連するクライアント装置は、有線リンクおよび/または無線リンクによってネットワーク101と情報をやりとりすることができるPDA(personal digital assistant携帯型個人情報端末)110、ラップトップコンピュータ115、およびセルラ電話120などを含むことができる。さらにまた、1つまたは複数のクライアント装置105、110、115、および120は、これら同じタイプのデバイス、または代わりの異なるタイプのデバイスを含むことができる。
【0014】
サーバ装置125は、コンピューティングデバイス105、110、115および120に対して、様々なデータおよび/または機能のうちのいずれも提供することができる。このデータは、パブリックに利用可能であり、あるいは代わりに制限されることもあり、例えばあるユーザだけに制限され、または適切な料金が支払われる場合にしか利用可能でないなどのこともある。
【0015】
サーバ装置125は、ネットワークサーバ、およびアプリケーションサーバ、またはその両者による組合せのうちの少なくとも1つである。サーバ装置125は、コンテンツのソースとなる任意のデバイスであり、クライアント装置105、110、115および120は、このようなコンテンツを受信する任意のデバイスを含んでいる。したがって、ピアツーピアネットワークにおいて、このコンテンツのソースとなるこのデバイスは、サーバ装置と呼ばれ、このコンテンツを受信するデバイスは、クライアント装置と呼ばれる。両方のタイプの装置は、本明細書中で説明される実施形態の例に従って、オペレーティングシステムおよびアプリケーションを含めて、ソフトウェアプログラムをロードし実行することが可能である。さらに、データおよび機能は、クライアント装置105、110、115および120の間で共有することができる。すなわち、サーバ装置125だけが、各クライアント装置に対するデータおよび/または機能のソースであるというわけではない。
【0016】
データソース130または135において、オペレーティングシステムおよびアプリケーションを含めてソフトウェアプログラムが、実行するためにサーバ装置125またはクライアント装置105、110、115、および120のうちのどれか1つのために作成され、かつ/またはそのどれか1つに対して提供される。一貫性をもたせるために、以下の説明では、当技術分野において知られているように、単独または組合せのいずれでも、少なくともソフトウェアプログラム、オペレーティングシステム、およびアプリケーションのどれかを包含する「アプリケーション」と呼ばれている。さらに、これらのアプリケーションは、データソース130からのものとしてオフラインで、または、データソース135からのものとしてオンラインで、サーバ装置125に対して配布される。さらにまた、これらのアプリケーションは、一般にサーバ装置125またはデータソース135からオンラインでクライアント装置105、110、115、および120に対して配布される。これらのオフラインによる配布のための手段および方法についても同様に知られている。
【0017】
以下で説明する様々な実施形態によれば、共に装置105、110、115、120、125における、またはそれらの中にあるデータおよび機能の少なくとも1つの配布は、トランザクションとして実装することができる。より詳細には、トランザクションは、図1の実施例のように、装置105、110、115、120、125のうちの1つの内部においてまたはネットワーク環境の中において、1つの原子的オペレーションとして同期してまたは非同期で実行されるオペレーションのグループである。このネットワーク上で実施されるトランザクション処理リモートファイルオペレーションの実施例について、図2〜図7とともに以下にさらに詳細に説明する。
【0018】
トランザクション処理リモートファイルオペレーション
図2は、図1におけるシステム100中の(例えば、デバイス105、110、115、120、125から選択される)2つのデバイスのコンポーネントを示している。これらは、トランザクション処理リモートファイルオペレーションのためのクライアント202およびサーバ204として動作する。この実施形態においては、クライアント202もサーバ204も共に、あるバージョンのMicrosoft(登録商標)Windows(登録商標)オペレーティングシステムを使用している。他の実施形態においては、異なるオペレーティングシステムを使用することができる。
【0019】
この実施形態においては、クライアント202は、アプリケーション212、I/O(input/output入出力)マネージャ214、ファイルシステム(FS)216、リダイレクタセレクタ(redirector selector)218、トランザクションマネージャ(TM)222、およびリダイレクタ(RDR)220を含んでいる。この実施形態において、サーバ204は、サーバコンポーネント(SRV)234、I/Oマネージャ214A、FS216AおよびTM222Aを含んでいる。この実施形態において、クライアント202およびサーバ204は、ネットワーク100(図1)を介して互いに情報をやりとりすることができる。一部の実施形態においては、これらのコンポーネントは、ソフトウェアにより実装される。
【0020】
この「Windows(登録商標)」の実施形態において、I/Oマネージャ214および214A、ならびにFS216および216Aは、NTFS(NT file systemNTファイルシステム)によって実装され、リダイレクタセレクタ218は、MUP(multiple UNC provider複数UNCプロバイダ)によって実装され、ここでUNCは、Uniform Naming Convention(汎用名前付け規則)の頭字語である。したがって、リダイレクタセレクタ218は、本明細書中においてMUP218とも呼ばれる。さらに、Microsoft(登録商標)Windows(登録商標)オペレーティングシステムのRDRおよびSRVが、(追加機能とともに)それぞれRDR220およびSRV234を実装する。このMicrosoft(登録商標)Windows(登録商標)オペレーティングシステムのRDRおよびSRVに対する追加機能の一例については、以下で説明する。さらにまた、この実施形態において、TM222およびTM222Aは、この実施形態の例においてはカーネルレベルトランザクションマネージャとして実装され、以下にさらに詳細に説明する。他の実施例においては、異なるI/Oマネージャ、ファイルシステム、リダイレクタセレクタ、TM、および/またはRDRを使用することもできる。
【0021】
図3は、クライアント202とサーバ204の間のトランザクション処理リモートファイルオペレーション(図2)についての実施例の処理フローを示している。図2および図3を参照すると、トランザクション処理リモートファイルオペレーションは、一実施形態によれば、以下のように実施される。
【0022】
ブロック302において、RDR220は、サーバ204中に存在するファイルに対するトランザクション処理ファイルオペレーションに対する要求を受信する。典型的なファイルオペレーションは、新しいファイルを作成する工程、ファイルを読み取る工程、ファイルを書き込む工程、ファイルをコピーする工程、ファイルの名前を変更する工程などを含んでいる。この実施形態においては、トランザクション処理ファイルオペレーションを求める要求は、アプリケーション212によって生成さる。このアプリケーションは、図2に示すようにユーザレベルのアプリケーションである。この要求は、トランザクションコンテキストについてのフィールドを含む構造を使用する。この要求は、I/Oマネージャ214によって受信され、このI/Oマネージャは、この要求がローカルファイルに対するものか、それともリモートファイルに対するものかを判定する。この実施形態においては、I/Oマネージャ214は、このMicrosoft(登録商標)Windows(登録商標)オペレーティングシステムの標準コンポーネントである。例えば、アプリケーション212は、(\\server\share\subdirectory\filenameの形式の)このUNCネームを用いて、I/Oマネージャ214への呼び出しを介して、この要求を行うことができる。次いでI/Oマネージャ214は、この要求をMUP218に渡す。トランザクションについては複数のハンドルが存在し、所与のファイルについては複数のトランザクションが存在することができる。他方、この要求がこのクライアント上のファイルに対するものである場合には、I/Oマネージャ214は、標準的な方法によって、この要求をNTFS216に渡すはずである。
【0023】
次いでMUP218は、この要求を実施するために必要とされるリダイレクタを見つける。このケースにおいては、このリダイレクタは、RDR220である。この実施形態において、MUP218は、このMicrosoft(登録商標)Windows(登録商標)オペレーティングシステムの標準コンポーネントである。この実施形態においては、RDR220は、このMicrosoft(登録商標)Windows(登録商標)オペレーティングシステムRDRの1つのバージョンであり、追加部分を用いることにより、このRDRは、TM222と対話してトランザクションを実施することができる。この追加部分は例えば、要求からトランザクション処理ファイルオペレーションについてのトランザクションコンテキストを検索し、トランザクション処理ファイルオペレーションについてのFCBを割り当て、ネットワーク上でトランザクションをリモートデバイスに送信し、(ファイル識別子およびバージョン識別子を含めて)これらのトランザクション処理ファイルオペレーションについての応答を受信し、TM222の指示の下にトランザクションオペレーションを実施し、RDR220がトランザクションの状態に関して通知され続けることができるようにするためにTM222とともにリソースマネージャとして積極的に参加する(エンリスト:enlist)機能を含んでいる。一部の実施形態においては、RDR220は、同時係属の同一出願人による「Transactional File System」という名称の2000年3月30日に出願の、米国特許出願第09/539,233号明細書および米国出願番号[整理番号第MS1−1781US]に説明されているように実装される。リソースマネージャとして積極的に参加すること(enlisting)については以下で説明する。RDR220は、このトランザクションをバッファリングするためのリソース、キャッシュマップ、FCB(file control blockファイル制御ブロック)、FOBX(file object extensionファイルオブジェクト拡張部分)、およびこのトランザクションおよび要求を処理するために必要な他の構造を含んでいる。
【0024】
ブロック304において、RDR220は、TM222からこのトランザクションを検索し、このトランザクションをサーバ204に送信するためにマーシャリングする。一実施形態においては、RDR220は、TM222によって表示される(その実施形態について以下で説明している)APIを呼び出すことによってこのトランザクションを検索し、トランザクションをサポートするように拡張されている1つのバージョンのSMBプロトコルを使用して送信するためにこのトランザクション情報(例えば、マーシャリングブロブ)をフォーマットすることによってこのトランザクションをマーシャリングする。例示の一実施形態のSMB拡張部分については、表1〜表3とともに以下で要約している。ブロック306において、RDR220は、矢印236で示すようにこのトランザクションおよびこの要求をサーバ204に対して送信する。ブロック308において、RDR220は、サーバ204からこのファイルオペレーションの結果を受信する。例えば、サーバ204は、前述のファイル識別子およびバージョン識別子を含むこの要求に対する応答を送信する。この実施形態においては、SRV234は、このMicrosoft(登録商標)Windows(登録商標)オペレーティングシステムSRVの1つのバージョンである。追加機能部分を用いることにより、このSRVは、トランザクション処理リモートファイルオペレーション中にファイル識別子およびバージョン識別子をクライアントに対して渡すことを含め、ネットワーク上でクライアントと対話してSMBに対する拡張部分を使用してトランザクションを実施することができる。
【0025】
【表1】

【0026】
【表2】

【0027】
【表3−1】

【0028】
【表3−2】

【0029】
【表4】

【0030】
【表5】

【0031】
【表6】

【0032】
【表7】

【0033】
図3Aは、一実施形態におけるブロック302(図3)をさらに詳細に示している。ブロック312において、RDR220は、この要求されたファイルオペレーションについてのトランザクションコンテキストを検索する。トランザクション処理リモートファイルをオープンする際に、RDR220は、トランザクションがこの要求にすでに関連づけられているかどうかを判定する。例えば、一実施形態において、トランザクションはそれをスレッド(thread)にアタッチすることによって要求に関連付けられるが、他の実施形態においては、異なる方法を使用してトランザクションを要求に関連づけることができる。一実施形態においては、RDR220は、この要求がそれに関連づけられたトランザクションハンドルを有するかどうかを確かめることによってこのオペレーションを実施する。関連づけられたトランザクションハンドルを有する場合には、この要求は、その既存のトランザクションに加え(join)られる。有していない場合には、RDR220は、非トランザクション処理要求に対する標準的な方法でこの要求を処理する。
【0034】
次いで、RDR220は、この要求にFCBを割り当てる。前述のように、複数の要求を有する複数のトランザクションが、所与のファイルをオープンすることもある。したがって、ブロック302(図3)の一実施形態においては、RDR220が既存のFCBをこの要求に対しても使用できるかどうかについて判定するブロック314が、実行される。この実施形態において、RDR220は、検査して、この要求のファイル(すなわち、パスネーム)およびこの要求を作るスレッドに関連付けられたこのトランザクションコンテキストが、既存のFCBのこれらとマッチングするかどうかを確認する。例えば、第2の要求の処理中に、この同じファイルの2つの書込みオペレーションが、同じトランザクション中で要求されたとする場合には、この第1の要求のために既にFCBが存在しているはずである。両方のオペレーションが共に書込みオペレーションであるので、この同じFCBを両者に対して使用することができる。
【0035】
ブロック314において、RDR220が、FCBが同じトランザクションコンテキストならびに同じファイル(すなわち、パスネーム)および同じバージョンと共に存在すると判定する場合には、ブロック316において、既存のFCBがこの要求に対して使用される。一部の実施形態において、RDR220は、最新バージョンを有するFCBを使用することになる。例えば、ファイルの読取りオペレーションがこの同じファイルのコミットされていない書込みオペレーションに続く場合、RDR220は、この書込みオペレーションが現在使用しているファイルのこのバージョンを使用することになる。このアプローチによって、キャッシングのさらに効率的な使用が可能になる。
【0036】
しかし、ブロック314において、この要求に対する既存のFCBを使用することができない場合には、ブロック318においてRDRは、この要求に対して新しいFCBを作成する。代替的な実施形態においては、新しいFCBが、要求ごとに作成される。
【0037】
図4は、この同じファイルに対するコミットされていない複数のトランザクション処理要求の一例を示している。図4に示すように、オペレーション401は、ファイルの読取りオペレーションを求める要求に対応する。すなわち、このファイルオペレーションは、「読取りのためにオープンする」オペレーションである。オペレーション401は、ハンドルH1と、このハンドルに関連付けられたトランザクションT1を有する。RDR220(図2)が要求するこのファイルのバージョンは、バージョンAとして示される。これがこのファイルに対しての最初のコミットされていないトランザクションであると想定すると、バージョンAが、サーバ204(図2)から読み出され、クライアント202(図2)中にキャッシュされる。
【0038】
後の時刻において、オペレーション402がこの同じファイルに対して要求される。この例においては、オペレーション402も読取りオペレーションであり、ハンドルH2およびトランザクションT2を有する。このトランザクションは、オペレーション401のトランザクションとは異なるので、RDR220は、この場合にもサーバ204からこのファイルのバージョンAが読み出される。
【0039】
この例においては、次いでオペレーション403が、オペレーション402と同じトランザクションにおいてこの同じファイルに対して要求される。したがって、オペレーション403はハンドルH3を有し、トランザクションT2に結合(join)される。しかし、この例においては、オペレーション403は書込みオペレーションであり、したがってRDR220は、このファイルのバージョンBをローカルに記憶している(例えば、キャッシュしている)。バージョンBは、時として「ダーティバージョン」と呼ばれることがある。
【0040】
次いでオペレーション404が、オペレーション402および403と同じトランザクションにおいて、この同じファイルに対して要求される。したがって、オペレーション404はハンドルH4を有し、これもまたトランザクションT2に結合される。この例においては、オペレーション404は読取りオペレーションである。この実施形態においては、ブロック314(図3A)の結果により、RDR220は、オペレーション404に対するバージョンBを記憶しており、おそらくはキャッシュしていることになる。
【0041】
次いで、オペレーション405が、異なるトランザクションにおいてこの同じファイルに対して要求される。したがって、オペレーション405はハンドルH5を有し、新しいトランザクションT3に関連付けられる。このトランザクションは、以前のオペレーションのトランザクションとは異なるので、一実施形態において、RDR220は、この場合にもこのファイルのバージョンAをサーバ204から読み出す。他の実施形態においては、RDR220はサーバ204(図2)を調べなくても、依然としてバージョンAが現行バージョンであることを認識しており、この「ローカル」バージョンAを使用する。例えば、この代替的な実施形態では、便宜的ロックを使用してサーバ204中に存在するこのファイルのどのようなより新しいバージョンについても知ることができるようになる。すなわち、RDR220は、サーバ204上のファイルに対する書込みを妨げることのない便宜的ロックを、このファイルに関連付けることができるが、サーバ204が、このロックが解除されたことをRDR220にシグナリングするようにする。このようなケースにおいては、次いでRDR220は、バージョンAはもはや最新のバージョンではないことを知るはずである。さらに他の実施形態においては、RDR220は、サーバ204に照会してこのファイルの最新バージョンを決定し、次いでこの最新のバージョンに関連付けられた既存のFCBを再使用することができる。
【0042】
次いで、オペレーション406において、トランザクションT2がコミット(commit)される。これは、サーバ204上でこのバージョンを変更する効果を有する。サーバ204上に記憶されたこの新しいバージョンは、バージョンCとして示される。前述したように、RDR220は、すべてのリモートトランザクション中にリソースマネージャとして積極的に参加(エンリスト)するので、RDR220は、サーバ204がこのファイルの新しいバージョンを有することを学習する。
【0043】
次いで、オペレーション401と同じトランザクションにおいてこの同じファイルに対して、オペレーション407が要求される。したがって、オペレーション407はハンドルH6を有し、トランザクションT1に結合される。しかし、RDR220はサーバ204上のこのファイルのバージョンCを知っているので、RDR220は、このオペレーションに対するバージョンCを記憶しており、おそらくキャッシュしている。一部の実施形態においては、RDR220は、サーバ204からバージョンCを読み出す。
【0044】
同様に、オペレーション405と同じトランザクションによってこの同じファイルに対して、オペレーション408が要求されるとき、オペレーション408はハンドルH7を有し、トランザクションT3に結合される。この場合にも、RDR220がサーバ204上のこのファイルのバージョンCについて知っているので、RDR220は、このオペレーションに対するバージョンCを記憶しており、おそらくキャッシュしている。
【0045】
図5は、一実施形態に従って、クライアント202(図2)からのキャッシュされたデータがどのようにしてサーバ204(図2)にフラッシュされるの(すなわち、永続的に記憶される)かを示している。図2および図5を参照すると、クライアント202は、一実施形態によれば、以下で説明するようにサーバ204にデータをフラッシュする。
【0046】
ブロック502において、このデータを生成するアプリケーションは、呼出しを行うか、あるいはこのトランザクションをコミットする要求を発行する。この呼出しまたは要求は、TM222に渡される。それに応答して、TM222は、(この実施例のトランザクションマネージャに関して以下で説明する)プリプリペア通知(Pre−prepare Notification)を生成する。
【0047】
この実施形態において、RDR220は、ブロック504に示すようにTM222からこのプリプリペア通知を受信する。それに応答してRDR220は、このネットワークを介してこのデータをSRV234に対してフラッシュする。SRV234は、次にこのデータをNTFS216Aに渡す。これらのオペレーションは、ブロック506によって示される。一部の実施形態においては、サーバ204のTM222Aは、いつこのプリプリペアオペレーションが完了するかについてRDR220にシグナリングする。ブロック504およびブロック506は、(実施例のトランザクションマネージャに関して以下で説明する)プリペア(Prepare)オペレーションが実施されるよりも前に、サーバ204上に書き込まれるべきクライアント202からのデータが、サーバ204上に存在していることを確実にする。
【0048】
ブロック508において、RDR220は、(実施例のトランザクションマネージャに関して以下で説明する)プリペア通知をTM222から受信する。一実施形態においては、RDR220は、このプリペア通知に応答してプリペア通知メッセージをサーバ204に送信し、このプリペア通知は、TM222Aに渡される。次にTM222Aは、このプリペア通知をNTFS216Aに渡す。これらのオペレーションは、ブロック510および512によって示される。このプリペア通知は、クライアント202およびサーバ204が、このデータをコミットするか、またはロールバックすることができるような方法で、このデータを記憶するようにする。一部の実施形態においては、サーバ204のTM222Aは、RDR220へ、いつこのプリペアオペレーションが完了するかをシグナリングする。次いで、このデータは、ブロック514で示すように、標準の2相コミットオペレーション(例えば、このトランザクションをコミットし、または、中止するオペレーション)を使用して処理される。
【0049】
以上では、トランザクションマネージメントは、別々のTMコンポーネント(すなわち、TM222およびTM222A)を使用して実施されるものとして説明しているが、他の実施形態においては、このトランザクションマネージメントインフラストラクチャは、このファイルシステムインフラストラクチャに一体化することができる。さらに、このような一体化された実施形態においては、これらのトランザクションメッセージ(例えば、以下で説明するようにプリプリペア(PrePrepare)、プリペア(Prepare)、コミット(Commit)、アボート(Abort)など)は、この伝送チャネル上をファイルメッセージと共に流れる。
【0050】
実施例のトランザクションマネージャ
図6は、一実施形態による、トランザクションを実施する際に使用されるコンポーネントを示している。特定のトランザクションを構成するオペレーションのグループは、少なくとも当業者には「原子性(atomicity)」、「一貫性(consistency)」、「隔離性(isolation)」、および「永続性(durability)」を含む頭字語「ACID」として知られている特性を、全体として有している。より詳細には、トランザクションの各オペレーションからもたらされるデータの更新は、すべて不変であるか、あるいはどれも不変でなく(原子性)、トランザクションは、基礎をなすデータを一貫した状態にし(一貫性)、トランザクション更新の効果は、全体のトランザクションが不変となるまでは他の同時に実行されるオペレーションから見えず(隔離性)、またトランザクションに対する結果が決定された後は、この結果は決して変化しないことが保証される(永続性)。
【0051】
図6のカーネルレベルのトランザクションマネージメントの実施例は、複数の装置に関与する分散トランザクションの実施例を対象としており、トランザクションに期待される「ACID」特性を保持している。さらに、図6の実施例は、カーネルオブジェクトを参照しているが、この実施例は、決してカーネルオブジェクトによって実装されるトランザクションだけに限定されるものではない。より詳細には、本明細書中で説明するトランザクションは、カーネルオブジェクト以外のオブジェクトによっても実装することができ、また異なるタイプのトランザクションマネージャによっても実装することができる。
【0052】
図6において、クライアントアプリケーション600に対応するトランザクションは、少なくとも第1のデバイス上のトランザクションマネージャ605、ならびに第2のデバイス上のクライアントアプリケーション600Bおよびトランザクションマネージャ635を利用している。クライアントアプリケーション600Bは、クライアントアプリケーション600に関連付けられている。互いに情報をやりとりするトランザクションマネージャ605および635は、全体のトランザクションおよびリソースについての状態情報を保持し、さらにクライアントアプリケーションと関連するRM(resource managerリソースマネージャ)の間で相互作用またはプロトコルを調整することができるカーネルオブジェクトの集合体とすることができる。
【0053】
図6の実施例におけるRM625およびRM630を含めてリソースマネージャは、データを永続的状態に記憶することができる少なくとも1つの基礎をなすリソースの状態を保持する。このようなリソースの非排他的な実施例は、データベースおよびメッセージキュー(message queue)を含んでいる。図6の実施形態の例の第1のデバイスにおいて、RM625はリソース627に対応し、RM630はリソース632に対応し、第2のデバイスにおいて、RM655はリソース657に対応する。
【0054】
図6に示すように、第1のデバイス上のトランザクションマネージャ605は、以下のカーネルオブジェクト:TX(transaction objectトランザクションオブジェクト)610、RMO(resource manager objectリソースマネージャオブジェクト)615、およびEN(enlistmet objectエンリストメントオブジェクト)620を含んでおり、第2のデバイス上のトランザクションマネージャ635は、以下のカーネルオブジェクト:TX640、RMO645、およびEN650を含んでいる。TXは特定のトランザクションを表し、このトランザクションに参加するプロセスによってオープンにすることができる。
【0055】
RMOは、特定のトランザクションに参加するリソースを表す。トランザクションへのRMOによる参加は、2相コミットメッセージを受信することを含んでいる。さらに、RMOは永続的であり、その結果、この対応するトランザクションマネージャは、どのトランザクションの結果が対応するRMに伝送されるかを知っている。代わりに、RMOが過渡的なこともあり、したがって、失敗を超えて永続的なRMOを管理することなく、クライアントアプリケーションがトランザクション通知のストリームに加入することができるようになる。
【0056】
ENは、トランザクションとリソースマネージャとの間の関係を表す。リソースマネージャは、EN上にエンリストメントを作成することによってENがトランザクションに参加することになることを示す。RMOが、特定のトランザクションに関して(PrepareやCommitなどの)オペレーションを実施するように要求されているときには、RMOは、ENを使用して参加を示す。リソースマネージャは、特定のトランザクションに関して複数のENを有することもできる。
【0057】
以下のように、カーネル環境に対して、トランザクションが正常にすべての適切なファイルをアップデートするようにするために実装される2相コミットプロトコルが、図6および図7の実施例を参照しながら説明される。特に、クライアントアプリケーション600が、第1のデバイス上のトランザクションマネージャ605に対応するカーネルオブジェクトをオープンし、SRV234(図2)が、第2のデバイス上のトランザクションマネージャ635に対応するカーネルオブジェクトをオープンした後に、「プリペア(prepare)」フェーズ700が開始され、705において、このトランザクション中の各RMには、対応するトランザクションマネージャからの「プリペア」命令が送信される。このように警告を受けて、710において、RMはリソースデータを永続的状態にすることによってプリペアを行い、その結果、各リソース中のこのデータは、「コミットされ」または「ロールバックされる」ことが可能になる。プリペアが行われると、715において、RMはこの対応するトランザクションマネージャのTXに対して確認メッセージを送信する。
【0058】
「コミット」フェーズ720は、このトランザクションが解決すると実施され、それによって725においてこのトランザクションマネージャのTXは、各関連付けられたRMに対して「コミットされ」または「アボート/ロールバックされた」トランザクション結果を送信する。次いで、RMは、この結果を関連付けられたログに記録し、この基礎となるリソースデータは、このトランザクション結果に従ってコミットされ、あるいはロールバックされる。代替的な実施形態においては、このトランザクションについてのデータが永続的でない揮発性のエンリストメントを可能とすることができ、したがってこのデータは、ログ記録もされず、また復元もされない。
【0059】
カーネルレベル上のトランザクションマネージメントは、それだけには限定されないが
Microsoft(登録商標)Win32(登録商標)アプリケーションプログラミングインターフェースおよびMicrosoft(登録商標)Windows(登録商標)オペレーティングシステムを含めてシステムアーキテクチャに適用可能なAPI(application program interfaceアプリケーションプログラムインターフェース)を利用することによって実装することができる。本明細書中で説明しているAPIは、ハンドルベースのインターフェースを介して表示され、「ハンドル」は、APIを対象とするオブジェクトを参照する。さらに、非同期式のオペレーションが明示的に要求されない限り、各カーネルオブジェクト上、特にTXおよびRMO上のオペレーションは、同期式である。さらにまた、トランザクションの異なる実施形態に対応するオペレーションは、本明細書中で説明している1つまたは複数のAPIの様々な組合せによって実装することができる。すなわち、一部の実施形態では、本明細書中で説明しているAPIのすべてを使用することができるが、他の実施形態では、それらの様々な組合せを使用することができる。
【0060】
TXカーネルオブジェクト上でオペレーションを実装するAPI、およびこのAPIの機能の対応する記述が、以下に提供される(この関連するルーチンのさらに詳細な記述も、以下にさらに提供される)。
【0061】
・PreprepareEnlistment:「フェーズ0」の処理としても知られており、TXがすべての関連するRMに対してプリプリペアメッセージを送信することを要求する。
【0062】
・PrepareEnlistment:TXがすべてのエンリストされたRMに対してプリペア要求を送信することを要求する。
【0063】
・CreateTransaction:新しいTXをオープンする。
【0064】
・OpenTransaction:既存のTXをオープンする。
【0065】
・CommitTransaction:TXがコミットされることを要求する。
【0066】
・RollbackTransaction:TXがこのトランザクションをアボートまたはロールバックすることを要求する。
【0067】
・SavepointTransaction:TXがこのトランザクションの状態を保存することを要求する。
【0068】
・GetTransactionInfo:このTXについての情報を検索する。
【0069】
・SetTransactionInfo:このTXについての情報を設定する。
【0070】
RMOカーネルオブジェクト上でオペレーションを実装するために利用されるAPI、およびこのAPIの機能の対応する記述が、以下に提供される(この関連するルーチンのさらに詳細な記述も、以下にさらに提供される)。
【0071】
CreateResourceManager:リソースを表す新しいRMOを作成する。
【0072】
OpenResourceManager:既存のRMOをオープンする。
【0073】
DestroyResourceManager:RMOを破壊し、したがってRMOを非永続的なものにする。
【0074】
GetResourceManagerInfo:RMOについての情報を検索する。
【0075】
SetResourceManagerInfo:RMOについての情報を設定する。
【0076】
CreateEnlistment:RMOをトランザクションに参加させ、関連した通知を検索する。
【0077】
GetNotificationResourceManager:使用可能なRM通知を照会し戻す。
【0078】
トランザクションに参加した後、RMOカーネルオブジェクトによってTXカーネルオブジェクト上でオペレーションを実装するために利用されるAPI、およびこのAPIの機能の対応する記述が、以下に提供される(この関連するルーチンのさらに詳細な記述も、以下にさらに提供される)。
【0079】
・PrePrepareComplete:対応するトランザクションマネージャが要求するときに、RMがプリプリペアを完了していることを示す。
【0080】
・PrepareComplete:対応するトランザクションマネージャが要求するときに、RMがトランザクションのプリペアを完了していることを示す。
【0081】
・RollbackComplete:対応するトランザクションマネージャが要求するときに、RMが実行されたトランザクション作業のロールバックを完了していることを示す。
【0082】
・CommitComplete:対応するトランザクションマネージャが要求するときに、RMがトランザクション作業のコミットを完了していることを示す。
【0083】
残念ながら、トランザクションマネージメントを実装するために利用されるTX、RMO、およびENに関連するAPIは、様々なセキュリティ攻撃に対して1つまたは複数のカーネルオブジェクトをさらすこともある。例えば、悪意のあるまたは不正なRMが、トランザクション中にそれ自体をエンリストしてファンクション呼出しに決して応答しないことによってサービス拒否攻撃を引き起こし、あるいは、代わりにトランザクションアボートを強制することができる。したがって、図6をまた参照すると、さらなる例示の実施例は、安全なカーネルレベルの分散トランザクションを対象としている。
【0084】
図6の実施形態の一例はさらに、各カーネルオブジェクトの少なくとも1つに対してACL(access control listアクセスコントロールリスト)を含むことができるセキュリティデスクリプタ(security descriptor)を適用することにより、ぜい弱なカーネルオブジェクトに対するセキュリティソリューションを提供する。
【0085】
第1のデバイスにおいては、ACL660はTX610に適用され、ACL665はRMO615に適用され、ACL670はEN620に適用される。第2のデバイスにおいては、ACL675はTX640に適用され、ACL680はRMO645に適用され、ACL685はEN650に適用される。
【0086】
ACLは、特定のユーザまたはユーザグループが特定のオブジェクト上で行使することを許可または拒否される「権利(right)」を定義する。より詳細には、図8の実施例ACL810に示すように、カーネルオブジェクトに適用またはアタッチされるACLは、対応するSID(security identifierセキュリティ識別子)および対応する1組の権利を含む少なくともACE(access control entryアクセス制御エントリ)を含んでいる。図8のACEエントリ1〜12は、それぞれ対応するSID1〜12、および対応するRIGHT1〜12を含んでいる。
【0087】
SID1〜12は、このACLが適用されるカーネルオブジェクト上でオペレーション、または一連のオペレーションを実装しようと試みることができるユーザまたはユーザグループを識別する。RIGHT1〜12は、このSIDによって識別されるユーザまたはユーザグループがこの各カーネルオブジェクト上で実施することができるオペレーションまたは一連のオペレーションを指定し、さらにこの識別されたユーザまたはユーザグループへのこのようなオペレーションまたは複数のオペレーションのアクセス可能性を指定する。すなわち、RIGHT1〜12は、識別されたユーザまたはユーザグループが、指定されたオペレーションを実施することが許可されること、あるいは、この指定されたユーザまたはユーザグループが、指定されたオペレーションを実施することが禁止されることを示すことができる。
【0088】
以下は、TXに対して適用されるACLにおいてRIGHT1〜12が指定することができるオペレーションの例のリストであり、このオペレーションの機能の記述が後に続いている。RIGHT1〜12はさらに、この対応するSIDによって識別されるユーザまたはユーザグループに対してTX上でこのオペレーションが許可または拒否されることを指定する。
【0089】
・TRANSACTION_QUERY_INFORMATION:TXについての情報を獲得する。
【0090】
・TRANSACTION_SET_INFORMATION:TXについての情報を設定する。
【0091】
・TRANSACTION_ENLIST:このトランザクション中のTX上にエンリストする。
【0092】
・TRANSACTION_COMMIT:TXに関連するすべてのデータアップデートを永続的にする。
【0093】
・TRANSACTION_ROLLBACK:TX上でこのオペレーションをアボート、すなわちロールバックする。
【0094】
・TRANSACTION_PROPAGATE:TXから別のオブジェクトへとデータを伝送する。
【0095】
・TRANSACTION_SAVEPOINT:このトランザクションの最新ポイントを保存する。
【0096】
・TRANSACTION_MARSHAL:このトランザクションに関するデータを別のデバイスへと伝送する。
【0097】
以下は、RMOに対して適用されるACLにおいてRIGHT1〜12が指定することができるオペレーションの例のリストであり、このオペレーションの機能の記述が後に続いている。RIGHT1〜12はさらに、この対応するSIDによって識別されるユーザまたはユーザグループに対してRMO上でこのオペレーションが許可または拒否されることを指定する。
【0098】
・RESOURCEMANAGER_QUERY_INFORMATION:RMOについての情報を獲得する。
【0099】
・RESOURCEMANAGER_SET_INFORMATION:RMOについての情報を設定する。
【0100】
・RESOURCEMANAGER_RECOVER:トランザクションの失敗の瞬間におけるトランザクションの状態を決定する。
【0101】
・RESOURCEMANAGER_ENLIST:トランザクションにおいてRMOをエンリストする。
【0102】
・RESOURCEMANAGER_GET_NOTIFICATION:トランザクションマネージャからのトランザクションの解決に応じて通知を受信する。
【0103】
・RESOURCEMANAGER_REGISTER_PROTOCOL:このトランザクションにおいてRMOがサポートするプロトコルを登録する。
【0104】
・RESOURCEMANAGER_COMPLETE_PROPAGATION:トランザクションの解決に従ってリソースを設定する。
【0105】
以下は、ENに対して適用されるACLにおいてRIGHT1〜12が指定することができるオペレーションの例のリストであり、このオペレーションの機能の記述が後に続いている。RIGHT1〜12はさらに、この対応するSIDによって識別されるユーザまたはユーザグループに対してEN上でこのオペレーションが許可または拒否されることを指定する。
【0106】
・ENLISTMENT_QUERY_INFORMATION:ENについての情報を獲得する。
【0107】
・ENLISTMENT_SET_INFORMATION:ENについての情報を設定する。
【0108】
・ENLISTMENT_RECOVER:トランザクションの失敗の瞬間におけるエンリストメントの状態を決定する。
【0109】
・ENLISTMENT_REFERENCE:エンリストメントキーを取得し、参照(または逆参照)する。
【0110】
・ENLISTMENT_SUBORDINATE_RIGHTS:このトランザクションをロールバックし、通知に応答する。
【0111】
・ENLISTMENT_SUPERIOR_RIGHTS:トランザクション中でプリプリペアオペレーション、プリペアオペレーション、または上位ロールバックオペレーションを開始するなど、上位トランザクションマネージャが実施するはずのオペレーションを実施する。
【0112】
したがって、各カーネルオブジェクトTX、RMO、およびENはそれぞれそれに適用されるACLを有することができる。このように、APIがこれらのカーネルオブジェクトのそれぞれ1つの上にあるオペレーションを開始しようと試みるときに、このAPIが起源とするユーザまたはユーザグループに対して、このオペレーションが許可または拒否されるかどうかを判定して、このACLに従う必要がある。
【0113】
より詳細には、オペレーションを実施するためのハンドルがオープンされるとき、このAPIに対応するユーザまたはユーザグループはこのACL中のSIDに対して検査され、許可されたオペレーションのリストが生成され、このAPIによって指定されるこのオペレーションは所与のハンドル上のこのSIDに対して許可されたオペレーションに対して検査される。
【0114】
カーネルオブジェクトの間のトランザクションマネージメントをセキュリティ保護し、セキュリティパラメータを強要する代替的な実施形態は、このMicrosoft(登録商標)Windows(登録商標)オペレーティングシステム用のセキュリティモデルによるトランザクションに参加することができるカーネルオブジェクトにセキュリティデスクリプタを適用する工程を含んでいる。
【0115】
上述のように、これらのAPIは、ハンドルベースのインターフェースとして表示され、このインターフェースを利用してこのセキュリティモデルを実装する。以上でリストアップしたTXカーネルオブジェクト上でオペレーションを実装するこれらのAPIのより詳細な記述が、以下に含まれている。これらの記述は、このルーチン、対応する引数、およびリターン値の記述を含んでいる。
【0116】
PreprepareEnlistment
(IN PHANDLE TransactionHandle;
IN PHANDLE ResourceManagerHandle)。
【0117】
・このルーチンは、すべての関連するRMに対してプリプリペア要求(Pre−Prepare request)を発行することによってトランザクションが「プリプリペアされる」ことを要求する。プリプリペアは、このトランザクションが、下流のRMがもはや変更を受け入れることができないというプリペア状態(Prepared state)に入る以前に、キャッシュに似た特性を有するRMにそのキャッシュを、可能であれば他のRMに対してフラッシュする機会を許可する。
【0118】
・このルーチンが呼び出されず、トランザクション参加者がフェーズ0の処理を要求している場合、プリペア(Prepare)が受信されるときに要求されるように、プリプリペア要求が発行される。しかし、PreprepareEnlistmentが存在しない場合には、キャッシュに似たRMを含む一部の構成では、分散シナリオにおいて、不必要なトランザクションロールバックが引き起こされることもある。
【0119】
・引数:
TransactionHandle:プリプリペアすべきトランザクションを示すハンドルを与える。
【0120】
ResourceManagerHandle:このトランザクションをプリプリペアしている上位−TM/CRMに対してハンドルを与える。この上位−TM/CRMだけが、このトランザクション上でPrepareEnlistment、SuperiorCommitTransaction、およびSuperiorRollbackTransactionを呼び出すことが可能になる。
【0121】
・リターン値:
【0122】
【表8】

【0123】
PrepareEnlistment
(IN PHANDLE TransactionHandle、
IN PHANDLE ResourceManagerHandle);
・このルーチンは、すべてのその関連付けられたResourceManagerに対してプリペア要求(Prepare request)を発行することによって、トランザクションが「プリペアされる」ことを要求する。この要求は、2相コミットプロトコルを開始する。
【0124】
・PrepareEnlistmentを発行するトランザクション参加者は、トランザクションオブジェクトをシステムまたはアプリケーションがクラッシュしても生き残ることになる永続的状態にする。このような参加者は、どのようなタイプの失敗の後にもこのトランザクション上でリカバリ(recovery)を実施して、結果を送付する。この要件を満たすのに失敗すると、リソースのリーク、ならびに矛盾したトランザクションの結果がもたらされることもある。
【0125】
・引数:
TransactionHandle:プリペアすべきトランザクションについてのハンドルを与える。
【0126】
ResourceManagerHandle:このトランザクションをプリペアしているTMに対して、ハンドルを与える。このトランザクションが(PreprepareEnlistmentに対するコールを介して)プリプリペアされている場合には、ResourceManagerHandleは、PreprepareEnlistmentに対する呼出し中で使用された上位−TM/CRMとマッチングする。さらに、このAPIをコールする上位−TM/CRMだけが、このトランザクション上でSuperiorCommittransactionおよびSuperiorRollbackTransactionを呼び出すことが許可されることになる。
【0127】
・リターン値:
【0128】
【表9】

【0129】
CreateTransaction
(OUT PHANDLE TransactionHandle、
IN ULONG DesiredAccess
OPTIONAL;
IN POBJECT_ATTRIBUTES ObjectAttributes
OPTIONAL;
IN ULONG CreateOptions
OPTIONAL;
IN PHANDLE ResourceManagerHandle
OPTIONAL;
IN NOTIFICATION_MASK NotificationMask
OPTIONAL;
IN LPVOID TransactionKey
OPTIONAL)。
【0130】
・このルーチンは、新しいトランザクションオブジェクトを作成し、この新しいオブジェクトにハンドルを戻す。
【0131】
・代わりに(ResourceManagerHandleパラメータが指定される場合)、このルーチンは、それが正常に作成された後に、このトランザクション上で「ジョイン(Join)」オペレーションを実施する。
【0132】
クライアントは、CloseHandleAPIを使用してこのトランザクションハンドルをクローズする。この最後のトランザクションハンドルが、いずれかがこのトランザクション上でCommitTransactionを呼び出すことなくクローズする場合には、このトランザクションは、暗黙的にロールバックされる。
【0133】
・引数:
TransactionHandle:この新しいトランザクションに対するハンドルを受信することになるロケーションにポインタを与える。
【0134】
DesiredAccess:この所望のアクセスレベルを指定するマスクを与える。この有効なアクセスマスクの選択肢には、以下のものがある。:
SYNCHRONIZE このハンドル上で同期オペレーションを実施することができる。
【0135】
TRANSACTION_COMMIT このハンドルを使用してトランザクションをコミットすることができる。
【0136】
TRANSACTION_PREPARE このハンドルを使用してトランザクションをコミットすることができる。
【0137】
TRANSACTION_ROLLBACK このハンドルを使用してトランザクションをアボートすることができる。
【0138】
TRANSACTION_SAVEPOINT このハンドルを使用してこのトランザクションについてのセーブポイントを作成することができる。
【0139】
TRANSACTION_JOIN このハンドルを使用してこのトランザクションをRMとして加えることができる。
【0140】
TRANSACTION_READ_ATTRIBUTES トランザクションに関連する属性を読み取ることができる。
【0141】
TRANSACTION_WRITE_ATTRIBUTES トランザクションに関連する属性を書き込むことができる。
【0142】
ObjectAttributes:オプションのオブジェクト属性構造に、ポインタを与える。
【0143】
CreateOptions オプションのトランザクションフラグを与える。有効な作成フラグ選択肢は以下を含んでいる。
【0144】
TRANSACTION_CREATE_PRESUMED_NOTHING 「何も想定しない(presumed nothing)」トランザクションを作成する。
【0145】
ResourceManagerHandle:指定されたトランザクションについての通知を受信するResourceManagerにハンドルを与える。
【0146】
NotificationMask:このResourceManagerがこのトランザクションに関して受信したい通知を指定する。
【0147】
TransactionKey:このRMがこのトランザクションについての任意の通知とともに受信をしたい不明瞭なポインタ値を指定する。このRMは、このポインタ値を使用して通知をこのRMのアドレス空間中のあるオブジェクトに関連づけることができ、それによって通知が行われるたびにルックアップを実行する必要をなくすることができる。
【0148】
・リターン値:
【0149】
【表10】

【0150】
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);
・このルーチンは、既存のトランザクションオブジェクトを調べ、ハンドルをこのトランザクションに戻す。この呼出し元は、ObjectAttributesのObjectNameフィールド中においてGUIDのストリング表現を指定する。
【0151】
・代わりに(このResourceManagerHandleパラメータが指定される場合)、このルーチンはまた、それがオープンされた後にこのトランザクション上で「ジョイン」オペレーションを実施する。
【0152】
・クライアントは、CloseHandleAPIを使用してこのトランザクションハンドルをクローズする。この最後のトランザクションハンドルが、どれかがこのトランザクション上でCommitTransactionをコールすることなくクローズする場合には、このトランザクションは、暗黙的にロールバックされたトランザクションである。
【0153】
・引数:
TransactionHandle:このオープンオペレーションが成功する場合に、このトランザクションに対するハンドルを受信することになるロケーションにポインタを与える。
【0154】
DesiredAccess:この所望のアクセスレベルを指定するマスクを与える。
【0155】
ObjectAttributes:オプションのオブジェクト属性構造にポインタを与える。
【0156】
ResourceManagerHandle:この指定されたトランザクションについての通知を受信するResourceManagerにハンドルを与える。
【0157】
NotificationMask:このResourceManagerがこのトランザクションに関して受信することができる通知を指定する。
【0158】
TransactionKey:このRMがこのトランザクションについての任意の通知とともに受信したい不明瞭なポインタ値をオプション的に指定する。このRMは、このポインタ値を使用して通知をこのRMのアドレス空間中のあるオブジェクトに関連づけることができ、それによって通知が行われるたびにルックアップを実行する必要をなくすることができる。
【0159】
・リターン値:
【0160】
【表11】

【0161】
CommitTransaction
(IN PHANDLE TransactionHandle
IN ULONG CommitOptions Optional);
・このルーチンは、TransactionHandleに関連するこのトランザクションがコミットされることを要求する。オープンまたは作成されている任意のトランザクションハンドルは、Transaction_Commit Desired Accessを用いてコミットすることができる。トランザクションの作成者だけがそれをコミットすることが可能であることを提示する制約は、存在していないからである。
【0162】
・問題のトランザクションが、以前にPrepareEnlistment要求を発行していない場合に、2相コミットプロトコルは、すべてのエンリストされたRM上で開始することができる。この呼出しは、このクライアントによって発行されている1相コミット要求と考えることができる。
【0163】
・このトランザクションが以前にPrepareEnlistmentを介してプリペアされている場合には、このルーティング(routing)は、呼び出されない。PrepareEnlistmentを呼び出したRMだけが、このルーチンSuperiorCommitTransactionを使用して、このトランザクション状態を解決することができる。
【0164】
・引数:
TransactionHandle:コミットすべきトランザクションを示すハンドルを与える。
【0165】
CommitOptions:COMMIT_RETAININGトランザクションがコミットされることになる。
【0166】
・リターン値:
【0167】
【表12】

【0168】
RollbackTransaction
(IN PHANDLE TransactionHandle、
IN SAVEPOINT SavePoint Optional、
IN ROLLBACK_REASON RollbackReason Optional);
・このルーチンは、TransactionHandleに関連するこのトランザクションをロールバックすることを要求する。このオプションのSavePointが指定され、有効なセーブポイントである場合、このロールバックは、部分的なロールバックでもよい。NULLのSavePoint引数は、このトランザクションが完全にロールバックまたはアボートされるべきことを示す。オプションのRollbackReason構造を与えることができる。これは、トランザクションオブジェクト中に保持されることになり、GetInformationTransactionに対する呼出しを介して関心のあるトランザクション参加者は検索することができる。
【0169】
・引数:
TransactionHandle:ロールバックすべきトランザクションを示すハンドルを与える。
【0170】
SavePoint:どこまでトランザクションの状態をロールバックすべきかを示すSavePointネームを与える。
【0171】
RollbackReason:ロールバックリーズン(rollback reason)を与える。
【0172】
・リターン値:
【0173】
【表13】

【0174】
SavePointTransaction
(IN PHANDLE TransactionHandle、
IN ULONG SavePointFlags Optional、
OUT LPSAVEPOINT SavePoint);
・このルーチンは、「セーブポイント」がTransactionHandleに関連付けられたトランザクションについて生成されることを要求する。このセーブポイントは、後続のロールバック要求に対するターゲットとして使用される。
【0175】
・引数:
TransactionHandle:セーブポイントを確立すべき対象のトランザクションを示すハンドルを与える。
【0176】
SavePointFlags:このセーブポイントの生成に影響を及ぼす1組のフラグをオプション的に与える。
【0177】
SavePoint:セーブポイント識別子が記憶されるロケーションにポインタを与える。
【0178】
・リターン値:
【0179】
【表14】

【0180】
QueryInformationTransaction
(IN HANDLE TransactionHandle、
IN TRANSACTION_INFORMATION_CLASS
TransactionInformationClass、
OUT PVOID
TransactionInformation、
IN ULONG
TransactionInformationLength、
OUT PULONG ReturnLength Optional);
・このルーチンは、TransactionHandleによって表されるトランザクションオブジェクトについての要求された情報を戻す。
【0181】
・引数:
TransactionHandle:情報が要求されているトランザクションを示すハンドルを与える。
【0182】
TransactionInformationClass:このトランザクションオブジェクトについてのどのクラスの情報が要求されているかを示す。
【0183】
TransactionInformation:要求されているこのトランザクション情報が記憶されるバッファに対してポインタを与える。
【0184】
TransactionInformationLength:TransactionInformationによってポイントされるバッファの長さを示す。
【0185】
ReturnLength:このTransactionInformationバッファに書き込まれる情報の長さを受信することになるロケーションにポインタを与える。
【0186】
・リターン値:
【0187】
【表15】

【0188】
SetInformationTransaction
(IN HANDLE TransactionHandle、
IN TRANSACTION_INFORMATION_CLASS
TransactionInformationClass、 IN PVOID
TransactionInformation、
IN ULONG
TransactionInformationLength);
・このルーチンはTransactionHandleによって表されるこのトランザクションオブジェクトについてこの要求された情報を設定する。
【0189】
・引数:
TransactionHandle:どの情報が修正されることになるかをこのトランザクションに示すハンドルを与える。
【0190】
TransactionInformationClass:このトランザクションオブジェクトについてのどのクラスの情報が要求されているかを示す。
【0191】
TransactionInformation:要求されるこのトランザクション情報が記憶されるバッファにポインタを与える。
【0192】
TransactionInformationLength:TransactionInformationによってポイントされるバッファの長さを示す。
【0193】
ReturnLength:このTransactionInformationバッファに書き込まれる情報の長さを受信することになるロケーションにポインタを与える。
【0194】
・リターン値:
【0195】
【表16】

【0196】
以下は、以上でリストアップした、RMOカーネルオブジェクト上でオペレーションを実装するAPIのより詳細な記述を含んでいる。これらの記述は、このルーチン、対応する引数、およびリターン値の記述を含んでいる。
【0197】
CreateResourceMnager
(OUT PHANDLE ResourceManagerHandle、
IN ACCESS_MASK DesiredAccess
Optional、
IN POBJECT_ATTRIBUTES ObjectAttributes、
IN ULONG CreateOptions
Optional、
IN RM_NOTIFICATION_ROUTINE NotificationRoutine
Optional);
・このルーチンは、リソースを表す新しいResourceManagerオブジェクトを作成する。
【0198】
・ResourceManagerオブジェクトは、このRMが参加したという、トランザクションに関するTM通知についてのエンドポイントとしての役割も果たす。RMは、GetNotificationResourceManagerを呼び出すことによってこれらの通知を要求する。
【0199】
・ResourceManagerは、通常は永続的なオブジェクトであり、すなわちこのオブジェクトは、(システムまたはRMの)あらゆる失敗の後に再オープンされ、リカバリを実施する必要がある。ResourceManagerオブジェクトの過渡的なバージョンは、このオプションRESOURCEMANAGER_NO_RECOVERYを指定することによって作成することができる。過渡的なRMは、リカバリを実施するように義務づけられておらず、また許可されてもいない。このリカバリ不可能なRMオプションにより、この十分複雑なログ記録をとるプリペアを実装する必要なしに、またリカバリを実施することもなしに、アプリケーションまたはRMはトランザクションの進行(例えば、PREPREPARE、PREPARE、COMMIT)についての通知を受信できるようになる。
【0200】
・引数:
ResourceManagerHandle:この新しいResourceManagerに対するハンドルを受信することになるロケーションにポインタを与える。
【0201】
DesiredAccess:所望のアクセスレベルを指定するマスクを与える。有効なアクセスマスクの選択肢を以下に示す。:
SYNCHRONIZE:ハンドル上でオペレーションを同期させる。
【0202】
RESOURCE MANAGER_DESTROY:このリソースマネージャを破壊する。
【0203】
RESOURCE MANAGER_READ_ATTRIBUTES:リソースマネージャに関連する属性を読み取る。
【0204】
RESOURCE MANAGER_WRITE_ATTRIBUTES:リソースマネージャに関連する属性を書き込む。
【0205】
ObjectAttributes:この新しいRMオブジェクトについての属性を指定する。この属性は、RMネームを含んでいる。
【0206】
CreateOptions:この作成されたオブジェクトについてのオプションを指定する。
【0207】
RESOUCEMANAGER_NO_RECOVERY:ResourceManagerオブジェクトは、非永続的であり、リカバリを実施しない。
【0208】
RESOUCEMANAGER_COMMUNICATION:ResourceManagerは、他のコンピュータに対してどのように通信を行うかを知っている。ResourceManagerを使用してトランザクションをマーシャリングまたはアンマーシャリングする(unmarshall)ことができる。
【0209】
RESOURCEMANAGER_CLUSTER_RECOVERY:ResourceManagerは、失敗している可能性のあるファイルをログ記録した結果をどのようにして読み取り、このクラスタ中の他のノードに送付するべきかを知っている。ResourceManagerを使用してクラスタ中のトランザクションをリカバリすることができる。
【0210】
NotificationRoutine:通知がこのResourceManagerにとって使用可能であるときに呼び出すべき通知ルーチンを指定する。
【0211】
・リターン値:
【0212】
【表17】

【0213】
OpenResourceManager
(OUT PHANDLE ResourceManagerHandle、
IN ACCESS_MASK DesiredAccess
Optional、
IN POBJECT_ATTRIBUTES ObjectAttributes、
IN ULONG OpenOptions
Optional、
IN RM_NOTIFICATION_ROUTINE NotificationRoutine、
Optional)。
【0214】
・このルーチンは、名前によって既存のResourceManagerオブジェクトをオープンする。ターゲットのResourceManagerオブジェクトが永続的であるが、現在オープンされていない場合、このオブジェクトは最初に「リカバリする」状態にあり、リカバリされる必要がある。リカバリが完了した後に、RecoveryCompleteResourceManagerを呼び出す必要がある。
【0215】
・引数:
ResourceManagerHandle:既存のResourceManagerオブジェクトに対するハンドルを受信することになるロケーションにポインタを与える。
【0216】
DesiredAccess:このオブジェクトに対する所望のアクセスを指定するマスクを与える。
【0217】
ObjectAttributes:この新しいRMオブジェクトについての属性を指定する。
【0218】
OpenOptions:このオブジェクトについてのオプションを指定する。有効なオプションは、以下を含んでいる。
【0219】
RESOURCE_MANAGER_DETAILED_RECOVERY_NOTIFICATIONS:このリソースマネージャは、通常のリカバリ通知の代わりに、(通信エンドポイントについての追加の情報を伴う)詳細なリカバリ通知を受信する。
【0220】
NotificationRoutine:通知が、このResourceManagerにとって使用可能であるときに、呼び出されることになる通知ルーチンを指定する。
【0221】
・リターン値:
【0222】
【表18】

【0223】
DestroyResourceManager
(IN PHANDLE ResourceManagerHandle);
・このルーチンは、ResourceManagerオブジェクトを破壊し、それがもはや永続的でないようにする。
【0224】
・引数:
ResourceManagerHandle:破壊すべきResourceManagerオブジェクトを指示するハンドルを与える。
【0225】
・リターン値:
【0226】
【表19】

【0227】
QueryInformationResourceManager
(IN HANDLE ResourceManagerHandle、
IN RESOURCEMANAGER_INFORMATION_CLASS
ResourceManagerInformationClass、
OUT PVOID ResourceManagerInformation、
IN ULONG
ResourceManagerInformationLength、
OUT PULONG ReturnLength Optional)。
【0228】
・このルーチンは、ResourceManagerHandleによって表されるRMOについてのこの要求された情報を戻す。
【0229】
・引数:
ResourceManagerHandle:情報が要求されているこのResourceManagerを示すハンドルを与える。
【0230】
ResourceManagerInformationClass:このResourceManagerオブジェクトについてのどのクラスの情報が要求されているかを示す。
【0231】
ResourceManagerInformation:要求されるこのResourceManager情報が記憶されることになるバッファにポインタを与える。
【0232】
ResourceManagerInformationLength:ResourceManagerInformationによってポイントされるバッファの長さを示す。
【0233】
ReturnLength:ResourceManagerInformationバッファに書き込まれる情報の長さを受信するロケーションにポインタを与える。
【0234】
・リターン値:
【0235】
【表20】

【0236】
SetInformationResourceManager
(IN HANDLE ResourceManagerHandle、
IN RESOURCEMANAGER_INFORMATION_CLASS
ResourceManagerInformationClass、
IN PVOID ResourceManagerInformation、
IN ULONG ResourceManagerInformationLength);
・このルーチンはResourceManagerHandleによって表されるRMOについてのこの要求された情報を設定する。
【0237】
・引数:
ResourceManagerHandle:情報が修正されているこのResourceManagerを示すハンドルを与える。
【0238】
ResourceManagerInformationClass:このResourceManagerオブジェクトについてのどのクラスの情報が要求されているかを示す。
【0239】
ResourceManagerInformation:要求されるこのResourceManager情報が記憶されるバッファにポインタを与える。
【0240】
ResourceManagerInformationLength:ResourceManagerInformationによってポイントされるバッファの長さを示す。
【0241】
・リターン値:
【0242】
【表21】

【0243】
CreateEnlistment
(IN PHANDLE ResourceManagerHandle、
IN PHANDLE TransactionHandle、
IN NOTIFICATION_MASK NotificationMask、
IN LPVOID TransactionKey Optional);
・このルーチンは、RMOを特定のトランザクションに結合(joint)させ、それに関連した通知を受信する。
【0244】
・このCreateEnlistment呼出しは、べき等(idempotent)であり、RMはこのルーチンを複数回呼び出して、そのNotificationMaskまたはTransactionKeyを変更することができる。CreateEnlistmentに対する後続の呼出しは、このトランザクション上で新しいエンリストメントを作成せずに通知マスクおよびトランザクションキーを置換する。
【0245】
・NotificationMaskを使用して通知が複数回受信されることを要求することができる。例えば、PREPREPARE通知を受信するRMは、JoinTransactionを呼び出し、PREPREPAREフラグを指定することによって別の通知を要求することができる。したがって、RMは、複数のPREPREPARE要求を受信することができる。このような要求は拒絶されることもあり、このトランザクションが、この要求された通知が受信されているはずのポイントを以前に進んでいる場合には、これは望ましいこともある。例えば、あるRMが既にPAREに通知されているときに、PREPREPAREを要求することは認められない。
【0246】
・引数:
ResourceManagerHandle:RMにハンドルを供給してこの指定されたトランザクションについての通知を受信する。
【0247】
TransactionHandle:このRMが参加することを望むトランザクションに対してハンドルを与える。
【0248】
NotificationMask:RMがこのトランザクションに関して受信したいと思う通知を指定する。有効なマスクは、以下のようになっており、これらは一緒にORをとることもできる。
【0249】
TRANSACTION_NOTIFY_MASK_RM:RM(PREPARE、COMMIT、ROLLBACK、SAVEPOINT)が望む一般の通知。
【0250】
TRANSACTION_NOTIFY_MASK_CRM:CRMまたは上位TM(PrePrepare_Complete、PrepareComplete、CommitComplete、RollbackComplete、SavebackComplete)が望む一般の通知。
【0251】
TRANSACTION_NOTIFY_PREPREPARE:PrePrepareに対する通知。
【0252】
TRANSACTION_NOTIFY_PREPARE:PREPAREに対する通知。
【0253】
TRANSACTION_NOTIFY_COMMIT:COMMITに対する通知。
【0254】
TRANSACTION_NOTIFY_ROLLBACK:ROLLBACKに対する通知。
【0255】
TRANSACTION_NOTIFY_PREPREPARE_COMPLETE:PREPREPAREが完了しているという通知。
【0256】
TRANSACTION_NOTIFY_PREPARE_COMPLETE:PREPAREが完了しているという通知。
【0257】
TRANSACTION_NOTIFY_COMMIT_COMPLETE:COMMITが完了しているという通知。
【0258】
TRANSACTION_NOTIFY_ROLLBACK_COMPLETE:ROLLBACKが完了しているという通知。
【0259】
TRANSACTION_NOTIFY_SAVEPOINT_COMPLETE:SAVEPOINTが完了しているという通知。
【0260】
TransactionKey:RMがこのトランザクションについての任意の通知とともに受信したいと思う不明瞭なポインタ値を指定する。このRMは、このポインタ値を使用して通知をこのRMアドレス空間中のあるオブジェクトに関連づけ、それによって通知が行われるたびにルックアップを実施する必要をなくすることができる。
【0261】
・リターン値:
【0262】
【表22】

【0263】
GetNotificationResourceManager
(IN PHANDLE ResourceManagerHandle、
IN PTRANSACTION_NOTIFICATION TransactionNotification、
IN PLARGE_INTEGER Timeout Optional);
・どれかが使用可能な場合、このルーチンは、RM通知を照会し、戻す。
【0264】
・引数:
ResourceManagerHandle:通知を戻す対象のResourceManagerを示すハンドルを与える。
【0265】
TransactionNotification:この第1の使用可能な通知で満たすべきTRANSACTION_NOTIFICATION構造にポインタを与える。
【0266】
Timeout:使用可能になる通知を待ちながら、それ以降、呼出し側はブロックしたいと考える時刻を与える。このタイムアウトが満了するときに何も使用可能でない場合には、この呼出し側は、STATUS_TIMEOUTと共に戻る。
【0267】
・リターン値:
【0268】
【表23】

【0269】
以上でリストアップした、トランザクションに参加した後にRMOカーネルオブジェクトによってTXカーネル上でオペレーションを実装するこれらのAPIのより詳細な記述が、以下に含まれている。この記述は、このルーチン、対応する引数、およびリターン値を含んでいる。
【0270】
PrePrepareComplete
(IN PHANDLE EnlistmentHandle);
・このルーチンは、このKTMが要求するときに、RMがトランザクションのプリプリペア処理(別名「フェーズ0」)を完了していることを示す。
【0271】
・引数:
TransactionHandle:このプリプリペアオペレーションが完了しているトランザクションを示すハンドルを与える。
【0272】
・リターン値:
【0273】
【表24】

【0274】
PrepareComplete
(IN PHANDLE EnlistmentHandle);
・このルーチンは、KTMが要求するときに、このRMがトランザクションのプリペアを完了していることを示す。
【0275】
・引数:
TransactionHandle:このプリペアオペレーションが完了しているトランザクションを示すハンドルを与える。
【0276】
・リターン値:
【0277】
【表25】

【0278】
RollbackComplete
(IN PHANDLE EnlistmentHandle);
・このルーチンは、要求されたように、RMがトランザクションによって実施される作業のロールバックを正常に完了していることを示す。RMが、要求されたようにこのトランザクションを正常にロールバックすることができない場合には、RMは、RollbackTransactionを介して完全なロールバックを求める要求を発行すべきである。
【0279】
・引数:
TransactionHandle:このロールバックオペレーションが完了しているトランザクションを示すハンドルを与える。
【0280】
・リターン値:
【0281】
【表26】

【0282】
CommitComplete
(IN PHANDLE EnlistmentHandle);
・このルーチンは、要求されたように、RMが、トランザクションによって実施される作業のコミットを完了していることを示す。
【0283】
・引数:
TransactionHandle:このコミットオペレーションが完了しているトランザクションを示すハンドルを与える。
【0284】
・リターン値:
【0285】
【表27】

【0286】
さらに、伝搬ルーチン(propagation routine)をこのカーネルオブジェクトについて提供することができる。このようなルーチンの実施例を以下に示す。
【0287】
RegisterProtocolAddressInformation
(IN HANDLE ResourceManager、
IN PROTOCOL_ID ProtocolId、
IN ULONG ProtocolInformationSize、
IN PVOID ProtocolInformation Optional)。
【0288】
・このルーチンは、リソースマネージャを特定のプロトコルに対する通信リソースマネージャとして登録する。このルーチンはまた、情報のブロブをこのプロトコルに関連づける。ただ1つのリソースマネージャしか、所与のマシン上のあるプロトコルに対して登録をすることができない。
【0289】
・引数:
ResourceManager:登録中のリソースマネージャにハンドルを与える。
【0290】
ProtocolId:このプロトコルを識別するGUID。
【0291】
ProtocolInformationSize:ProtocolInformationのサイズ。
【0292】
ProtocolInformation:このプロトコルに関連するオプションのブロブ。
【0293】
・リターン値:
【0294】
【表28】

【0295】
MarshallTransaction
(IN PHANDLE TransactionHandle、
IN ULONG NumberOfProtocols、
IN PPROTOCOL_ID ProtocolArray、
IN ULONG BufferLength、
IN PVOID Buffer、
OUT PULONG BufferUsed Optional)。
【0296】
・このルーチンは、TransactionHandleに対応するこのトランザクションの表現がバッファ中に直列に配列されることを要求する。
【0297】
・引数:
TransactionHandle:このコミットオペレーションが完了しているトランザクションを示すハンドルを与える。
【0298】
NumberOfProtocols:このプロトコルアレイのサイズを示す。
【0299】
ProtocolArray:このトランザクションをマーシャリングするために使用することができるプロトコルを指定するPROTOCOL_ID(GUID)のアレイ。このアレイは、プリファランス(preference)によって順序づけすべきである(このアレイ中の第1のプロトコルは、優先のプロトコルであり、第2のプロトコルは、第2最優先のプロトコルであるなど)。
【0300】
BufferLength:使用可能なバッファの長さを与える。
【0301】
Buffer:このトランザクションの直列配列を記憶すべきバッファにポインタを与える。
【0302】
BufferUsed:バッファ中に書き込まれる実際のバイトを記憶すべきロケーションにポインタを与える。
【0303】
・リターン値:
【0304】
【表29】

【0305】
GetProtocolAddressInformation
(IN ULONG AddressBufferSize、
OUT PVOID AddressBuffer、
OUT PULONG AddressBufferUsed Optional)。
【0306】
・このルーチンは、このマシン上ですべての登録済みのプロトコルを表現する情報が、AddressBuffer中で、直列に配列されることを要求する。次いでこの情報を別のマシンに渡し、これをPushTransactionに対する引数として使用してAddressInformationが生成されるマシンに対してトランザクションを転送(push)することができる。
【0307】
・引数:
AddressBufferSize:使用可能なバッファの長さを与える。
【0308】
AddressBuffer:使用可能なバッファの長さを与える。
【0309】
AddressBufferUsed:このトランザクションの直列配列が記憶されるバッファのロケーションにポインタを与える。
【0310】
・リターン値:
【0311】
【表30】

【0312】
PullTransaction
(OUT PHANDLE TransactionHandle、
IN ULONG NumberOfProtocols、
IN PCRM_PROTOCOL_ID ProtocolArray、
IN ULONG BufferLength、
IN PVOID Buffer)。
【0313】
・このルーチンは、バッファ中の直列配列によって表現されるトランザクションが、トランザクションマネージャにより使用可能になることを要求する。このトランザクションが、登録済みのリソースマネージャのうちの1つによって正常に伝搬された後に、この新しいトランザクションオブジェクトに対するハンドルが戻される。
【0314】
・引数:
TransactionHandle:この新しいトランザクションを表すハンドルが記憶されるべきところにポインタを与える。
【0315】
NumberOfProtocols:このプロトコルアレイのサイズを示す。
【0316】
ProtocolArray:このトランザクションをマーシャリングするために使用することができるプロトコルを指定するPROTOCOL_ID(GUID)のアレイ。このアレイは、プリファランスによって順序づけすべきである(このアレイ中の第1のプロトコルは、優先のプロトコルであり、第2のプロトコルは、第2最優先のプロトコルであるなど)。
【0317】
BufferLength:使用可能なバッファの長さを与える。
【0318】
Buffer:このトランザクションの直列配列が記憶されるバッファにポインタを与える。
【0319】
・リターン値:
【0320】
【表31】

【0321】
PushTransaction
(IN HANDLE TransactionHandle、
IN ULONG NumberOfProtocols、
IN PCRM_PROTOCOL_ID ProtocolArray、
IN ULONG DestinationInfoLength、
IN PVOID DestinationInfo、
IN ULONG ResponseBufferLength、
OUT PVOID ResponseBuffer、
OUT PULONG ResponseBufferUsed Optional、
OUT PULONG PushCookie Optional)。
【0322】
・このルーチンは、このトランザクションが、プッシュスタイルの伝搬を使用して宛先マシンに伝搬されることを要求する。プロトコルは、ProtocolArray中にリストされる順序で、成功するまで使用されることになる。この宛先マシンへ伝搬する際にどのプロトコルでもうまくいかない場合には、このルーチンはfailureを戻すことになる。
【0323】
・引数:
TransactionHandle:このリモートマシンに伝搬すべきこのトランザクションオブジェクトにポインタを与える。
【0324】
DestinationInfoLength:使用可能なDestinationInfoLengthの長さを与える。
【0325】
DestinationInfo:この宛先についての「エンドポイント」情報が記憶されるバッファに対してポインタを与える。これは、この宛先マシン上のGetProtocolAddressInformationに対する呼出から受信される出力とすることができる。
【0326】
ResponseBufferLength:使用可能なResponseBufferの長さを与える。
【0327】
ResponseBuffer:このトランザクションの直列配列が記憶されるバッファにポインタを与える。
【0328】
PushCookie:このプッシュ要求を表すクッキーが記憶されることになるバッファにポインタを与える。
【0329】
・リターン値:
【0330】
【表32】

【0331】
GetPushTransactionBuffer
(IN HANDLE TransactionHandle、
IN ULONG PushCookie、
IN ULONG ResponseBufferLength、
OUT PVOID ResponseBuffer、
OUT PULONG ResponseBufferUsed Optional)。
【0332】
・PushTransactionに対する初期呼出しが、STATUS_BUFFER_TOO_SMALLリターンコードを受信した場合に、この呼出しを使用してPushTransactionに対する呼出しの出力を検索する。この場合には、呼出し側は、GetPushTransactionBufferをコールし、十分なバッファサイズで渡すことになる。
【0333】
・引数:
TransactionHandle:この新しいトランザクションを表すハンドルが記憶されるロケーションにポインタを与える。
【0334】
BufferLength:使用可能なバッファの長さを与える。
【0335】
Buffer:このトランザクションの直列配列が記憶されるバッファにポインタを与える。
【0336】
・リターン値:
【0337】
【表33】

【0338】
PropagationComplete
(IN HANDLE EnlistmentHandle、
IN ULONG RequestCookie、
IN ULONG BufferLength、
IN PVOID Buffer)。
【0339】
・トランザクションの伝搬を正常に完了した後に、このルーチンは、CRMによって呼出される。
【0340】
・引数:
TransactionHandle:この新しいトランザクションを表すハンドルを記憶すべきロケーションにポインタを与える。
【0341】
RequestCookie:どの要求が完了しているかを示すために、この元のPROPAGATE通知の引数中で受信されたこのRequestCookieを与える。
【0342】
BufferLength:使用可能なこのバッファの長さを与える。
【0343】
Buffer:このトランザクションの直列配列が記憶されるバッファにポインタを与える。
【0344】
・リターン値:
【0345】
【表34】

【0346】
PropagationFailed
(IN HANDLE ResourceManagerHandle、
IN ULONG RequestCookie、
IN STATUS PropStatus)。
【0347】
・CRMは、このルーチンを使用して要求されたときにこのトランザクションを伝搬することに失敗していることを示す。
【0348】
・引数:
TransactionHandle:この新しいトランザクションを表すハンドルを記憶すべきロケーションにポインタを与える。
【0349】
BufferLength:使用可能なこのバッファの長さを与える。
【0350】
Buffer:このトランザクションの直列配列が記憶されるバッファにポインタを与える。
【0351】
・リターン値:
【0352】
【表35】

【0353】
実施例のコンピューティング環境
図9は、一般的なコンピュータ環境900を示しており、このコンピュータ環境を使用して本明細書中で説明している技術を実装することができる。このコンピュータ環境900は、コンピューティング環境の一実施例にすぎず、コンピュータおよびネットワークアーキテクチャの利用範囲あるいは機能について、どのような限定も示唆するものではない。また、このコンピュータ環境900は、この実施例のコンピュータ環境900において示されたコンポーネントのうちのどの1つまたは組合せに関してもどのような依存性または要件を有するものとも解釈すべきではない。
【0354】
コンピュータ環境900は、コンピュータ902の形態の汎用コンピューティングデバイスを含んでいる。コンピュータ902のコンポーネントは、それだけには限定されないが、1つまたは複数のプロセッサまたは処理装置904と、システムメモリ906と、プロセッサ904を含めて様々なシステムコンポーネントをシステムメモリ906に結合するシステムバス908とを含むことが可能である。
【0355】
システムバス908は、メモリバスまたはメモリコントローラ、周辺バス、アクセラレーティドグラフィックスポート(accelerated graphics port)、および様々なバスアーキテクチャのうちのどれかを使用したプロセッサバスまたはローカルバスを含めて、いくつかのタイプのバス構造のうちの1つまたは複数のいずれかを表す。実施例として、このようなアーキテクチャは、ISAバス、MCAバス、EISA(Enhanced ISA拡張ISA)バス、VESA(Video Electronics Standard Associationビデオエレクトロニクス規格協会)ローカルバス、メザニンバスとしても知られているPCIバス、PCIエクスプレス(Express)バス、USB、SD(Secure Digitalセキュアデジタル)バス、またはIEEE1394バス、すなわちファイヤワイヤ(FireWire)を含んでいる。
【0356】
コンピュータ902は、様々なコンピュータ読取り可能媒体を含むこともできる。このような媒体は、コンピュータ902によってアクセス可能な任意の入手可能な媒体とすることが可能であり、揮発性媒体も不揮発性媒体も、着脱可能媒体も着脱不能媒体も含んでいる。
【0357】
システムメモリ906は、RAM(random access memoryランダムアクセスメモリ)910などの揮発性メモリ、および/またはROM(read only memory読取り専用メモリ)912やフラッシュRAMなどの不揮発性メモリの形態のコンピュータ読取り可能媒体を含んでいる。起動中などにコンピュータ902内の要素間で情報を転送する助けをする基本ルーチンを含むBIOS(Basic input/output system基本入出力システム)914は、ROM912またはフラッシュRAMに記憶される。RAM910は、一般に処理装置904によって直ちにアクセス可能な、かつ/または現在操作されているデータおよび/またはプログラムモジュールを含んでいる。
【0358】
コンピュータ902は、他の着脱可能/着脱不能の揮発性/不揮発性のコンピュータストレージ媒体を含むこともできる。実施例として、図9は、着脱不能の不揮発性の磁気媒体(図示せず)から読み取りそれに書き込むためのハードディスクドライブ916、着脱可能な不揮発性の磁気ディスク920(例えば、「フロッピー(登録商標)ディスク」)から読み取りそれに書き込むための磁気ディスクドライブ918、およびCD−ROM、DVD−ROM、他の光媒体など着脱可能な不揮発性の光ディスク924から読み取りまたはそれに書き込みあるいはその両方を行うための光ディスクドライブ922を示している。ハードディスクドライブ916、磁気ディスクドライブ918、および光ディスクドライブ922は、それぞれ1つまたは複数のデータ媒体インターフェース925によってシステムバス908に接続されている。代わりに、ハードディスクドライブ916、磁気ディスクドライブ918、および光ディスクドライブ922は、1つまたは複数のインターフェース(図示せず)によってシステムバス908に接続することもできる。
【0359】
これらのディスクドライブおよびこれらの関連するコンピュータ読取り可能媒体は、コンピュータ902用のコンピュータ読取り可能命令、データ構造、プログラムモジュール、および他のデータの不揮発性ストレージを提供する。この実施例では、ハードディスク916、着脱可能磁気ディスク920、および着脱可能光ディスク924が示されているが、磁気カセットまたは他の磁気ストレージデバイス、フラッシュメモリカード、CD−ROM、DVD(digital versatile diskデジタル多用途ディスク)または他の光ストレージ、ランダムアクセスメモリ(RAM)、読取り専用メモリ(ROM)、EEPROM(electrically erasable programmable read−only memory電気的消去可能プログラム可能読取り専用メモリ)など、コンピュータによってアクセス可能なデータを記憶することができる他のタイプのコンピュータ読取り可能媒体を利用してこの実施例のコンピューティングシステムおよびコンピューティング環境を実装することもできることが理解されよう。
【0360】
実施例としてオペレーティングシステム926、1つまたは複数のアプリケーションプログラム928、他のプログラムモジュール930、およびプログラムデータ932を含めて、任意数のプログラムモジュールをハードディスク916、磁気ディスク920、光ディスク924、ROM912、および/またはRAM910に記憶することができる。このようなオペレーティングシステム926、1つまたは複数のアプリケーションプログラム928、他のプログラムモジュール930、およびプログラムデータ932(またはそれらの何らかの組合せ)のそれぞれは、前述の実施形態の例に従ってトランザクションを実行して、分散ファイルシステムをサポートする存在するコンポーネントのすべてまたは一部分を実装することができる。
【0361】
ユーザは、キーボード934やポインティングデバイス936(例えば、「マウス」)などの入力デバイスを介してコマンドおよび情報をコンピュータ902に入力することができる。他の入力デバイス938(詳細には示さず)は、マイクロフォン、ジョイスティック、ゲームパッド、サテライトディッシュ、シリアルポート、および/またはスキャナなどを含むことができる。これらおよび他の入力デバイスは、システムバス908に結合された入出力インターフェース940を介して処理装置904に接続されるが、パラレルポート、ゲームポート、ユニバーサルシリアルバス(USB)など他のインターフェースおよびバス構造によって接続することもできる。
【0362】
モニタ942または他のタイプのディスプレイデバイスも、ビデオアダプタ944などのインターフェースを介してシステムバス908に接続することができる。モニタ942に加えて、他の出力周辺デバイスには、I/Oインターフェース940を介してコンピュータ902に接続することができるスピーカ(図示せず)やプリンタ946などのコンポーネントも含めることが可能である。
【0363】
コンピュータ902は、リモートコンピューティングデバイス948など1台または複数台のリモートコンピュータに対する論理接続を使用してネットワーク環境で動作することが可能である。実施例として、リモートコンピューティングデバイス948は、PC、ポータブルコンピュータ、サーバ、ルータ、ネットワークコンピュータ、ピアデバイス、または他の共通ネットワークノードなどとすることが可能である。リモートコンピューティングデバイス948は、コンピュータ902に対して本明細書中で説明しているエレメントおよび特徴の多くまたはすべてを含むことができるポータブルコンピュータとして示されている。代わりに、コンピュータ902は、非ネットワーク環境でも同様に動作することができる。
【0364】
コンピュータ902とリモートコンピュータ948の間の論理接続は、ローカルエリアネットワーク(LAN)950および一般的なワイドエリアネットワーク(WAN)952として示されている。このようなネットワーキング環境はオフィス、企業規模のコンピュータネットワーク、イントラネット、およびインターネットにおいて一般的なものである。
【0365】
LANネットワーキング環境中で実装されるとき、コンピュータ902は、ネットワークインターフェースまたはネットワークアダプタ954を介してローカルネットワーク950に接続される。WANネットワーキング環境中で実装されるときには、コンピュータ902は、一般にワイドネットワーク952上で通信を確立するためのモデム956または他の手段を含んでいる。コンピュータ902に内蔵または外付けにすることができるモデム956は、I/Oインターフェース940または他の適切なメカニズムを介してシステムバス908に接続することができる。ここに示すネットワーク接続は実施例であり、コンピュータ902と948との間で少なくとも1つの通信リンクを確立する他の手段を使用することもできる。
【0366】
コンピューティング環境900と共に示すネットワーク環境などのネットワーク環境において、コンピュータ902に関連して示すプログラムモジュールまたはその一部分は、リモートメモリストレージデバイスに記憶することができる。実施例として、リモートアプリケーションプログラム958は、リモートコンピュータ948のメモリデバイス上に存在する。例示のために、アプリケーションまたはプログラム、およびこのオペレーティングシステムなど他の実行可能なプログラムコンポーネントは、本明細書中では個別のブロックとして示されているが、かかるプログラムおよびコンポーネントは、コンピューティングデバイス902の異なるストレージコンポーネント中にいろいろな時刻に存在し、このコンピュータの少なくとも1つのデータプロセッサによって実行されることが理解されよう。
【0367】
様々なモジュールおよび技法は、1台または複数台のコンピュータまたは他のデバイスによって実行される、プログラムモジュールなどのコンピュータ実行可能命令の一般的な状況において本明細書中において説明することができる。一般に、プログラムモジュールは、特定のタスクを実施し、または特定の抽象データ型を実装するルーチン、プログラム、オブジェクト、コンポーネント、データ構造などを含んでいる。これらのプログラムモジュールなどは、仮想マシンや他のジャストインタイムコンパイル実行環境などの中で、ネイティブコード(native code)として実行し、またはダウンロードし実行することができる。一般に、プログラムモジュールの機能は、様々な実施形態において必要に応じて組み合わせ、または分散させることができる。
【0368】
これらのモジュールおよび技法の実装は、コンピュータ読取り可能媒体の何らかの形態上に記憶し、またはその形態に渡って伝送することができる。コンピュータ読取り可能媒体は、コンピュータによりアクセスすることが可能な任意の使用可能な媒体とすることが可能である。実施例として、限定するものではないが、コンピュータ読取り可能媒体は、「コンピュータストレージ媒体」と「通信媒体」を含むことができる。
【0369】
「コンピュータストレージ媒体」は、コンピュータ読取り可能命令、データ構造、プログラムモジュール、または他のデータなどの情報の記憶のための任意の方法または技術により実装される揮発性および不揮発性の、着脱可能および着脱不能の媒体を含んでいる。コンピュータストレージ媒体は、それだけには限定されないが、RAM、ROM、EEPROM、フラッシュメモリもしくは他のメモリ技術、CD−ROM、デジタル多用途ディスク(DVD)もしくは他の光ストレージ、磁気カセット、磁気テープ、磁気ディスクストレージ、もしくは他の磁気ストレージデバイス、または所望の情報を記憶するために使用することができコンピュータによりアクセスすることが可能な他の任意の媒体を、含んでいる。
【0370】
「通信媒体」は一般に、搬送波や他の搬送メカニズムなどの被変調データ信号の形で、コンピュータ読取り可能命令、データ構造、プログラムモジュール、または他のデータを実施する。通信媒体は、任意の情報配信媒体も含んでいる。用語「被変調データ信号」は、信号中の情報を符号化するようにしてその信号中の1つまたは複数のその特性が設定あるいは変更された信号を意味する。非限定的な実施例にすぎないが、通信媒体には、有線ネットワークや直接配線接続などの有線媒体、並びに、音響、RF、赤外線、他の無線媒体などの無線媒体が含まれる。以上のうちの任意の組合せもまた、コンピュータ読取り可能媒体の範囲内に含まれる。
【0371】
本明細書全体を通して、「一実施形態(one embodiment)」、「一実施形態(an embodiment)」または「実施形態の一例(an example embodiment)」と言及しているが、これらは、説明している特定の機能、構成、または特徴が本発明の少なくとも一実施形態中に含まれることを意味する。したがって、このようなフレーズの使用によって、ただ1つの実施形態を超えたものについて言及することができる。さらに、この説明される機能、構成、または特徴は、1つまたは複数の実施形態において適切な任意の方法で組み合わせることができる。
【0372】
しかし、本発明は、1つまたは複数の特定の細部によらなくても、あるいは、他の方法、リソース、材料などを用いても実行することができることは当業者に理解されるだろう。他の事例においては、本発明の態様を単にあいまいにしてしまうことがないように、よく知られている構成、リソース、またはオペレーションを詳細に示さず、または説明していない。
【0373】
本発明の実施形態の例および用途について例示し説明してきたが、本発明は上述の正確な構成およびリソースに限定されるものでないことを理解されたい。本明細書中に開示している本発明の方法およびシステムの構成、オペレーション、および細部において、請求している本発明の範囲を逸脱することなく、当業者にとって明らかな様々な修正、変更、および変形を行うことができる。
【産業上の利用可能性】
【0374】
本発明は、一般的にネットワーク通信に関し、より詳細には、ネットワーク上のトランザクション処理ファイルオペレーションに利用できる。

【特許請求の範囲】
【請求項1】
トランザクション処理ファイルオペレーションに対する要求を受信するステップと、
対応するファイルがローカルデバイスまたは前記ローカルデバイスに結合されたリモートデバイスにあるかどうかを決定するステップと、
前記ファイルオペレーションに対応するトランザクションを検索するステップと、
前記トランザクションをマーシャリングするステップと、
前記ファイルが前記リモートデバイス上にある場合に、前記マーシャリングされたトランザクションを前記要求と共にネットワーク上でリモートデバイスへ送信するステップと、
前記ローカルデバイス上で他の方法では利用できなかった前記トランザクション処理ファイルオペレーションから生じる情報を、前記リモートデバイスから受信するステップと
を備えるオペレーションを実行するコンピュータ実行可能命令を有することを特徴とするコンピュータ読取り可能記憶媒体。
【請求項2】
前記リモートデバイスから受信される前記情報は、ファイル識別子(Fid)およびバージョン識別子を含むことを特徴とする請求項1に記載のコンピュータ読取り可能記憶媒体。
【請求項3】
トランザクション処理ファイルオペレーションに対する要求を受信する前記ステップは、
前記要求が前記リモートデバイス上のファイルオペレーションに対するものである場合に、前記要求に対する名前を提供するステップと、
前記ファイルに関連付けられた前記Fidおよび前記バージョン識別子情報を含む、前記ファイルに関連付けられたファイル制御ブロック(FCB)を選択的に作成するステップと
をさらに含むことを特徴とする請求項2に記載のコンピュータ読取り可能記憶媒体。
【請求項4】
FCBを選択的に作成する前記ステップは、既存のFCBを前記要求に対して使用することができるかどうかを判定するステップをさらに含むことを特徴とする請求項3に記載のコンピュータ読取り可能記憶媒体。
【請求項5】
既存のFCBを前記要求について使用することができるかどうかを判定する前記ステップは、前記既存のFCBがコミットされていないトランザクションに関連付けられているかどうかを判定するステップをさらに含むことを特徴とする請求項4に記載のコンピュータ読取り可能記憶媒体。
【請求項6】
第1のコンピューティングプラットフォーム中に存在するトランザクションマネージャから、プリプリペア通知を受信するステップと、
前記第1のコンピューティングプラットフォームから第2のコンピューティングプラットフォームへファイルオペレーションデータを提供するステップと、
前記第1のコンピューティングプラットフォーム中に存在する前記トランザクションマネージャから、プリペア通知を受信するステップと、
前記ネットワ−クを介して、前記第2のコンピューティングプラットフォームへ、トランザクション処理ファイル情報が前記第1のコンピューティングプラットフォームのために得られるのを可能とするのに効果的な前記プリペア通知を含むメッセージを提供するステップと
を備えることを特徴とする方法。
【請求項7】
第2のコンピューティングプラットフォームにおいて、トランザクションに関連付けられたプリプリペア通知を第1のコンピューティングプラットフォームから受信するステップと、
前記第2のコンピュータプラットフォーム中にあるトランザクションマネージャに対して、前記プリプリペア通知を提供するステップと、
前記第2のコンピューティングプラットフォームにおいて、前記トランザクションに関連付けられたファイルオペレーションデータを前記第1のコンピューティングプラットフォームから受信するステップと、
前記第2のコンピューティングプラットフォーム中に存在するファイルシステムに対して、前記ファイルオペレーションデータを提供するステップと、
前記第1のコンピューティングプラットフォームから、プリペア通知を受信するステップと、
前記第2のコンピューティングプラットフォーム中に存在する前記トランザクションマネージャに、トランザクション処理ファイル情報が前記第1のコンピューティングプラットフォームのために得られるのを可能とするのに効果的な前記プリペア通知を提供するステップと
を備えることを特徴とする方法。
【請求項8】
前記プリペア通知は、前記ファイルオペレーションデータがコミットされまたはロールバックされるのを可能とする方法で、前記第2のコンピューティングプラットフォームに、前記ファイルオペレーションデータをストアさせること特徴とする請求項7に記載の方法。
【請求項9】
前記プリプリペア通知は、前記第2のコンピューティングプラットフォームに、前記トランザクションに関連付けられた前記第2のコンピューティングプラットフォームの任意のキャッシュへフラッシュさせること特徴とする請求項7に記載の方法。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図3A】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate

【図9】
image rotate


【公開番号】特開2011−134351(P2011−134351A)
【公開日】平成23年7月7日(2011.7.7)
【国際特許分類】
【出願番号】特願2011−63055(P2011−63055)
【出願日】平成23年3月22日(2011.3.22)
【分割の表示】特願2006−536567(P2006−536567)の分割
【原出願日】平成16年7月22日(2004.7.22)
【出願人】(500046438)マイクロソフト コーポレーション (3,165)
【Fターム(参考)】