(57)【特許請求の範囲】
【請求項１】
分散トランザクション対応キーバリューストアを実装するシステムであって、
データログファイルの集合を保存する１つまたは複数の記憶装置に通信可能に各々連結されるノードの集合を備え、各データログファイルが１つのキー名前空間のためのキーバリューペアを含み、
各ノードがそのノードに固有のトランザクションログファイルを用いて前記データログファイルの集合の中のキーバリューペアを変更または取得するトランザクションを実行するように構成され、前記トランザクションログファイルが前記トランザクションの状態情報を含み、
前記トランザクションが、各トランザクションの原子性および耐久性が確保されるように実行される、システム。
【請求項２】
各ノードに固有の前記トランザクションログファイルがそのノードのローカル記憶装置に保存される、請求項１に記載のシステム。
【請求項３】
各ノードに固有の前記トランザクションログファイルが、各トランザクションがそのノードによって開始されたか、コミットされたか、または中断されたかを示す、請求項１に記載のシステム。
【請求項４】
各ノードに固有の前記トランザクションログファイルは、そのノードにより読出し可能および書込み可能であるが、前記ノードの集合の中の他のノードは読出しかできない、請求項１に記載のシステム。
【請求項５】
各ノードは、各トランザクションのノード単位スナップショット分離性がさらに確保されるように前記トランザクションを実行するように構成される、請求項１に記載のシステム。
【請求項６】
各ノードがさらに、検索式および目標とするキー名前空間を含む検索操作に応答して前記データログファイルの集合を検索するように構成され、当該検索することが、
前記目標とするキー名前空間のためのキーバリューペアを含むデータログファイルを前記データログファイルの集合の中から特定し、
前記検索式を満たすキーバリューペアに関する前記データログファイルを検索する
ことを含む、請求項１に記載のシステム。
【請求項７】
各ノードが、前記データログファイルの集合の中の１つまたは複数のキーバリューペアを変更するトランザクションを、
データログスナップショットを決定し、
１つまたは複数のキーバリューサブセットを決定する
ことによって実行するように構成され、
前記データログスナップショットは、前記ノードが前記トランザクションのためにアクセスする１つまたは複数のデータログファイルを前記データログファイルの集合の中から特定するものであり、前記データログスナップショットが、前記１つまたは複数のデータログファイルについてバージョン番号およびサイズを含み、
各キーバリューサブセットは、前記ノードが前記トランザクションのために変更しようとする、前記１つまたは複数のデータログファイルのうちの関連するデータログファイルからのキーバリューペアを含む、請求項１に記載のシステム。
【請求項８】
前記ノードが、さらに、
前記トランザクションのためのトランザクション識別子を決定し、
前記トランザクション識別子を含み且つ前記変更されたトランザクションが開始されたことを示す第一のトランザクションログエントリを前記ノードに固有の前記トランザクションログファイルに書き込み、
前記１つまたは複数のキーバリューサブセットの中の各キーバリューサブセットについて、１つまたは複数のデータログエントリを前記キーバリューサブセットに関連付けられたデータログファイルに付加するように試みる
ことによって前記トランザクションを実行するように構成され、
各データログエントリが、前記キーバリューサブセットに関連付けられたデータログファイルにおけるキーバリューペアへの変更を特定する、請求項７に記載のシステム。
【請求項９】
前記１つまたは複数のデータログエントリを前記キーバリューサブセットに関連付けられたデータログファイルに付加するように試みることが、
前記キーバリューサブセットに関連付けられたデータログファイルの前記バージョン番号を前記データログスナップショットから取得し、
前記バージョン番号を入力パラメータとして取得する付加操作を起動する
ことを含み、
前記バージョン番号が前記キーバリューサブセットに関連付けられたデータログファイルの現在のバージョン番号と一致すれば前記付加操作は成功し、
前記バージョン番号が前記現在のバージョン番号と一致しなければ前記付加操作は失敗する、請求項８に記載のシステム。
【請求項１０】
前記ノードが、さらに、
前記１つまたは複数のキーバリューサブセットのうちの各キーバリューサブセットについての前記付加操作が成功した場合に、前記トランザクション識別子を含み且つ前記変更されたトランザクションがコミットされたことを示す第二のトランザクションログエントリを前記ノードに固有の前記トランザクションログファイルに書き込むことによって前記トランザクションを実行するように構成される、請求項９に記載のシステム。
【請求項１１】
前記ノードが、さらに、
前記１つまたは複数のキーバリューサブセットのうちのいずれかのキーバリューサブセットについての前記付加操作が失敗した場合に、前記トランザクション識別子を含み且つ前記変更されたトランザクションが中断されたことを示す第二のトランザクションログエントリを前記ノードに固有の前記トランザクションログファイルに書き込むことによって前記トランザクションを実行するように構成される、請求項９に記載のシステム。
【請求項１２】
前記付加操作が、前記ノード上で実行される分散ファイルシステム（ＤＦＳ）コンポーネントにより実装され、かつ、前記付加操作が、前記分散ファイルシステムによって原子的であることが保証される、請求項９に記載のシステム。
【請求項１３】
前記１つまたは複数のデータログエントリを前記キーバリューサブセットに関連付けられたデータログファイルに付加するように試みることが、
前記付加操作が失敗した場合に、
前記データログスナップショットから前記キーバリューサブセットに関連付けられたデータログファイルの長さを取得し、
前記キーバリューサブセットに関連付けられたデータログファイルを、そのファイルの終わりから前記取得された長さまで降順に読み出し、
前記キーバリューサブセットに関連付けられたデータログファイルが読み出されたときに、前記キーバリューサブセットに関連付けられたデータログファイルの中の何れかのキーが前記キーバリューサブセットの中のキーと一致するか否かを判断し、
一致が発見された場合に前記トランザクションを中断すべきであると判断し、
一致が発見されない場合に、
前記データログスナップショットを更新して、前記キーバリューサブセットに関連付けられたデータログファイルの現在のバージョン番号および現在の長さを含めるとともに、
前記現在のバージョン番号を有するデータログファイルについての前記付加操作を再起動する、
ことを含む、請求項９に記載のシステム。
【請求項１４】
各ノードが、前記データログファイルの集合の中の１つまたは複数のキーバリューペアを取得するトランザクションを、
前記１つまたは複数のキーバリューペアの各キーバリューペアについて、
前記キーバリューペアを含むデータログファイルを前記データログファイルの集合の中から特定し、
前記データログファイルの長さを保存し、
前記データログファイルを処理する
ことによって実行するように構成され、
前記データログファイルを処理することが、
前記保存されたデータログファイルの長さに基づいてデータログファイルを後ろから読み出すことで、前記キーバリューペアの最も新しい変更を表すデータログエントリを前記データログファイルの中から決定し、
前記データログエントリに関連付けられたソースノードおよびソーストランザクションを特定し、
前記ソースノードに固有のトランザクションログファイルを取得し、
前記ソーストランザクションの現在の状態を表す前記ソースノードに固有のトランザクションログエントリを前記トランザクションログファイルの中から決定し、
前記ソーストランザクションがコミットされたことを前記トランザクションログエントリが示す場合に、前記データログエントリの中で特定された前記キーバリューペアを返し、
前記ソーストランザクションがコミットされたことを前記トランザクションログエントリが示さない場合に、
前記データログエントリをスキップすることにより前記保存されたデータログファイルの長さを調整し、
前記調整した後の前記保存された長さに基づいて前記データログファイルを再処理する、
ことによって前記データログファイルを処理することを含む、請求項１に記載のシステム。
【請求項１５】
前記ノードが、さらに、
前記トランザクションログエントリを決定する前に、前記トランザクションログファイルの長さを段階的トランザクションログスナップショットから取得することによって前記トランザクションを実行するように構成され、
前記段階的トランザクションログスナップショットが、前記トランザクション中に前記ノードがアクセスするトランザクションログファイルと、そのアクセス時のトランザクションログファイルの対応する長さを特定するものであり、
前記トランザクションログエントリの決定が、前記取得されたトランザクションログファイルの長さに基づいて行われる、請求項１４に記載のシステム。
【請求項１６】
各データログファイルおよびトランザクションログファイルが、所定の時間間隔で、または所定のサイズに達した時点で圧縮される、請求項１に記載のシステム。
【請求項１７】
ノードの集合の中の１つのノードにより実行される方法であって、前記ノードは、データログファイルの集合を保存する１つまたは複数の記憶装置に通信可能に連結され、各データログファイルがキー名前空間のためのキーバリューペアを含み、
当該方法は、
前記ノードがそのノードに固有のトランザクションログファイルを用いて前記データログファイルの集合の中のキーバリューペアを変更または取得するトランザクションを実行することを備え、前記トランザクションログファイルが前記トランザクションの状態情報を含み、
前記トランザクションが、各トランザクションの原子性および耐久性を確保するように実行される方法。
【請求項１８】
前記トランザクションは、各トランザクションのノード単位スナップショット分離性がさらに確保されるように実行される、請求項１７に記載の方法。
【請求項１９】
コンピュータソフトウェアを具現化する非一時的コンピュータ読取可能媒体であって、前記コンピュータソフトウェアはノードの集合の中の１つのノードにより実行され、前記ノードは、データログファイルの集合を保存する１つまたは複数の記憶装置に通信可能に連結され、各データログファイルがキー名前空間のためのキーバリューペアを含み、前記コンピュータソフトウェアは、前記ノードに対して、
前記ノードに固有のトランザクションログファイルを用いて前記データログファイルの集合の中のキーバリューペアを変更または取得するトランザクションを実行すること
を含む方法を実行させるものであり、
前記トランザクションログファイルが前記トランザクションの状態情報を含み、
前記トランザクションが、各トランザクションの原子性および耐久性が確保されるように実行される、非一時的コンピュータ読取可能媒体。
【請求項２０】
前記トランザクションが、各トランザクションのノード単位スナップショット分離性がさらに確保されるように実行される、請求項１９に記載の非一時的コンピュータ読取可能媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散キーバリューストアに関する。
【背景技術】
【０００２】
キーバリューストア（key-value store）は、ユーザがキーバリューペア（key-value pairs）の形態でデータを保存、検索できるデータベースの１つである。キーバリューペアのキーは、それとペアになる値を一意的に特定する標識（例えば、番号、ストリング等）である。キーバリューペアの値は、どのような種類のデータオブジェクトまたはデータオブジェクトの集合であってもよい。一般的なキーバリューストアは、ユーザに対して、ＰＵＴ、ＧＥＴ、ＤＥＬＥＬＥという３つの操作を可能とさせる。ＰＵＴ操作は１つまたは複数の指定されたキーバリューペアをキーバリューストアに保存し、ＧＥＴ操作は１つまたは複数の指定されたキーバリューの値をキーバリューストアから取得し、ＤＥＬＥＴＥ操作は１つまたは複数の指定されたキーによって特定されたキーバリューペアをキーバリューストアから削除する。
【発明の概要】
【発明が解決しようとする課題】
【０００３】
実際にはいくつかのキーバリューストアが分散され、換言すれば、これらによってユーザはＰＵＴ、ＧＥＴ、ＤＥＬＥＴＥ等のキーバリュー操作を、ノードと呼ばれる個々の（物理的または仮想）コンピュータの集合の何れからも起動させることができる。このような分散キーバリューストアは、非分散キーバリューストアより高い耐障害性とスケーラビリティを提供する。しかしながら、中央集中的でないその性質から、分散キーバリューストアはキーバリュー操作の実行に関するトランザクション保証（例えば、原子性、耐久性、分離性等の保証）を容易に提供することができない。
【課題を解決するための手段】
【０００４】
１つの実施形態において、分散トランザクション対応キーバリューストアを実装するシステムが提供される。このシステムはノードの集合を含み、各ノードは、データログファイルの集合を保存する１つまたは複数の記憶装置に通信可能に連結され、各データログファイルは１つのキー名前空間のためのキーバリューペアを含む。各ノードは、そのノードに固有のトランザクションログファイルを使って、データログファイルの集合の中のキーバリューペアを変更する、または取得するトランザクションを実行するように構成され、トランザクションログファイルはそのトランザクションの状態情報を含む。トランザクションは、各トランザクションの原子性および耐久性が確保される方法で実行される。
【０００５】
以下の詳細な説明と添付の図面により、特定の実施形態の性質と利点をよく理解できる。
【図面の簡単な説明】
【０００６】
【図１】１つの実施形態による分散トランザクション対応キーバリューストアのシステム実装を示す。
【図２】ある実施形態による変更（例えば、ＰＵＴとＤＥＬＥＴＥ）トランザクションを実行するためのプロセスを示す。
【図３】ある実施形態による変更（例えば、ＰＵＴとＤＥＬＥＴＥ）トランザクションを実行するためのプロセスを示す。
【図４】ある実施形態によるＧＥＴトランザクションを実行するためのプロセスを示す。
【図５】ある実施形態によるＧＥＴトランザクションを実行するためのプロセスを示す。
【図６】１つの実施形態による、キー名前空間での検索を実行するためのプロセスを示す。
【発明を実施するための形態】
【０００７】
下記において、説明を目的として、各種の実施形態を理解できるように様々な例と詳細が示されている。しかしながら、当業者にとっては、ある実施形態はこれらの詳細の一部がなくても実施でき、またはそれらの変形や同等物でも実施できることが明らかである。
【０００８】
特定の実施形態は、分散トランザクション対応キーバリューストア（distributed, transactional key-value store）、すなわち「ＤＴＫＶストア」に関する。ＤＴＫＶストアは、ノードの集合を含むことができ、各ノードで、ユーザがデータをキーバリューペアの形態で保存し、取得することができるようなキーバリュー操作（例えば、ＰＵＴ、ＧＥＴ、ＤＥＬＥＴＥ等）を実行できる。従来の分散キーバリューストアとは異なり、ＤＴＫＶストアはこれらの操作を、特定のトランザクション特性（例えば、原子性、耐久性、およびノード単位スナップショット分離性）が確実に満たされる方法で実行できる。
【０００９】
１つの実施形態において、ＤＴＫＶストアは、データログファイルの集合とトランザクションログファイルの集合を含むデータ構成を利用できる。データログファイルの集合は、ＤＴＫＶストアのノード間で共有可能であり（例えば、各ノードにより読出、書込み可能とすることができ）、ＤＴＫＶストアによって保持される実際のキーバリューペアを保存できる。トランザクションログファイルの集合の中の各トランザクションログフファイルはＤＴＫＶストア内の特定のノードに固有とすることができ（例えば、そのノードによる読出、書込みは可能であるが、他のノードは読出しかできない）、そのノードにより実行されたトランザクションの状態の追跡を続けることができる。以下に詳しく説明するように、ＤＴＫＶストアは、キーバリュー操作の実行時にこれらのデータログファイルおよびトランザクションログファイルとやり取りして、トランザクション保証を効率的でスケーラブルな方法で提供する。
【００１０】
他の実施形態において、ＤＴＫＶストアは、ユーザがＤＴＫＶストアによって保持されているキーおよび／またはキーバリューペアを効率的に検索できるようにする。この実施形態において、ＤＴＫＶストアはキーを１つまたは複数のキー名前空間に分割し、各キー名前空間のためのキーバリューペアを１つまたは複数の別々のデータログファイルに保存する。すると、ＤＴＫＶストアにより、ユーザは（ＳＥＡＲＣＨ操作を通じて）キー名前空間によりキーおよび／またはキーバリューペアを検索できる。ユーザが特定のキー名前空間に関してＳＥＡＲＣＨ操作を起動させると、ＤＴＫＶストアはその検索をそのキー名前空間に関係付けられたデータログファイル（複数の場合もある）の内容に限定することができる（ＤＴＫＶストア内のデータログファイルの全部を検索しなくてよい）。
【００１１】
Ｉ．システム実装
図１は、１つの実施形態によるＤＴＫＶストア１００のシステム実装を示している。図のように、ＤＴＫＶストア１００は、相互に接続されたノードの集合１０２−１〜１０２−Ｎを含む。ノード１０２−１〜１０２−Ｎは、物理コンピュータ装置（例えば、サーバコンピュータシステム、パーソナル（例えば、デスクトップまたはラップトップ）コンピュータシステム等）でも、仮想マシン（ＶＭ）でも、物理および仮装装置の組み合わせでもよい。ノード１０２−１〜１０２−Ｎは、当業者の知るローカルエリアネットワーク（ＬＡＮ）、ワイドエリアネットワーク（ＷＡＮ）、インターネットをはじめとする何れかのタイプのコンピュータネットワークを介して相互に接続されていてもよい。
【００１２】
Ｉ．Ａ．ＤＴＫＶサービス
ＤＴＫＶストア１００の中の各ノード１０２−１〜１０２−Ｎは、分散トランザクション対応キーバリューサービス、すなわち「ＤＴＫＶサービス」（１０４−１〜１０４−Ｎ）を含む。ＤＴＫＶサービス１０４−１〜１０４−Ｎはソフトウェアおよび／またはハードウェアベースのコンポーネントであり、ＤＴＫＶストア１００の主な処理タスクを実行する。例えば、各ＤＴＫＶサービス１０４−１〜１０４−Ｎは、１人または複数のユーザ（例えば、人または自動化／プログラムエージェント）に対して、ＤＴＫＶストア１００の中のキーバリューペアの保存、取得、検索の操作を可能とさせる。特定の操作に対するユーザの起動を受けると、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、その操作を実行し、応答（該当する場合）をユーザに返すことができる。１つの実施形態において、ＤＴＫＶサービス１０４−１〜１０４−Ｎは以下の操作を可能とさせる。
（１）ＰＵＴ（（ｋｅｙ１，ｖａｌｕｅ１），（ｋｅｙ２，ｖａｌｕｅ２），…）：１つまたは複数の指定されたキーバリューベアを保存する。
（２）ＧＥＴ（ｋｅｙ１，ｋｅｙ２，…）：１つまたは複数の指定されたキーに対応する１または複数のキーバリューペアを取得する。
（３）ＤＥＬＥＴＥ（ｋｅｙ１，ｋｅｙ２，…）：１つまたは複数の指定されたキーに対応する１つまたは複数のキーバリューペアを削除する。
（４）ＳＥＡＲＣＨ（ｎａｍｅｓｐａｃｅ，ｓｅａｒｃｈ  ｅｘｐｒｅｓｓｉｏｎ）：指定されたキー名前空間の中で、指定された検索式（例えば、正規表現）を満たす、キーおよび／またはキーバリューペアを検索する。
【００１３】
一般に、各ＤＴＫＶサービス１０４−１〜１０４−Ｎは、ＤＴＫＶストア１００の中の他のＤＴＫＶサービスとは独立して、およびこれらと同時に動作できる。例えば、ノード１０２−１のＤＴＫＶサービス１０４−１は、たとえば第一のユーザ集合から受け取った第一のＰＵＴ、ＧＥＴ、ＤＥＬＥＴおよび／またはＳＥＡＲＣＨ操作集合の起動を処理することができる。それと略同時に、ノード１０２−２のＤＴＫＶサービス１０４−２は、例えば第二のユーザ集合から受け取った第二のＰＵＴ、ＧＥＴ、ＤＥＬＥＴＥおよび／またはＳＥＡＲＣＨ操作集合の起動を処理することができ、その際、ＤＴＫＶサービス１０４−１が実行する処理には全く依存しない。この分散平行処理モデルによって、ＤＴＫＶストア１００を耐障害性とすることができ、すなわち、１つのノードおよび／またはＤＴＫＶサービスが利用できなくなっても、ユーザは依然として他の利用可能なノード／ＤＴＫＶサービスの１つを介してＤＴＫＶストア１００にアクセスできる。さらに、この分散平行処理モデルにより、ＤＴＫＶストア１００はスケーラブルとすることができ、これは、システム管理者が増大したユーザ負荷を扱う上での必要性に応じてＤＴＫＶストア１００に新たなノード（各々が新たなＤＴＫＶサービスを実行する）を追加できるからである。
【００１４】
Ｉ．Ｂ．トランザクション特性
従来の分散キーバリューストアと異なり、ＤＴＫＶストア１００はトランザクション対応であり、換言すれば、ＤＴＫＶストア１００は、ＤＴＫＶサービス１０４−１〜１０４−Ｎがキーバリュー操作を実行する時に特定のトランザクション特性が満たされることを確実にし／保証することができる。このようなトランザクション特性を満たす（または、満たすことが意図された）キーバリュー操作のインスタンスが、トランザクションと呼ばれる。特定の実施形態において、ＤＴＫＶストア１００は原子性、耐久性、ノード単位スナップショット分離性というトランザクション特性を保証できる。
【００１５】
原子性とは、１つの実施形態において、トランザクションの全要素が単独で不可分の群として成功に終わるか、失敗する（例えば、中断される）ことが求められるトランザクション特性である。これは、これはトランザクションを部分的に実行できないため、「オール・オア・ナッシング」特性として知られる。例えば、３つのキーバリューペア（Ｋ１、Ｖ１）、（Ｋ２、Ｖ２）、（Ｋ３、Ｖ３）を保存するＰＵＴ操作のインスタンスを考える。原子性の特性は、これらのキーバリューペアの３つ全部が一緒にコミットされる（例えば、ディスク上に書き込まれ）か、まったくコミットされないことを求める。
【００１６】
耐久性とは、１つの実施形態において、あるトランザクションの結果としてコミットされたすべての変化（例えば、変更、削除）が一貫していることを求めるトランザクション特性であり、換言すれば、コミットされた変化は、例えば電源停止、クラッシュ、またはその他のシステムエラーによって未完了となるべきではない。
【００１７】
ノード単位スナップショット分離性とは、１つの実施形態において、ＤＴＫＶストア１００上で実行される各トランザクションが同時に行われる他のトランザクションから分離されることを求めるトランザクション特性である。換言すれば、この特性を満たすトランザクションは、それがあたかも、他のどのユーザも同時にＤＴＫＶストア１００の中のキーバリューペアにアクセスし、またはこれを変更していないかのように見える環境で操作する。それゆえ、ＤＴＫＶストア１００の内容は、トランザクションの開始時に「フリーズ」していると考えることができ、他のトランザクションによって行われる部分的な変化は見えるべきではない。
【００１８】
例えば、ＤＴＫＶサービス１０４−１がキーバリューペア（Ｋ１、Ｖ１）と（Ｋ２、Ｖ２）を保存する第一のＰＵＴトランザクションの実行を開始し、それと略同時にＤＴＫＶサービス１０４−２がキーバリューペア（Ｋ１、Ｖ３）と（Ｋ２、Ｖ４）を保存する第二のＰＵＴトランザクションの実行を開始したとする。ノード単位スナップショット独立性の特性によれば、ＤＴＫＶストア１００はこれらのトランザクションの終了時に、（Ｋ１、Ｖ１）と（Ｋ２、Ｖ２）（これは、第二のＰＵＴトランザクション→第一のＰＵＴトランザクションという逐次的実行順序を示す）か、（Ｋ１、Ｖ３）と（Ｋ２、Ｖ４）（これは、第一のＰＵＴトランザクション→第二のＰＵＴトランザクションという逐次的実行順序を示す）のいずれかを含んでいるはずである。例えば（Ｋ１、Ｖ１）と（Ｋ２、Ｖ４）の最終状態が有効でなく、それは、この最終状態が第一のＰＵＴトランザクションの部分的実行と第二のＰＵＴトランザクションの部分的実行を表しているからである。
【００１９】
他の例として、ＤＴＫＶサービス１０４−１が２つの新しいキーバリューペア（Ｋ１、Ｖ１）と（Ｋ２、Ｖ２）を挿入するＰＵＴトランザクションの実行を開始し、それと略同時にＤＴＫＶサービス１０４−２がキーＫ１とＫ２の値を読み出すＧＥＴ操作の実行を開始した場合を考える。（Ｋ１、Ｖ１）の挿入後で、かつ（Ｋ２、Ｖ２）の挿入開始の前には比較的長い休止があると仮定する。この場合の結果として、３つの可能性が考えられる。
１）ＤＴＫＶサービス１０４−２がＫ１またはＫ２の何れについても値を発見しない。
２）ＤＴＫＶサービス１０４−２がＫ１の値Ｖ１は発見するが、Ｋ２の値は発見しない。
３）ＤＴＫＶサービス１０４−２がＫ１の値Ｖ１とＫ２の値Ｖ２を発見する。
【００２０】
これら３つの考えられる結果のうち、（１）と（３）だけがノード単位スナップショット分離性の特性を満たし、ＧＥＴトランザクションの開始時にＤＴＫＶストア１００はＤＴＫＶサービス１０４−２にとってフリーズしているように見える。
【００２１】
上記を実現するために、ノード単位スナップショット分離性は３つの部分要求事項を含むことができる。第一の部分要求事項は、同時に行われるトランザクションが同じデータ（例えば、同じキーバリューペア）を変更できないことを明示する。このような状況が発生すると、同時に実行されるトランザクションの１つは中断されなければならない。上記の、２つのＰＵＴトランザクションの同時実行が関わる上記の例では、この部分要求事項によれば第一のＰＵＴトランザクションまたは第二のＰＵＴトランザクションの何れかが中断されることになり、それは、これらが両方とも同じキーＫ１とＫ２を変更しようとしているからである。これにより、ＤＴＫＶストア１００の、一方または両方のトランザクションの部分実行を表す最終状態が回避される。
【００２２】
第二の部分要求事項は、ＰＵＴトランザクションと同時に実行され、同じキー集合に対して操作するＧＥＴトランザクションが、ＰＵＴトランザクションの変更の全部を含むか、全く含まない値の集合を返すべきである、というものである。この要求事項は読出分離性と呼ばれる。
【００２３】
第三の部分要求事項は、ＤＴＫＶストア１００の中の各ノードがそのノードから発生する（すなわち、その上で実行される）すべてのトランザクションの固有の実行順序を保持することを求める。それゆえ、図１の実施形態では、この第三の部分要求事項は、ノード１０２−１がＤＴＫＶサービス１０４−１の実行するすべてのトランザクション（例えば、ＰＵＴ、ＧＥＴ、ＤＥＬＥＴＥ等のインスタンス）についての固有の実行順序を保持すること、ノード１０２−２がそのＤＴＫＶサービス１０４−２の実行するすべてのトランザクションについての固有の実行順序を保持すること、等々を求める。これは、分散システム内のすべてのトランザクション（換言すれば、全ノードにわたるトランザクション）が全体として順序付けられる（すなわち、単独の固有のコミット順序に従って整理される）ことを求める「スナップショット」分離性の、より厳格なトランザクション特性とは異なる点に留意するべきである。
【００２４】
上記のトランザクション特性を確実に満たすことによって、ＤＴＫＶストア１００は、そのキーバリューペアレポジトリが、ノード１０２−１〜１０２−Ｎにまたがるキーバリュー操作の同時起動に関係なく、また機器の（例えば、ノードまたは記憶装置）の故障に関係なく、確実に一貫した方法で保持されるようにすることができる。これによって、ユーザは、競合状態、ダーティリード、部分書込み、およびトランザクション非対応の処理から生じうる他の既知の問題について心配することなく、ＤＴＫＶストア１００と信頼性の高いやり取りを行うことができる。
【００２５】
Ｉ．Ｃ．データ構成
特定の実施形態において、ＤＴＫＶストア１００は、２種類のファイル、すなわちデータログファイル（１０６−１〜１０６−Ｍ）とトランザクション（「ｔｘｎ」）ログファイル（１０８−１〜１０８−Ｎ）を含むデータ構成を利用できる。以下のセクションＩＩで説明するように、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、ＰＵＴ、ＧＥＴ、ＤＥＬＥＴＥトランザクションの実行時にこれらのデータログファイルおよびトランザクションログファイルを操作して、各トランザクションの原子性、耐久性、ノード単位スナップショット分離性を保証することができる。
【００２６】
図１の実施形態において、データログファイル１０６−１〜１０６−Ｍは、中央記憶装置１１０（例えば、専用のストレージサーバ上でホストされている）に保存されているように示され、トランザクションログファイル１０８−１〜１０８−Ｎは、それぞれノード１０２−１〜１０２−Ｎのローカル記憶装置１１２−１〜１１２−Ｎに保存されているように示されている。しかしながら、理解すべき点として、データログファイル１０６−１〜１０６−Ｍとトランザクションログファイル１０８−１〜１０８−Ｎは、ローカルまたはリモート接続を通じてノード１０２−１〜１０２−Ｎにアクセス可能などの記憶装置または記憶装置の組み合わせにも保存できる。
【００２７】
Ｉ．Ｃ．１．データログファイル
データログファイル１０６−１〜１０６−Ｍは、ＤＴＫＶストア１００によって保持される実際のキーバリューペアを保存する。各データログファイル１０６−１〜１０６−Ｍは、ＤＴＫＶサービス１０４−１〜１０４−Ｎの間で共有可能であり、それによって各ＤＴＫＶサービスによって読出可能、書込み可能である。いくつのかの実施形態において、各データログファイル１０６−１０６−Ｍは、所定のキー名前空間に関連付けることができる。１つの実施形態において、１つの特定のキー名前空間に属するキーバリューペアのすべてが１つのデータログファイル上に保存されるように、キー名前空間とデータログファイルとの間に１対１のマッピングがあってもよい。例えば、データログファイル１０６−１を営業部門の従業員の氏名を含む第一のキー名前空間に関連付けることができる、データログファイル１０６−２をマーケティング部門の従業員の氏名を含む第二のキー名前空間に関連付けることができる、等々である。他の実施形態では、キー名前空間とデータログファイルの間に１対多のマッピングがあってもよく、それによって特定のキー名前空間内のキーを複数のデータログファイルにまたがって保存できる。何れの場合も、各データログファイル１０６−１〜１０６−Ｍは一般に、そのデータログファイルに関連付けられたキー名前空間の範囲内にあるキーバリューペアだけを保存する。キー名前空間によるデータログファイルのこのような分割は、ＤＴＫＶトア１００内でのキーおよび／またはキーバリューペアの検索工程を容易にし、これについては以下のセクションＩＩＩで説明する。
【００２８】
各データログファイル１０６−１〜１０６−Ｍは、データログエントリと呼ばれるエントリアレイまたはリストとして整理できる。ＤＴＫＶサービス１０４−１〜１０４−Ｎは、それがＤＴＫＶストア１００のキーバリューの内容を変更する「変更」トランザクション（すなわち、ＰＵＴおよびＤＥＬＥＴＥトランザクション）を実行する際に、これらのデータログエントリを作成する。データログエントリは２種類、すなわち、ＤＴＫＶストア１００内のキーバリューペアの保存を示すＰＵＴデータログエントリと、ＤＴＫＶストア１００からのキーバリューペアの削除を示すＤＥＬＥＴＥデータログエントリのうちの一方とすることができる。各ＰＵＴデータログエントリは、保存されるキーと値を特定する「キー」と「値」のフィールドを含むことができ、その一方で、各ＤＥＬＥＴＥデータログエントリは、削除されるキーバリューペアのキーを特定する単独の「キー」のフィールドを含むことができる。さらに、各データログエントリ（ＰＵＴまたはＤＥＬＥＴＥの各々）は、そのデータログエントリを作成したＤＴＫＶサービスのホストノード（例えば、１０２−１〜１０２−Ｎ）を特定する「ノード」のフィールドと、そのノードにデータログエントリを作成させたトランザクションを特定するトランザクション識別（「ｔｘｎＩＤ」）フィールドを含むことができる。
【００２９】
例えば、データログエントリ“ＰＵＴ  ｋｅｙ：Ｋ１  ｖａｌｕｅ：Ｖ１  ｎｏｄｅ：Ｎ１  ｔｘｎＩＤ：Ｔ１”を考える。このデータログエントリは、トランザクションＩＤがＴ１のＰＵＴトランザクションがノードＮ１で実行され、このＰＵＴトランザクションがキーバリューペア（Ｋ１、Ｖ１）を保存させたことを示す。他の例として、データログエントリ、“ＤＥＬＥＴＥ  ｋｅｙ：Ｋ１  ｎｏｄｅ：Ｎ２  ｔｘｎＩＤ：Ｔ２”を考える。このデータログエントリは、トランザクションＩＤがＴ２のＤＥＬＥＴＥトランザクションがノードＮ２で実行され、このＤＥＬＥＴＥトランザクションがキーＫ１により特定されるキーバリューペアを削除させたことを示す。
【００３０】
特定の実施形態において、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、これらが（例えば原子的な「付加」操作を通じて）新しいデータログエントリを各データログファイル１０６−１〜１０６−Ｍの末尾に付加だけするように構成され、すなわち、ＤＴＫＶサービス１０４−１〜１０４−Ｎは新しいデータログエントリをデータログファイルの始めまたは途中に挿入したり、データログファイル内の既存のデータログエントリを変更したりできない。これらの実施形態において、各データログファイル１０６−１〜１０６−Ｍは同じキーについての複数のデータログエントリを含むことができ、データログファイル内のあるキーの最後の（すなわち、最も新しい）データログエントリが、そのキーの現在の値を決定する。例えば、以下の例示的なデータログファイルを考える。
ＰＵＴ  ｋｅｙ：Ｋ１  ｖａｌｕｅ：Ｖ１  ｎｏｄｅ：Ｎ１  ｔｘｎＩＤ：Ｔ１
ＰＵＴ  ｋｅｙ：Ｋ１  ｖａｌｕｅ：Ｖ２  ｎｏｄｅ：Ｎ２  ｔｘｎＩＤ：Ｔ２
ＤＥＬ  ｋｅｙ：Ｋ１  ｎｏｄｅ：Ｎ３  ｔｘｎＩＤ：Ｔ４
ＰＵＴ  ｋｅｙ：Ｋ１  ｖａｌｕｅ：Ｖ３  ｎｏｄｅ：Ｎ１  ｔｘｎＩＤ：Ｔ５
この例では、４つのデータログエントリのすべてがキーＫ１に関係する。しかしながら、データログエントリは（上記のような「付加」の制限により）上から下に時系列的に順序が付けられるため、最後のデータログエントリがキーＫ１の現在の値、すなわちＶ３を決定する。それより古いデータログエントリは、最後のデータログエントリによって上書きされた過去のエントリと考えることができる。
【００３１】
他の実施形態において、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、これらがファイルバージョンに関してデータログファイル１０６−１〜１０６−Ｍにアクセスし／これを変更するように構成される。換言すれば、各データログファイル１０６−１〜１０６−Ｍはバージョン番号に関連付けられ、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、データログファイルにアクセスする時にバージョン番号を指定するほか、データログファイルを変更する時にデータログファイルのバージョン番号を上げる。
【００３２】
Ｉ．Ｃ．２．トランザクションログファイル
トランザクションログファイル１０８−１〜１０８−Ｎは、ＤＴＫＶサービス１０４−１〜１０４−Ｎにより実行されるトランザクションに関する状態情報を保存する。特定の実施形態において、各トランザクションログファイル１０８−１〜１０８−Ｎは、ＤＴＫＶストア１００内の特定のノード／ＤＴＫＶサービスに固有のものとする（すなわちこれに関連付けられる）ことができる。例えば、トランザクションログファイル１０８−１はノード１０２−１／ＤＴＫＶサービス１０４−１に特定とすることができる、トランザクションログファイル１０８−２はノード１０２−２／ＤＴＫＶサービス１０４−２に特定とすることができる、等々である。これらの実施形態において、各トランザクションログファイル１０８−１〜１０８−Ｎには、それに関連するＤＴＫＶサービスしか書き込むことができず、そのＤＴＫＶサービスによって開始／実行されたトランザクションに関する状態情報だけが保存される。その他の、関連付けられていないＤＴＫＶサービスはそのトランザクションログファイルを読み出すことができる（ただし、書き込むことはできない）。
【００３３】
各トランザクションログファイル１０８−１〜１０８−Ｎは、トランザクションログエントリと呼ばれるエントリアレイまたはリストとして整理できる。あるトランザクションログファイルに関連付けられたＤＴＫＶサービスは、このＤＴＫＶサービスがＤＴＫＶストア１００のキーバリューの内容を変更する変更トランザクションを実行する際にこれらのトランザクションログエントリを作成する。トランザクションログエントリは３種類、すなわち、変更トランザクションの開始を示すＢＥＧＩＮトランザクションログエントリ、変更トランザクション実行の成功を示すＣＯＭＭＩＴトランザクションログエントリ、変更トランザクション実行の失敗を示すＡＢＯＲＴトランザクションログエントリであるのうちの１つとすることができる。これらの３種類のトランザクションログエントリの各々は、そのトランザクションを開始した（それゆえ、そのトランザクションログエントリを作成した）ＤＴＫＶサービスのホストノード（例えば、１０２−１〜１０２−Ｎ）を特定する「ノード」のフィールドと、あるノードに関連するトランザクションを一意的に特定するトランザクション識別（「ｔｘｎＩＤ」）のフィールドを含むことができ、「ノード」のフィールドと「ｔｘｎＩＤ」のフィールドとの組み合わせは、ＤＴＫＶストア１００の中の全ノードにわたって固有とすることができる。
【００３４】
１つの実施形態において、トランザクション識別フィールドはＴＫＶストア１００のすべてのノード１０２−１〜１０２−Ｎにわたって固有とすることができる。代替的な実施形態において、トランザクション識別フィールドは１つのノードに関連してのみ固有とすることができる。
【００３５】
データログファイル１０６−１〜１０６−Ｍと同様に、ＤＴＫＶサービス１０４−１〜１０４−Ｎはこれらが（例えば原子的な「付加」操作を通じて）新しいトランザクションログエントリを各トランザクションログファイル１０８−１〜１０８−Ｎの末尾に付加だけするように構成でき、すなわち、ＤＴＫＶサービス１０４−１〜１０４−Ｎは新しいトランザクションログエントリをトランザクションログファイルの始めまたは途中に挿入したり、あるトランザクションログファイル内の既存のトランザクションエントリを変更したりすることはできない。これらの実施形態において、トランザクションログファイルは、同じトランザクションＩＤについて最大で２つのトランザクションログエントリまで含むことができ（１つのＢＥＧＩＮトランザクションログエントリと１つのＣＯＭＭＩＴまたはＡＢＯＲＴトランザクションログエントリ）、特定のトランザクションＩＤに関する最後の（すなわち、最も新しい）トランザクションログエントリがそのトランザクションの現在の状態を決定する。例えば、以下の例示的なトランザクションログファイルを考える。
ＢＥＧＩＮ  ｔｘｎＩＤ：Ｔ１  ｎｏｄｅ：Ｎ１
ＢＥＧＩＮ  ｔｘｎＩＤ：Ｔ２  ｎｏｄｅ：Ｎ２
ＣＯＭＭＩＴ  ｔｘｎＩＤ：Ｔ１  ｎｏｄｅ：Ｎ１
この例において、トランザクションＩＤ  Ｔ１により特定されるトランザクションについての２つのトランザクションログエントリがあり、トランザクションＩＤ  Ｔ２により識別されるトランザクションについての１つのトランザクションログエントリがある。トランザクションＴ１に関する最後のトランザクションログエントリはＣＯＭＭＩＴエントリであり、トランザクションＴ１の実行が成功したことを示す。これと反対に、トランザクションＴ２に関する最後のトランザクションログエントリはＢＥＧＩＮエントリであり、トランザクションＴ２が依然として進行中であることを示す。
【００３６】
さらに、データログファイル１０６−１〜１０６−Ｍと同様に、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、これらがファイルバージョンに関連してトランザクションログファイル１０８−１〜１０８−Ｎにアクセスし／これを変更するように構成される。換言すれば、各トランザクションログファイル１０８−１〜１０８−Ｎはバージョン番号に関連付けられ、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、トランザクションログファイルにアクセスする時にバージョン番号を指定するほか、トランザクションログファイルを変更する時にトランザクションログファイルのバージョン番号を上げる。
【００３７】
Ｉ．Ｃ．３  ログファイルの圧縮
データログエントリとトランザクションログエントリをそれぞれデータログファイル１０６−１〜１０６−Ｍとトランザクションログファイル１０８−１〜１０８−Ｎに付加することに関連する１つの考えられる問題は、これらのログファイルがサイズの点で無限に増大しうることである。これに対応するために、特定の実施形態において、「圧縮」プロセス（ノード１０２−１〜１０２−Ｎのうちの１つ、または図１に示されていない他の装置でホストされる）が各データログファイルおよびトランザクションログファイルを分析して、もはや不要となったログエントリを削除できる。例えば、上記のデータログファイルの例においては、圧縮プロセスは最初の３つのデータログエントリを安全に削除でき、それは、これらがもはやキーＫ１の現在の値に影響を与えなくなっているからである。さらに、上記のトランザクションログファイルの例において、圧縮プロセスは、トランザクションＴ１を参照する２つのトランザクションログエントリを安全に削除でき、それは、このトランザクションがすでにコミットされているからである。それゆえ、圧縮プロセスはデータログファイル１０６−１〜１０６−Ｍとトランザクションログファイル１０８−１〜１０８−Ｎが管理不能に大きくなるのを防止できる。１つの実施形態において、圧縮プロセスは、例えばＤＴＫＶストア１００の管理者によって決定される所定の時間間隔で実行できる。他の実施形態において、圧縮プロセスはトリガイベント、例えば、特定のデータログファイルまたはトランザクションログファイルが所定のサイズ閾値を超えて大きくなったことに応答して実行することもできる。また別の施形態において、圧縮プロセスはノード１０２−１〜１０２−Ｎのランタイム中に優先順位の低い（すなわちバックグラウンド）プロセスとして徐々に実行することができる。この後者の場合、優先順位の低いログファイル圧縮は、例えばテータログファイルが比較的小さいサイズを超えて大きくなった時に開始することができる。
【００３８】
Ｉ．Ｄ．分散ファイルシステム
図１に示されるように、各ノード１０２−１〜１０２−Ｎは、ＤＴＫＶサービス１０４−１〜１０４−Ｎに加えて、関連する分散ファイルシステム（「ＤＦＳ」）コンポーネント１１４−１〜１１４−Ｎを含む。各ＤＦＳコンポーネント１１４−１〜１１４−Ｎは、それに関連するＤＴＫＶサービス１０４−１〜１０４−Ｎに、データログファイル１０６−１〜１０６−Ｍとトランザクションログファイル１０８−１〜１０８−Ｎへのアクセスおよびその変更を容易にするようなファイルシステムレベルの各種の機能を提供できる。
【００３９】
例えば、上のＩ．Ｃ．１とＩ．Ｃ．２に記したように、特定の実施形態において、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、（１）データ／トランザクションログファイルの異なるバージョンを作り／これにアクセスするファイルバージョニングと、（２）データ／トランザクションログエントリをデータ／トランザクションログファイルに付加するための原子的な「付加」操作に依存する。（１）と（２）をＤＴＶＫサービス１０４−１〜１０４−Ｎに直接実装するのではなく、ＤＦＳコンポーネント１１４−１〜１１４−Ｎはこれらの（およびその他の）機能をファイルシステムレベルで実装し、この機能を１つまたは複数のアプリケーションプログラミングインタフェース（「ＡＰＩ」）を介して提供することができる。したがって、これらの実施形態において、ＤＴＫＶサービス１０４−１〜１０４−Ｎは、ＤＦＳコンポーネント１１４−１〜１１４−Ｎによって提供されるＡＰＩを起動するだけで、データログファイル１０６−１〜１０６−Ｍおよびトランザクションログファイル１０８−１〜１０８−Ｎと上述の方法でやり取りできる。
【００４０】
特定の実施形態において、各ＤＦＳコンポーネント１１４−１〜１１４−Ｎは以下のＡＰＩを提供する。
（１）ＧｅｔＶｅｒｓｉｏｎ（ｆｉｌｅ）：指定されたファイルの現在のバージョン番号を返す。
（２）Ｒｅａｄ／（ｆｉｌｅ，ｏｕｔＶｅｒｓｉｏｎ．ｏｆｆｓｅｔ，ｌｅｎｇｔｈ）：指定されたオフセットと長さで始まる指定されたファイルに関するデータとそのファイルの現在のバージョン番号を返す。
（３）Ａｐｐｅｎｄ（ｆｉｌｅ．ｉｎＶｅｒｓｉｏｎ）：データを指定されたファイルの末尾に、そのファイルの現在のバージョン番号がパラメータｉｎＶｅｒｓｉｏｎの値と一致したとき、その場合に限って付加し、現在のバージョン番号がｉｎＶｅｒｓｉｏｎと一致しない場合は、エラーが返され、データは付加されない。これに加えて、付加操作は原子的であり、換言すれば、全部のデータが付加されるか、どのデータも付加されない。データが付加されると、これは耐久性がある（すなわち、不揮発性記憶装置に保存された）と考えることができる。
（４）Ｒｅｎａｍｅ（ｆｉｌｅ１，ｆｉｌｅ２）：１つの原子的操作の中でファイル１をファイル２に名称変更し、これはまた、そのファイルの現在のバージョン番号も変更する。
【００４１】
ＤＴＫＶサービス１０４−１〜１０４−Ｎが上記のＤＦＳ  ＡＰＩを使ってデータログファイル１０６−１〜１０６−Ｍとトランザクションログファイル１０８−１〜１０８−Ｎを操作する方法を以下に説明する。
【００４２】
ＩＩ．トランザクションアルゴリズム
ＤＴＫＶストア１００の上記のようなシステム実装を念頭に置き、以下のセクションでは、ＤＴＫＶサービス１０４−１〜１０４−Ｎがキーバリュートランザクション（例えばＰＵＴ、ＧＥＴ、ＤＥＬＥＴＥ）をトランザクション上で一貫した方法で実行するように実装できる各種のアルゴリズムについて説明する。
【００４３】
ＩＩ．Ａ．変更トランザクション
図２は、ＤＴＫＶストア１００の何れかのＤＴＫＶサービス（以下、「ＤＴＫＶサービス１０４−Ｘ」とする）が変更（ＰＵＴまたはＤＥＬＥＴＥ）トランザクションを実行するために行うことのできる、１つの実施形態によるプロセス２００を示している。このアルゴリズムにより、ＤＴＫＶサービス１０４−Ｘは、その変更トランザクションについて、原子性、耐久性、ノード単位スナップショット分離性のトランザクション特性が確実に満たされるようにすることができる。
【００４４】
ブロック２０２で、ＤＴＫＶサービス１０４−Ｘはその変更トランザクションのための、「データログスナップショット」と呼ばれるデータ構造を決定することができる。１つの実施形態において、データログスナップショットは、ＤＴＫＶストア１００内の、ＤＴＫＶサービは１０４−Ｘがとトランザクションの結果としてアクセスする（例えば、読み出すか書き込む）すべてのデータログファイルへの参照を含むことができる。例えば、変更トランザクションが、キーバリューペア（Ｋ１、Ｖ１）と（Ｋ２、Ｖ２）を保存するためのＰＵＴトランザクションＴ１であり、Ｋ１がデータログファイル１０６−１に保存され、Ｋ２がデータログ１０６−２に保存されると仮定する。この例において、データログスナップショットはデータログファイル１０６−１とデータログファイル１０６−２の両方への参照を含み、これは、ＤＴＫＶサービス１０４−Ｘがトランザクションの実行の成功時に両方のファイルを変更するからである。データログファイルへの参照を含むことに加えて、データログスナップショットはまた、各データログファイルについて、変更トランザクション開始時のそのデータログファイルのバージョン番号およびサイズも含むことができる。
【００４５】
ブロック２０４で、ＤＴＫＶサービス１０４−Ｘは変更トランザクションに関する１つまたは複数のキーバリューサブセットを決定することができる。１つの実施形態において、これらのキーバリューサブセットは、変更トランザクションにより特定され、データログファイルによって分割されたキーバリューペアの集合に対応することができる。それゆえ、トランザクションＴ１の例の場合、ＤＴＫＶサービス１０４−Ｘは２つのキーバリューサブセット、すなわち、キーバリューペア（Ｋ１、Ｖ１）を含む第一のキーバリューサブセットと、キーバリューペア（Ｋ２、Ｖ２）を含む第二のキーバリューサブセットを決定できる。この例において、キーバリューペア（Ｋ１、Ｖ１）と（Ｋ２、Ｖ２）は、これらが別々のデータログファイル（それぞれ１０６−１と１０６−２）に存在するため、別のキーバリューサブセットに含められる。
【００４６】
ブロック２０６では、ＤＴＫＶサービス１０４−Ｘが、変更トランザクションが開始されたことを示す第一のトランザクションログエントリを、それに関連付けられたトランザクションログファイル（例えば、トランザクションログファイル１０８−Ｘ）に書き込むことができる。特定の実施形態において、第一のトランザクションログエントリは、トランザクションＩＤ（例えばＴ１）によって変更トランザクションを識別するＢＥＧＩＮトランザクションログエントリと、そのトランザクションを開始したノード（例えば、ＤＴＫＶサービス１０４−Ｘのホストノード、すなわちノード１０２−Ｘ）とすることができる。ブロック２０６の一部として、ＤＴＫＶサービス１０４−Ｘは、その変更トランザクションについて、そのトランザクションがまだ持っていなければ、トランザクションＩＤを生成できる。特定の実施形態において、ＤＴＫＶサービス１０４−Ｘは、第一のトランザクションログエントリを、このエントリをトランザクションログファイル１０８−Ｘに付加することによって書き込むことができる。ＤＴＫＶサービス１０４−Ｘは、それに関連付けられたＤＦＳコンポーネント（例えば、ＤＦＳコンポーネント１１４−Ｘ）により提供される原子的な「付加操作」を起動することによってこれを遂行できる。
【００４７】
ＤＴＫＶサービス１０４−Ｘが第一のトランザクションログエントリを書き込むと、ＤＴＫＶサービス１０４−Ｘは、ブロック２０４で決定された各キーバリューサブセットに関するループに入ることができる（ブロック２０８）。このループの中では、ＤＴＫＶサービス１０４−Ｘはまず、ＤＴＫＶサービス１０４−Ｘが（現在のキーバリューサブセットを考えて）現在のキーバリューサブセットに関連付けられたデータログファイルに追加する１つまたは複数のデータログエントリを決定することができる（ブロック２１０）。例えば、トランザクションＴ１の例に関して、現在のキーバリューサブセットがキーバリューペア（Ｋ１、Ｖ１）を含む場合、ＤＴＫＶサービス１０４−Ｘは以下のデータログエントリ、“ＰＵＴ  ｋｅｙ：Ｋ１  ｖａｌｕ：Ｖ１  ｎｏｄｅ：１０２−Ｘ  ｔｘｎＩＤ：Ｔ１”を決定できる。
【００４８】
ＤＴＫＶサービス１０４−Ｘはすると、ブロック２１０で決定されたデータログエントリを現在のキーバリューサブセットに関連付けられたデータログファイルに書き込むことができる（ブロック２１２）。ブロック２０６で書き込まれた第一のトランザクションログエントリと同様に、ＤＴＫＶサービス１０４−Ｘは、ＤＦＳコンポーネント１１４−Ｘによって提供される原子的な付加操作を起動することによって、これらのデータログエントリをデータログファイルに書き込むことができる。この起動の一環として、ＤＴＫＶサービス１０４−Ｘは付加操作に、データログスナップショットに保存されていたデータログファイルのバージョン番号（これは、そのトランザクションの開始時のそのテータログファイルのバージョン番号に対応する）を渡すことができる。
【００４９】
ブロック２１４で、ＤＴＫＶサービス１０４−Ｘは付加操作が成功したか否かを判断することができる。セクションＩ．Ｄ．で述べたように、ＤＦＳコンポーネント１１４−Ｘによって提供される付加操作は、その操作に渡されたバージョン番号が変更中のファイルの、その操作の起動時のバージョン番号と一致すれば成功するように設計される。反対に、付加操作はバージン番号が一致しなければ失敗するように設計される。それゆえ、ＤＴＫＶサービス１０４−Ｘは、ブロック２１４で、付加操作が失敗したと判断すると、ＤＴＫＶサービス１０４−Ｘは、データログファイルが変更トランザクションの開始以降に（例えば同時に実行された他のトランザクションによって）更新／変更されたと結論付けることができ、これは、そのデータログファイルの現在のバージョン番号がもはやデータログスナップショットから渡されたバージョン番号と一致しなくなっているからである。この場合、ＤＴＫＶサービス１０４−Ｘはトランザクションログファイル１８−Ｘに、（ＤＦＳコンポーネント１１４−Ｘによって提供された付加トランザクションを通じて）、変更トランザクションが中断されたことを示す第二のトランザクションログエントリ（例えば、ＡＢＯＲＴトランザクションログエントリ）を書き込むことができ、プロセス２００は終了できる。
【００５０】
これに対し、ＤＴＫＶサービス１０４−Ｘがブロック２１４で付加操作が成功したと判断すると、ＤＴＫＶサービス１０４−Ｘは、データログファイルがその変更トランザクションの開始以降に更新／変更されなかったと結論付けることができ、これは、そのデータログファイルの現在のバージョン番号がデータログスナップショットから渡されたバージョン番号と一致するからである。この場合、現在のループの繰り返しは終了でき（ブロック２１８）、プロセス２００はブロック２０８に戻ることができ、ＤＴＫＶサービス１０４−Ｘは別のキーバリューサブセットを処理できる。ＤＴＫＶサービス１０４−Ｘがすべてのキーバリューサブセットの処理に成功すると（すなわち、すべてのキーバリューサブセットに関するデータログエントリのそれぞれに関連付けられたデータログファイルへの付加が成功すると）、ＤＴＫＶサービス１０４−Ｘはブロック２２０で、トランザクションログファイル１０８−Ｘに、（ＤＦＳコンポーネント１１４−Ｘにより提供される付加操作を通じて）、変更されたトランザクションがコミットされたことを示す第二のトランザクションログエントリ（例えば、ＣＯＭＭＩＴトランザクションログエントリ）を書き込むことができる。
【００５１】
図２のアルゴリズムは対象の変更トランザクションに関する原子性および耐久性を保証できるが、これは、ＤＴＫＶサービス１０４−Ｘが、アルゴリズムの最後のステップ（ブロック２１６または２２０の何れか）において変更トランザクションをコミットまたは中断する。この最後のステップの一部として、ＤＴＫＶサービス１０４−ＸはＤＦＳコンポーネント１１４−Ｘにより提供された付加操作を起動して、ＣＯＭＭＩＴまたはＡＢＯＲＴトランザクションログエントリの何れかをトランザクションログファイル１０８−Ｘに書き込み、この付加操作はＤＦＳコンポーネント１１４−Ｘによって、上のセクションＩ．Ｄ．で述べたように、その原子性および耐久性が保証される。それゆえ、トランザクション全体が原子性および耐久性を有することが保証される。
【００５２】
場合により、ＤＴＫＶサービス１０４−Ｘ（またはノード１０２−Ｘ）は、それがＣＯＭＭＩＴまたはＡＢＯＲＴトランザクションログエントリをトランザクションログファイル１０８−Ｘに書き込む前であり、かつそれが１つまたは複数のデータログエントリを１つまたは複数のデータログファイルに書き込んだ後にクラッシュするかもしれない。しかしながら、以下のセクションＩＩ．Ｂ．で説明するように、ＤＴＫサービス１０４−１〜１０４−Ｎが取得し（すなわち、ＧＥＴ）トランザクションを実行するために行うアルゴリズムは、データログファイル１０６−１〜１０６−Ｍの中の、適当なトランザクションログファイルの中に対応するＣＯＭＭＩＴトランザクションログエントリを持たないデータログエントリのすべてを無視することができる。それゆえ、このような場合でも、中断された変更トランザクションは原子的であると考えることができるが、これは、トランザクションログファイル１０８−Ｘの中にＣＯＭＭＩＴトランザクションログエントリがなければ、データログファイルに書き込まれたどの変更もユーザにとって見えないからである。
【００５３】
さらに、図２のアルゴリズムは、同時に実行される他のトランザクションに関して、対象の変更トランザクションのノード単位スナップショット分離を確実に行うことができる。フロック２１２〜２１６に関して述べたように、変更トランザクションに関わったデータログファイルの何れかが（例えば、同時に実行される他のトランザクションによって）変更トランザクションの開始以降に変えられた場合、ＤＴＫＶサービス１０４−Ｘがブロック２１２で起動する付加操作は失敗し、変更トランザクションは中断される。したがって、この結果は、同時に実行される２つのトランザクションは同じデータを変更できないという第一のノード単位スナップショット分離の要求事項を満たす。これに加えて、以下のセクションＩＩ．Ｂ．で説明するように、ＤＴＫＶサービス１０４−１〜１０４−Ｎが取得（すなわち、ＧＥＴ）トランザクションを実行するために行うアルゴリズムは、データログファイル１０６−１〜１０６−Ｍの中の、適当なトランザクションログファイルに対応するＣＯＭＭＩＴトランザクションログエンティティを持たないデータログエントリのすべてを無視することができ、それゆえ、ＤＴＫＶストア１００は、同時に実行される変更トランザクションの状態以前のように見える。この特性は、読出分離のノード単位スナップショット分離性という第二の要求事項を保証する。最後に、単独のトランザクションログファイルがＤＴＫＶストア１００の中の各ノード１０２−１〜１０２−Ｎに関連付けられることに留意するべきであり、その単独のトランザクションログファイルはそれに関連付けられたノードから発生する（すなわち、その上で実行される）すべてのトランザクションについての固有のトランザクションログエントリのリストを含む。したがって、このデータ構成は、各ノードの固有のコミット順序という、ノード単位スナップショット分離性の第三の要求事項を満たす。
【００５４】
図２のアルゴリズムに関する１つの問題は、それがトランザクション上正しい結果を生むものの、変更トランザクションの特定の組み合わせの同時実行を不必要に阻止する可能性がある。例えば、キーバリューペアの互いに素な集合に作用する２つのＰＵＴトランザクションＴ１とＴ２、例えばトランザクションＴ１がキーバリューペア（Ｋ１、Ｖ１）と（Ｋ２、Ｖ２）を保存するように構成され、トランザクションＴ２がキーバリューペア（Ｋ３、Ｖ３）と（Ｋ４、Ｖ４）を保存するように構成される場合を考える。キーＫ１がデータログファイルＤ１に保存され、キーＫ２とＫ３がデータログファイルＤ２に保存され、キーＫ４がデータログファイルＤ３に保存されると仮定する。それゆえ、これら２つのトランザクションのデータログスナップショットは、これらがどちらもデータログファイルＤ２を含むため、交差する。
【００５５】
この例において、トランザクションＴ１とＴ２が図２のプロセス２００に従って同時に実行される場合、トランザクションのうちの一方は、データログファイルＤ２のバージョン番号が一方のトランザクションまたは他方の実行中に変化する（それゆえ、フロック２１２の付加操作が失敗する）ため、中断される。しかしながら、トランザクションの観点からはどちらのトランザクションも中断する必要がなく、それは、これらが異なるキーバリューペアを変更するため、Ｔ１が部分的にＴ２に上書きする、またはその逆が起きる虞がないからである。
【００５６】
この問題に対処するために、プロセス２００を図３に示されるように改良できる。特に、図３は、ＤＴＫＶサービス１０４−Ｘが図２のブロック２１４の後で、かつブロック２１６の前に実行できるサブプロセス３００を示している。このサブプロセスにより、ＤＴＫＶサービス１０４−Ｘは対象の変更トランザクションの中断を、その変更トランザクションと同時に実行される他の変更トランザクションの間でキーバリューペアが重複していない場合に回避できる。
【００５７】
サププロセス３００は、ＤＴＫＶサービス１０４−Ｘが、付加操作が現在のキーバリューサブセットについて失敗したと判断した時（例えば、図のブロック２１４）に始まる。ブロック３０２で、ＤＴＫＶサービス１０４−Ｘは現在のキーバリューサブセットに関連付けられたデータログファイルの長さを取得することができる。図２のブロック２０２に関して述べたように、このデータログファイル長さはデータログスナップショットの中に保存され、変更トランザクションの開始時のデータログファイルの長さを表す。
【００５８】
ブロック３０４で、ＤＴＫＶサービス１０４−Ｘは、ファイルの終わりからブロック３０２で取得された長さまで降順でデータログファイルを読み出すことができる。特定の実施形態において、ＤＴＫＶサービス１０４−Ｘはこの読出を、ＤＦＳコンポーネント１１４−Ｘによって可能とされ、セクションＩ．Ｄ．で説明した読出操作を起動することによって実行できる。このようにしてファイルを読み出すことにより、ＤＴＫＶサービス１０４−Ｘは変更トランザクションが始まった時から付加操作が失敗した時までの間にファイルに追加されたキーバリューペアを特定できる。
【００５９】
ＤＴＫＶサービス１０４−Ｘが、ブロック３０４でデータログファイルから読み取られた何れかのキーと現在のキーバリューサブセットの中のキーとが一致していることを発見すると（ブロック３０６）、ＤＴＫＶサービス１０４−Ｘは、変更トランザクションのキーバリューペアと同時に実行される他のトランザクションのキーバリューペアの間に重複があると判断できる。したがって、ブロック３０８で、ＤＴＫＶサービス１０４−Ｘはトランザクションログファイル１０８−Ｘに、（ＤＦＳコンポーネント１１４−Ｘにより提供される付加操作を通じて）、変更トランザクションが中断されたことを示す第二のトランザクションログエントリ（例えば、ＡＢＯＲＴトランザクションログエントリ）を書き込むことができる。
【００６０】
これに対して、ＤＴＫＶサービス１０４−Ｘが、ブロック３０６で何れかの一致を発見しない場合、ＤＴＫＶサービス１０４−Ｘは、変更トランザクションのキーバリューペアと同時に実行される他のトランザクションのキーバリューペアの間に重複がないと判断できる。この場合、ＤＴＫＶサービス１０４−Ｘはデータログスナップショットを更新して、そのデータログファイルの現在のバージョン番号および現在の長さを含めることができる（ブロック３１０）。するとＤＴＫＶサービス１０４−Ｘは、サブプロセス３００を図２のブロック２１２へと移行させることができる。ブロック２１２で、ＤＴＫＶサービス１０４−Ｘは現在のバージョン番号を有するデータログファイルについての付加操作を再試行でき、プロセス２００をその時点から前述のように実行できる。
【００６１】
図２または図３に示されていないが、いくつかの実施形態において、ＤＴＫＶサービス１０４−Ｘは変更トランザクションをその中断後に自動的に再試行（すなわち、その実行を再開）できる。これは、変更トランザクションの実行が成功する可能性を高めることができる。特定の実施形態において、ＤＴＫＶストア１００の管理者はＤＴＫＶサービス１０４−Ｘがこのような再試行を行うべきか否かを示す１つ以上のパラメータと、行うべきであれば、トランザクション当たりの再試行の最大回数を決定できる。
【００６２】
ＩＩ．Ｂ．ＧＥＴトランザクション
図４は、ＤＴＫＶサービス１０４−Ｘが取得（すなわち、ＧＥＴ）トランザクションを実行するために行うことのできる、１つの実施形態によるプロセス４００を示す。
【００６３】
ブロック４０２で、ＤＴＫＶサービス１０４−Ｘは、ＧＥＴトランザクションのキーセット（すなわち、入力キーの集合）の各キーについてのループに入ることができる。このループの中で、ＤＴＫＶサービス１０４−Ｘはまず、現在のキーを保存するデータログファイルを特定し、そのデータログファイルの長さを保存することができる（ブロック４０４）。
【００６４】
ブロック４０６で、ＤＴＫＶサービス１０４−Ｘは、ブロック４０４で特定されたデータログファイルで現在のキーを参照する最後の（すなわち、最も新しい）データログエントリを検索することができる。セクションＩ．Ｃ．１．で述べたように、あるキーに関するデータログファイルの中の最後のデータログエントリは一般に、そのキーの現在の値を表す。特定の実施形態において、ＤＴＫＶサービス１０４−Ｘはこの検索を、ＤＦＳコンポーネント１１４−Ｘにより可能とされ、セクションＩ．Ｄで説明した読出操作を使ってデータログファイルを（ブロック４０４の長さの値から）降順に読み出すことによって行うことができる。
【００６５】
ＤＴＫＶサービス１０４−Ｘが現在のキーに関する最後のデータログエントリを発見すると、ＤＴＫＶサービス１０４−Ｘは、そのデータログエントリの「ノード」と「ｔｘｎＩＤ」フィールドを使って、データログエントリを作らせたソースノードおよびソーストランザクションを特定することができる（ブロック４０８）。するとＤＴＫＶサービス１０４−Ｘは、ソースノードに関連付けられたトランザクションログファイルを取得し、そのトランザクションログファイルで、そのソーストランザクションＩＤを参照する最後の（すなわち、最も新しい）トランザクションログエントリを検索できる（ブロック４１０と４１２）。このようにして、ＤＴＫＶサービス１０４−Ｘは、ソーストランザクションの現在の状態を判断できる。
【００６６】
元のトランザクションの最後のトランザクションログエントリがＣＯＭＭＩＴエントリであれば（ブロック４１４）、ＤＴＫＶサービス１０４−Ｘは、ブロック４０６で判断された最後のデータログエントリが有効であると判断でき、それゆえ、最後のデータログエントリの中で特定された値を現在のキーの現在の値として返すことができる（ブロック４１６）。そこでプロセス４００を終了できる。
【００６７】
これに対して、最後のトランザクションログエントリがＣＯＭＭＩＴエントリでなければ、ＤＴＫＶサービス１０４−Ｘはブロック４０６で判断された最後のデータログエントリが有効でないと判断でき、これは、最後のデータログエントリを作成したソーストランザクションがまだコミットされていないからである。したがって、ＤＴＫＶサービス１０４−Ｘは、保存されていたそのデータログファイルの長さを調整して、最後のデータログエントリをスキップすることができる（ブック４１８）。すると、プロセス４００の流れはブロック４０６に戻ることができ、ＤＴＫＶサービス１０４−Ｘは、そのデータログファイルで現在のキーを参照する最後の（すなわち、最も新しい）データログエントリを再度検索する。この、後の検索では、ＤＴＫＶサービス１０４−Ｘは以前に発見したデータログエントリに遭遇せず、これは、ＤＴＫＶサービス１０４−Ｘが新たに保存された長さ（これは過去に発見されたデータログエントリをスキップする）から降順にファイルを読み出すからである。すると、プロセス４００を上述のように進めることができる。
【００６８】
最終的に、ＤＴＫＶサービス１０４−Ｘは現在のキーに関する有効なデータログエントリを発見し、ブロック４１６でそのデータログエントリからの値を返すことができる。するとループ４０２を進めて、ＤＴＫＶサービス１０４−Ｘが各キーの値を返すまで、そのキーセットの残りのキーを処理することができる。
【００６９】
直感的に、図４のアルゴリズムは、ＤＴＫＶストア１００に値を追加した変更トランザクションが適当なトランザクションログファイルにコミットされたとしてマークされない限り、ＧＥＴトランザクションが指定されたキーの値を確実に返さないようにする。それゆえ、このアルゴリズムは、変更トランザクションの原子性を、変更トランザクションが何らかの理由によってＣＯＭＭＩＴトランザクションログエントリの作成前に中断されたか失敗した場合に、変更トランザクションが失敗の前に作成したトランザクションデータログエントリのすべてがユーザから見えないという点で、保証する。
【００７０】
しかしながら、図４のアルゴリズムは、変更トランザクションが同時に行われる場合に、ＧＥＴトランザクションに関するノード単位スナップショット分離性を保証しない。例えば、キーバリューペア（Ｋ１、Ｗ１）と（Ｋ２、Ｗ２）を保存するためのＰＵＴトランザクションＴ１が開始され、キーＫ１とＫ２の以前の値がそれぞれＶ１とＶ２であったとする。さらに、キーＫ１とＫ２の値を読み出すためのＧＥＴトランザクションＴ２が、トランザクションＴ１と略同時に開始され、以下のイベントシーケンスが起こるとする。
１．Ｔ１が開始される。
２．Ｔ１により、キーＫ１が値Ｗ１で更新される。
３．Ｔ１により、キーＫ２が値Ｗ２で更新される。
４．Ｔ２が開始される。
５．Ｔ２がキーＫ１のための最後のデータログエントリを検索し、値Ｗ１を発見するが、適当なトランザクションログファイルをチェックして、Ｔ１に関するＣＯＭＭＩＴトランザクションログエントリを発見せず（Ｔ１がまだコミットされていないため）、その結果、Ｔ２が、キーＫ１に関する、それより前のデータログエントリを検索し、値Ｖ１を発見し、Ｖ１を返す。
６．Ｔ１がコミットされ、ＣＯＭＭＩＴトランザクションログエントリが書き込まれる。
７．Ｔ２がキーＫ２に関する最後のデータログエントリを検索し、値Ｗ２を発見し、Ｔ１に関するＣＯＭＭＩＴトランザクションログエントリを発見し、Ｗ２を返す。
【００７１】
このシーケンスの最後に、ＧＥＴトランザクションＴ２はキーＫ１とＫ２それぞれのための値Ｖ１とＷ２を返し、これは、結果として得られた値がＰＵＴトランザクションＴ１の部分的実行を示しているため、ノード単位スナップショット分離の特性に違反する。
【００７２】
この欠点に対処するために、特定の実施形態において、図４のプロセス４００を図５に示されるように改良できる。特に、図５は、ＤＴＫＶサービス１０４−Ｘが図４のブロック４１０と４１４の間で実行できるサブプロセス５００を示している。このようなサブプロセス５００により、ＤＴＫＶサービス１０４−Ｘは、ＧＥＴトランザクションが確実に、１つまたは複数の、同時に実行される変更トランザクションの部分的実行を示す結果を返さないようにすることができる。
【００７３】
このようなサブプロセス５００は、ＤＴＫＶサービス１０４−Ｘが現在のキーの最後のデータログエントリに関連付けられるソーストランザクションに関するトランザクションログファイルを取得した後（図４のブロック４１０）に始まる。ブロック５０２で、ＤＴＫＶサービス１０４−Ｘは、「段階的トランザクションログスナップショット」（progressive transaction log snapshot）にアクセスでき、これは１つのＧＥＴトランザクションの実行中に訪問されたすべてのトランザクションログファイル（およびそのバージョン番号と長さ）を継続的に追跡するように意図されたデータ構造である。特にＤＴＫＶサービス１０４−Ｘは、この段階的トランザクションログスナップショットにアクセスし、現在のＧＥＴトランザクション中にブロック４１０で呼び出されたトランザクションログファイルをＤＴＫＶサービス１０４−Ｘが過去に訪問した（例えば、これを読み取った）ことがあるかを判断できる。
【００７４】
ＤＴＫＶサービス１０４−Ｘが過去にそのトランザクションログファイルを訪問したことがないと判断すると（ブロック５０４）、ＤＴＫＶサービス１０４−Ｘはトランザクションログファイルとその現在の長さ／バージョン番号を段階的トランザクションログスナップショットに追加できる（ブロック５０６）。これに対して、ＤＴＫＶサービス１０４−Ｘが過去にそのトランザクションログファイルを訪問したことがあると判断すると、ＤＴＫＶサービス１０４−Ｘは段階的トランザクションログスナップショットからトランザクションログファイルの長さを読み出すことができる（ブロック５０８）。すると、ＤＴＫＶサービス１０４−Ｘはこのトランザクションログファイルで、ソーストランザクションＩＤを参照する最後のトランザクションログエントリを検索できる（ブロック５１０）。ＤＴＫＶサービ１０４−Ｘはこの検索を、（ブロック５０６が実行された場合は）トランザクションログファイルの現在の長さから、または（ブロック５０８が実行された場合は）段階的トランザクションログスナップショットの長さからファイルを降順に読み出すことによって行うことができる。すると、サププロセス５００は図４のブロック４１４に移行でき、プロセス４００をその時点から前述のように進めることができる。
【００７５】
図５に示される方法で段階的トランザクションログスナップショットを利用することによって、ＤＴＫＶサービス１０４−ＸはＧＥＴトランザクションの実行中にそれがアクセスするトランザクションログファイルの状態を有効に「フリーズ」させることができる。それゆえ、ＤＴＫＶサービス１０４−Ｘは、ＧＥＴトランザクションが、同時に実行される１つまたは複数の変更トランザクションにより、トランザクション上誤った結果（例えば、ノード単位スナップショット分離性を満たさない結果）を返すような状況を回避できる。例えば、サブプロセス５００を前の例、すなわちＰＵＴトランザクションＴ１がＧＥＴトランザクションＴ２と同時に実行される場合に適用すると、以下の代替的なイベントシーケンスが発生する。
１．Ｔ１が開始される。
２．Ｔ１により、キーＫ１が数値Ｗ１で更新される。
３．Ｔ１により、キーＫ２を数値Ｗ２で更新させる。
４．Ｔ２が開始される。
５．Ｔ２がキーＫ１に関する最後のデータログエントリを検索して、値Ｗ１を発見するが、適当なトランザクションログファイルを検索し、Ｔ１に関するＣＯＭＭＩＴトランザクションログエントリを発見せず（Ｔ１がまだコミットされていないため）、その結果、Ｔ２がキーＫ１に関する、それより前のデータログエントリを検索し、値Ｖ１を発見し、Ｖ１を返す。
６．Ｔ２が、訪問されたトランザクションログファイルとその長さを段階的トランザクションログスナップショットに追加する。
７．Ｔ１がコミットされ、ＣＯＭＭＩＴトランザクションログエントリが書き込まれる。
８．Ｔ２は、キーＫ２に関する最後のデータログエントリを検索し、値Ｗ２を発見し、適当なトランザクションログファイルが過去に訪問されたと判断し、それゆえ、段階的トランザクションログスナップショットに保存された長さからトランザクションログファイルを検索する。
９．Ｔ２はトランザクションログスナップショットの中でＴ１に関するＣＯＭＭＩＴトランザクションログエントリを発見せず（ステップ（７）で書き込まれたＣＯＭＭＩＴがスキップされるため）、キーＫ２に関するそれより前のデータログエントリを検索し、値Ｖ２を発見し、Ｖ２を返す。
【００７６】
このシーケンスの最後に、ＧＥＴトランザクションＴ２はキーＫ１とＫ２に関する値、それぞれＶ１とＶ２を返し、これは、それがＰＵＴトランザクションＴ１の部分的実行を表していないため、トランザクション上、正しい。
【００７７】
ＩＩＩ．キー名前空間による検索
前述のように、特定の実施形態において、ＤＴＫＶストア１００は保存されたキーおよび／またはキーバリューペアの効率的な検索をサポートすることができる。特に、ＤＴＫＶストア１００は、キーを１つまたは複数のキー名前空間に分割して、各キー名前空間のためのキーバリューペアを１つまた複数の別々のデータログファイルに保存することができる。すると、ＤＴＫＶサービス１０４−１〜１０４−Ｎにより、ユーザは（セクションＩ．Ａ．で説明したＳＥＡＲＣＨ操作を通じて）キーおよび／またはキーバリューペアをキー名前空間により検索できる。ユーザが特定のキー名前空間に関連してＳＥＡＲＣＨ操作を起動させると、ＤＴＫＶストアはその検索をそのキー名前空間に関連付けられたデータログファイル（複数の場合もある）の内容に限定することができる（ＤＴＫＶストア１００の中のデータログファイルの全部を検索しなくてもよい）。
【００７８】
図６は、ＳＥＡＲＣＨ操作を実行するためにＤＴＫＶサービス１０４−Ｘが行うことのできる、１つの実施形態によるプロセス６００を示す。ブロック６０２で、ＤＴＫＶサービス１０４−ＸはＳＥＡＲＣＨ操作の起動を受けることができ、これは検索式および目標とするキー名前空間を含む。検索式は、例えば正規表現またはその他のあらゆる種類のクエリストリングとすることができる。
【００７９】
ブロック６０４で、ＤＴＫＶサービス１０４−Ｘは、目標とするキー名前空間に関連付けられた１つ以上のデータログファイル（すなわち、目標とするキー名前空間のためのキーバリューペアを含む）を特定できる。
【００８０】
ブロック６０６で、ＤＴＫＶサービス１０４−Ｘは、ブロック６０４で特定された１つまたは複数のデータログファイルで、検索式を満たすキーおよび／またはキーバリューペアを検索できる。するとＤＴＫＶサービス１０４−Ｘは、発見されたキーおよび／またはキーバリューペアを要求者に返すことができる。１つの実施形態において、ＤＴＫＶサービス１０４−Ｘは、それに関連付けられたＤＦＳコンポーネント１１４−Ｘにより提供され、セクションＩ．Ｄ．で説明した読出操作を起動させることによって、この検索を実行できる。代替的な実施形態において、この検索はどのような周知のテキスト検索アルゴリズムを使って実行してもよい。
【００８１】
本明細書で説明された各種の実施形態は、コンピュータシステムに保存されたデータに係る様々なコンピュータ実装操作を利用してもよい。例えば、これらの操作は、物理的数量の物理的操作を必要とする場合もあり、通常、必ずしもそうであるとは限らないが、これらの数量が電気または磁気信号の形態をとることもあり、この場合、これらまたはそれを表すものの保存、転送、合成、比較、またはその他の操作を行うことができる。さらに、このような操作はしばしば、生成、特定、決定、比較等の用語で呼ばれる。本明細書において説明された１つまたは複数の実施形態を形成する操作は何れも、有益な機械操作であってもよい。これに加えて、１つまたは複数の実施形態はまた、これらの操作を実行するための機器または装置に関係している。装置は、特定の必要な目的のために特に構成されていてもよく、またはコンピュータの中に保存されたコンピュータプログラムにより選択的に作動され、または構成される汎用コンピュータであってもよい。特に、各種の汎用マシンは、本明細書の教示に従って書かれたコンピュータプログラムと共に使用されてもよく、あるいはこれは必要な操作を実行するための、より専用化された装置を構成する上でより好都合である場合がある。本明細書で説明された各種の実施形態は、ハンドヘルド機器、マイクロプロセッサシステム、マイクロプロセッサベースまたはプログラム可能な民生用電子機器、ミニコンピュータ、メインフレームコンピュータ等を含むその他のコンピュータシステム構成で実施してもよい。
【００８２】
１つまたは複数の実施形態は、１つまたは複数の非一時的コンピュータ読出可能記憶媒体の中に埋め込まれた１つまたは複数のコンピュータプログラム、または１つまたは複数のコンピュータプログラムモジュールとして実装されてもよい。非常一時的コンピュータ読取可能媒体という用語は、後にコンピュータシステムに入力可能なデータを保存できるあらゆるデータ記憶装置を指す。非一時的コンピュータ読取可能媒体は、コンピュータによる読取を可能にする方法でコンピュータプログラムを具現化するための、既存の、または今後開発されるどのような技術に基づいていてもよい。非一時的コンピュータ読取可能媒体の例としては、ハードドライブ、ネットワークアタッチトストレージ（ＮＡＳ）、リードオンリメモリ、ランダムアクセスメモリ（例えば、フラッシュメモリ装置）、ＣＤ（コンパクトディスク）、例えばＣＤ−ＲＯＭ、ＣＤ−ＲまたはＣＤ−ＲＷ、ＤＶＤ（デジタルバーサタイルディスク）、磁気テープ、その他の光および光以外のデータ記憶装置がある。非一時的コンピュータ読取可能媒体はまた、ネットワーク接続されたコンピュータシステム上で分散させることができ、それによってコンピュータ読取可能コードを分散させて保存され、実行される。
【００８３】
さらに、本明細書に記載された各種のコンポーネント、操作、データストア間の境界はある程度任意であり、特定の操作は特定の例示的構成に関連して示されている。機能のその他の割当も考えられ、これらも本発明の範囲に含まれる。一般に、例示的な構成の中で別のコンポーネントとして説明されている構造や機能は、複合的な構造またはコンポーネントとして実装してもよい。同様に、１つのコンポーネントとして説明されている構造や機能は、別のコンポーネントとして実装してもよい。
【００８４】
上記の説明は、各種の実施形態を、特定の実施形態の態様の実施の仕方の例に関連して示している。上記の例と実施形態は、これらがすべての実施形態であるとみなすべきではなく、以下の特許請求の範囲により定義される特定の実施形態の柔軟性と利点を説明するために提示されている。上記の開示と以下の特許請求の範囲に基づき、他の配置、実施形態、実施例、均等物も、特許請求の範囲により定義されるその範囲から逸脱することなく、利用してよい。
【図１】
0005890071.tif 000002
【図２】
0005890071.tif 000003
【図３】
0005890071.tif 000004
【図４】
0005890071.tif 000005
【図５】
0005890071.tif 000006
【図６】
0005890071.tif 000007