(57)【特許請求の範囲】
【請求項１】
複数のノードを含む分散型データベースシステムにおいてデータベーストランザクションを管理するための方法であって、
前記複数のノードのうちの第１のノードに、前記システム内のトランザクションの第１の複数のレコードを維持するステップであって、前記第１の複数のレコードの中の各レコードが、トランザクションに関連付けられ、前記トランザクションの開始時間、及び前記トランザクションの前記開始時間にアクティブであった最も古いトランザクションの開始時間を含み、前記第１の複数のレコードの中のレコードのうちの１つが、前記システム内の最も古い現在アクティブなトランザクションのレコードである、前記第１の複数のレコードを維持するステップと、
前記複数のノードのうちの第２のノードに、トランザクションの第２の複数のレコードを維持するステップであって、前記第２の複数のレコードが、前記第２のノードに関連する完了したトランザクションのレコードを含み、前記第２の複数のレコードの中の各レコードが、トランザクション開始時間及びトランザクション終了時間を含む、前記第２の複数のレコードを維持するステップと、
前記システム内の前記最も古い現在アクティブなトランザクションのトランザクション開始時間にアクティブであった最も古いトランザクションの開始時間を含む、前記第１のノードからのメッセージを、前記第２のノードにおいて受信するステップと、
前記最も古いトランザクションの前記開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを前記第２の複数のレコードから削除するステップとを含む、前記方法。
【請求項２】
第１のノードからのメッセージの要求を第２のノードから送信するステップをさらに含む、請求項１に記載の方法。
【請求項３】
システム内のアクティブなトランザクションのレコードを含む第３の複数のレコードを含む第１のノードからのメッセージを第２のノードにおいて受信するステップであって、前記第３の複数のレコードの中の各レコードが、トランザクション開始時間を含む、前記受信するステップと、
第２の複数のレコードの中の完了したトランザクションの各レコードに関して、前記第３の複数のレコードに基づいて前記レコードを削除すべきかどうかを決定するステップとをさらに含む、請求項１又は２に記載の方法。
【請求項４】
第３の複数のレコードに基づいてレコードを削除すべきかどうかを決定するステップが、前記第３の複数のレコードの中のアクティブなトランザクションのレコードのトランザクション開始時間を、完了したトランザクションのレコードのトランザクション開始時間に始まり、前記完了したトランザクションの前記レコードのトランザクション終了時間に終わる時間間隔と比較することを含む、請求項３に記載の方法。
【請求項５】
第３の複数のレコードに基づいてレコードを削除すべきかどうかを決定するステップが、前記第３の複数のレコードの中のアクティブなトランザクションのレコードのトランザクション開始時間のいずれも、完了したトランザクションのレコードのトランザクション開始時間に始まり、前記完了したトランザクションの前記レコードのトランザクション終了時間に終わる時間間隔内にない場合に第２の複数のレコードから前記完了したトランザクションの前記レコードを削除することを含む、請求項４に記載の方法。
【請求項６】
第３の複数のレコードに基づいてレコードを削除すべきかどうかを決定するステップが、前記第３の複数のレコードの中のアクティブなトランザクションのレコードが、完了したトランザクションのレコードのトランザクション開始時間に始まり、前記完了したトランザクションの前記レコードのトランザクション終了時間に終わる時間間隔内のトランザクション開始時間に関連付けられる場合に第２の複数のレコードに前記完了したトランザクションの前記レコードを残すことを含む、請求項４に記載の方法。
【請求項７】
第３の複数のレコードに基づいてレコードを削除するかどうかを決定するステップが、最も古いトランザクションの開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを第２の複数のレコードから削除した後に行われる、請求項３に記載の方法。
【請求項８】
第２のノードに関連するデータ要素にアクセスするための第１のトランザクションを前記第２のノードにおいて受信するステップと、
前記第２のノードに、前記第２のノードでアクティブなトランザクションのレコードを含む第３の複数のレコードを維持するステップと、
前記第１のトランザクションが、第２の複数のレコード及び前記第３の複数のレコードのうちの一方又は両方に基づいて前記データ要素の複数のバージョンのうちの前記データ要素のバージョンにアクセスすることを許容されるかどうかを決定するステップとをさらに含む、請求項１〜７のいずれかに記載の方法。
【請求項９】
第１のトランザクションが、第２の複数のレコード及び第３の複数のレコードのうちの一方又は両方に基づいてデータ要素のバージョンにアクセスすることを許容されるかどうかを決定するステップが、
前記データ要素の前記バージョンに関連する第２のトランザクションのレコードが前記第３の複数のレコードに含まれるかどうかを決定し、含まれる場合、前記第１のトランザクションが前記データ要素にアクセスすることを許容されると決定することと、
前記第２のトランザクションの前記レコードが前記第３の複数のレコードに含まれない場合、前記第２のトランザクションの前記レコードが前記第２の複数のレコードに含まれるかどうかを決定し、含まれる場合、前記第１のトランザクションの開始時間を前記第２のトランザクションの終了時間と比較して、前記第１のトランザクションが前記データ要素にアクセスすることを許容されるかどうかを決定することと、
前記第２のトランザクションの前記レコードが前記第２の複数のレコード又は前記第３の複数のレコードに含まれない場合、前記第１のトランザクションが前記データ要素にアクセスすることを許容されると決定することとを含む、請求項８に記載の方法。
【請求項１０】
第２のトランザクションのトランザクション終了時間が第１のトランザクションのトランザクション開始時間よりも前に発生した場合、及び第２の複数のレコードの中に第３のトランザクションのレコードが存在しない場合、前記第１のトランザクションがデータ要素のバージョンを読み取ることを許容され、前記第３のトランザクションが、前記データ要素の第２のバージョンを書き込み済みであり、前記第２のトランザクションの前記トランザクション終了時間の後、及び前記第１のトランザクションの前記トランザクション開始時間の前に発生するトランザクション終了時間を有する、請求項９に記載の方法。
【請求項１１】
第１のトランザクションが、データ要素のバージョンが前記第１のトランザクションによって書き込まれた場合に前記データ要素の前記バージョンを読み取ることを許容される、請求項９に記載の方法。
【請求項１２】
第２のトランザクションのトランザクション開始時間が第１のトランザクションのトランザクション開始時間の後に発生した場合、前記第１のトランザクションが、データ要素のバージョンを読み取ることを許容されない、請求項９に記載の方法。
【請求項１３】
第２の複数のレコードの完了したトランザクションのレコードが、前記レコードのトランザクション終了時間に基づいて順序付けられる、請求項１〜１２のいずれかに記載の方法。
【請求項１４】
最も古いアクティブなトランザクションのレコードのトランザクション開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを第２の複数のレコードから削除するステップが、
前記最も古いトランザクションの前記レコードの前記トランザクション開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのレコードが特定されるまで、前記第２の複数のレコードの中の最も新しく完了したトランザクションのレコードから始まる順序で、前記第２の複数のレコードを通じて繰り返すステップと、
前記第２の複数のレコードから特定されたレコードを削除するステップを含む請求項１３に記載の方法。
【請求項１５】
第２の複数のレコードから特定されたレコードのトランザクション終了時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを削除するステップをさらに含む請求項１３に記載の方法。
【請求項１６】
複数のノードを含む分散型データベースシステムにおいてデータベーストランザクションを管理するための、ソフトウェアを非一時的形態で記憶するコンピュータ可読媒体であって、前記ソフトウェアが、コンピューティングシステムに、
前記複数のノードのうちの第１のノードに、前記システム内のトランザクションの第１の複数のレコードを維持することであって、前記第１の複数のレコードの中の各レコードが、トランザクションに関連付けられ、前記トランザクションの開始時間、及び前記トランザクションの前記開始時間にアクティブであった最も古いトランザクションの開始時間を含み、前記第１の複数のレコードの中のレコードのうちの１つが、前記システム内の最も古い現在アクティブなトランザクションのレコードである、前記第１の複数のレコードを維持することと、
前記複数のノードのうちの第２のノードに、トランザクションの第２の複数のレコードを維持することであって、前記第２の複数のレコードが、前記第２のノードに関連する完了したトランザクションのレコードを含み、前記第２の複数のレコードの中の各レコードが、トランザクション開始時間及びトランザクション終了時間を含む、前記第２の複数のレコードを維持することと、
前記システム内の前記最も古い現在アクティブなトランザクションのトランザクション開始時間にアクティブであった最も古いトランザクションの開始時間を含む、前記第１のノードからのメッセージを、前記第２のノードにおいて受信することと、
前記最も古いトランザクションの前記開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを前記第２の複数のレコードから削除することとを行わせるための命令を含む、前記コンピュータ可読媒体。
【請求項１７】
データベーストランザクションを管理するための装置であって、
分散型データベースシステム内に配置された複数のノードであって、各ノードが、少なくとも１つのプロセッサを含む、前記複数のノードと、
前記複数のノードの間で情報を送信及び受信するために前記複数のノードのポートを接続する通信媒体とを含み、
前記複数のノードのうちの第１のノードが、前記システム内のトランザクションの第１の複数のレコードを維持するように構成され、前記第１の複数のレコードの中の各レコードが、トランザクションに関連付けられ、前記トランザクションの開始時間、及び前記トランザクションの前記開始時間にアクティブであった最も古いトランザクションの開始時間を含み、前記第１の複数のレコードの中のレコードのうちの１つが、前記システム内の最も古い現在アクティブなトランザクションのレコードであり、
前記複数のノードのうちの第２のノードが、トランザクションの第２の複数のレコードを維持するように構成され、前記第２の複数のレコードが、前記第２のノードに関連する完了したトランザクションのレコードを含み、前記第２の複数のレコードの中の各レコードが、トランザクション開始時間及びトランザクション終了時間を含み、
前記第２のノードが、前記システム内の前記最も古い現在アクティブなトランザクションのトランザクション開始時間にアクティブであった最も古いトランザクションの開始時間を含む、前記第１のノードからのメッセージを受信するように構成され、
前記第２のノードが、前記最も古いトランザクションの前記開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを前記第２の複数のレコードから削除するように構成される、前記装置。
【発明の詳細な説明】
【技術分野】
【０００１】
関連出願の相互参照
本出願は、２０１５年７月１０日に出願した米国特許出願第６２／１９０，８４３号明細書の優先権を主張するものである。
【０００２】
この説明は、分散型データベースシステムのネットワークを用いるデータベースアクセス制御を提供する方法及びアーキテクチャに関する。
【背景技術】
【０００３】
データベースは、ソフトウェアプログラムを使用して管理し問い合わせることができる永続的なデータの構造化された組である。トランザクション型（transactional）データベース管理システムは、データベース「トランザクション」を使用してデータベース内のデータに働きかける（例えば、記憶する及び操作する）リレーショナルデータベースシステムである。概して、データベーストランザクションは、データベースに対してデータベース管理システムによって実施される（１又は２以上の操作を含む）単一の作業単位を象徴する。データベーストランザクションが確実に処理されることを保証するために、データベーストランザクションは、原子性がなければならず（つまり、その１若しくは２以上の操作のすべてを含むトランザクションがすべて完了するか若しくは何らの影響も与えないかのどちらかでなければならず）、一貫性がなければならず（つまり、トランザクションがデータベースをある有効な状態から別の有効な状態へと移さなければならず）、独立性がなければならず（つまり、同時に実行されるトランザクションがデータベース内で、それらのトランザクションが逐次的に実行されたとした場合に至るのと同じ状態に至り）、永続性がなければならない（つまり、コミットされたトランザクションがシステムのクラッシュ、エラー、及びその他の問題に関係なくコミットされたままである）。データベーストランザクションのこの１組の特性は、「ＡＣＩＤ」と呼ばれることがある。
【発明の概要】
【課題を解決するための手段】
【０００４】
態様においては、概して、複数のノードを含む分散型データベースシステムにおいてデータベーストランザクションを管理するための方法が、複数のノードのうちの第１のノードに、システム内のトランザクションの第１の複数のレコードを維持するステップであって、第１の複数のレコードの中の各レコードが、トランザクションに関連付けられ、トランザクションの開始時間、及びトランザクションの開始時間にアクティブであった最も古いトランザクションの開始時間を含み、第１の複数のレコードの中のレコードのうちの１つが、システム内の最も古い現在アクティブなトランザクションのレコードである、ステップと、複数のノードのうちの第２のノードに、トランザクションの第２の複数のレコードを維持するステップであって、第２の複数のレコードが、第２のノードに関連する完了したトランザクションのレコードを含み、第２の複数のレコードの中の各レコードが、トランザクション開始時間及びトランザクション終了時間を含む、ステップと、システム内の最も古い現在アクティブなトランザクションのトランザクション開始時間にアクティブであった最も古いトランザクションの開始時間を含む、第１のノードからのメッセージを、第２のノードにおいて受信するステップと、最も古いトランザクションの開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを第２の複数のレコードから削除するステップとを含む。
【０００５】
態様は、以下の特徴のうちの１又は２以上を含み得る。
【０００６】
方法は、第１のノードからのメッセージの要求を第２のノードから送信するステップをさらに含む。
【０００７】
方法は、システム内のアクティブなトランザクションのレコードを含む第３の複数のレコードを含む第１のノードからのメッセージを第２のノードにおいて受信するステップであって、第３の複数のレコードの中の各レコードが、トランザクション開始時間を含む、ステップと、第２の複数のレコードの中の完了したトランザクションの各レコードに関して、第３の複数のレコードに基づいてレコードを削除すべきかどうかを決定するステップとをさらに含む。
【０００８】
第３の複数のレコードに基づいてレコードを削除すべきかどうかを決定するステップは、第３の複数のレコードの中のアクティブなトランザクションのレコードのトランザクション開始時間を、完了したトランザクションのレコードのトランザクション開始時間に始まり、完了したトランザクションのレコードのトランザクション終了時間に終わる時間間隔と比較することを含む。
【０００９】
第３の複数のレコードに基づいてレコードを削除すべきかどうかを決定するステップは、第３の複数のレコードの中のアクティブなトランザクションのレコードのトランザクション開始時間のいずれも、完了したトランザクションのレコードのトランザクション開始時間に始まり、完了したトランザクションのレコードのトランザクション終了時間に終わる時間間隔内にない場合に第２の複数のレコードから完了したトランザクションのレコードを削除することを含む。
【００１０】
第３の複数のレコードに基づいてレコードを削除すべきかどうかを決定するステップは、第３の複数のレコードの中のアクティブなトランザクションのレコードが、完了したトランザクションのレコードのトランザクション開始時間に始まり、完了したトランザクションのレコードのトランザクション終了時間に終わる時間間隔内のトランザクション開始時間に関連付けられる場合に第２の複数のレコードに完了したトランザクションのレコードを残すことを含む。
【００１１】
第３の複数のレコードに基づいてレコードを削除するかどうかを決定するステップは、最も古いトランザクションの開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを第２の複数のレコードから削除した後に行われる。
【００１２】
方法は、第２のノードに関連するデータ要素にアクセスするための第１のトランザクションを第２のノードにおいて受信するステップと、第２のノードに、第２のノードのアクティブなトランザクションのレコードを含む第３の複数のレコードを維持するステップと、第１のトランザクションが、第２の複数のレコード及び第３の複数のレコードのうちの一方又は両方に基づいてデータ要素の複数のバージョンのうちのデータ要素のバージョンにアクセスすることを許容されるかどうかを決定するステップとをさらに含む。
【００１３】
第１のトランザクションが、第２の複数のレコード及び第３の複数のレコードのうちの一方又は両方に基づいてデータ要素のバージョンにアクセスすることを許容されるかどうかを決定するステップは、データ要素のバージョンに関連する第２のトランザクションのレコードが第３の複数のレコードに含まれるかどうかを決定し、含まれる場合、第１のトランザクションがデータ要素にアクセスすることを許容されると決定することと、第２のトランザクションのレコードが第３の複数のレコードに含まれない場合、第２のトランザクションのレコードが第２の複数のレコードに含まれるかどうかを決定し、含まれる場合、第１のトランザクションの開始時間を第２のトランザクションの終了時間と比較して、第１のトランザクションがデータ要素にアクセスすることを許容されるかどうかを決定することと、第２のトランザクションのレコードが第２の複数のレコード又は第３の複数のレコードに含まれない場合、第１のトランザクションがデータ要素にアクセスすることを許容されると決定することとを含む。
【００１４】
第２のトランザクションのトランザクション終了時間が第１のトランザクションのトランザクション開始時間よりも前に発生した場合、及び第２の複数のレコードの中に第３のトランザクションのレコードが存在しない場合、第１のトランザクションがデータ要素のバージョンを読み取ることを許容され、第３のトランザクションは、データ要素の第２のバージョンを書き込み済みであり、第２のトランザクションのトランザクション終了時間の後、及び第１のトランザクションのトランザクション開始時間の前に発生するトランザクション終了時間を有する。
【００１５】
第１のトランザクションは、データ要素のバージョンが第１のトランザクションによって書き込まれた場合にデータ要素のバージョンを読み取ることを許容される。
【００１６】
第２のトランザクションのトランザクション開始時間が第１のトランザクションのトランザクション開始時間の後に発生した場合、第１のトランザクションは、データ要素のバージョンを読み取ることを許容されない。
【００１７】
第２の複数のレコードの完了したトランザクションのレコードは、レコードのトランザクション終了時間に基づいて順序付けられる。
【００１８】
最も古いアクティブなトランザクションのレコードのトランザクション開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを第２の複数のレコードから削除するステップは、最も古いトランザクションのレコードのトランザクション開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのレコードが特定されるまで、第２の複数のレコードの中の最も新しく完了したトランザクションのレコードから始まる順序で、第２の複数のレコードに繰り返し適用されることと、第２の複数のレコードから特定されたレコードを削除することとを含む。
【００１９】
方法は、第２の複数のレコードから特定されたレコードのトランザクション終了時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを削除するステップをさらに含む。
【００２０】
別の態様においては、概して、複数のノードを含む分散型データベースシステムにおいてデータベーストランザクションを管理するためのコンピュータ可読媒体が、ソフトウェアを非一時的形態で記憶し、ソフトウェアは、コンピューティングシステムに、複数のノードのうちの第１のノードに、システム内のトランザクションの第１の複数のレコードを維持することであって、第１の複数のレコードの中の各レコードが、トランザクションに関連付けられ、トランザクションの開始時間、及びトランザクションの開始時間にアクティブであった最も古いトランザクションの開始時間を含み、第１の複数のレコードの中のレコードのうちの１つが、システム内の最も古い現在アクティブなトランザクションのレコードである、維持することと、複数のノードのうちの第２のノードに、トランザクションの第２の複数のレコードを維持することであって、第２の複数のレコードが、第２のノードに関連する完了したトランザクションのレコードを含み、第２の複数のレコードの中の各レコードが、トランザクション開始時間及びトランザクション終了時間を含む、維持することと、システム内の最も古い現在アクティブなトランザクションのトランザクション開始時間にアクティブであった最も古いトランザクションの開始時間を含む、第１のノードからのメッセージを、第２のノードにおいて受信することと、最も古いトランザクションの開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを第２の複数のレコードから削除することとを行わせるための命令を含む。
【００２１】
別の態様においては、概して、データベーストランザクションを管理するための装置が、分散型データベースシステム内に配置された複数のノードであって、各ノードが、少なくとも１つのプロセッサを含む、複数のノードと、複数のノードの間で情報を送信及び受信するために複数のノードのポートを接続する通信媒体とを含み、複数のノードのうちの第１のノードが、システム内のトランザクションの第１の複数のレコードを維持するように構成され、第１の複数のレコードの中の各レコードが、トランザクションに関連付けられ、トランザクションの開始時間、及びトランザクションの開始時間にアクティブであった最も古いトランザクションの開始時間を含み、第１の複数のレコードの中のレコードのうちの１つが、システム内の最も古い現在アクティブなトランザクションのレコードであり、複数のノードのうちの第２のノードが、トランザクションの第２の複数のレコードを維持するように構成され、第２の複数のレコードが、第２のノードに関連する完了したトランザクションのレコードを含み、第２の複数のレコードの中の各レコードが、トランザクション開始時間及びトランザクション終了時間を含み、第２のノードが、システム内の最も古い現在アクティブなトランザクションのトランザクション開始時間にアクティブであった最も古いトランザクションの開始時間を含む、第１のノードからのメッセージを受信するように構成され、第２のノードが、最も古いトランザクションの開始時間の前に発生するトランザクション終了時間を有する完了したトランザクションのすべてのレコードを第２の複数のレコードから削除するように構成される。
【００２２】
別の態様においては、概して、複数のノードを含む分散型データベースシステムにおいて潜在的に同時にあるトランザクションを管理するための方法が、複数のノードのうちの第１のノードに、複数のトランザクションのレコードを維持するステップであって、各トランザクションが、複数のノードのうちの１又は２以上上で実行され、各レコードが、複数のトランザクションの状態のうちのトランザクションの状態を有し、レコードが、第１のトランザクションに関するレコード及び第２のトランザクションに関するレコードを含み、複数のノードのうちの第２のノードにおける第１のトランザクションの実行が、第２のノードに記憶された第１のデータ要素にアクセスするための操作を含み、第２のノードにおける第２のトランザクションの実行が、第２のノードに記憶された第１のデータ要素にアクセスするための操作を含む、ステップと、第２のノード上で実行され、第２のトランザクションの開始時に第１のトランザクションの状態を有する複数のトランザクションのいずれかを含むトランザクションのリストを第１のノードから第２のノードにおいて受信するステップであって、トランザクションのリストが、第１のトランザクションを含む、ステップと、トランザクションのリストに少なくとも部分的に基づいて、第２のトランザクションの結果が第１のトランザクションの結果に依存すると決定するステップと、決定に基づいて第１のトランザクションが完了するまで第２のトランザクションの実行を中断するステップとを含む。
【００２３】
態様は、以下の特徴のうちの１又は２以上を含み得る。
【００２４】
トランザクションのリストに少なくとも部分的に基づいて、第２のトランザクションの結果が第１のトランザクションの結果に依存すると決定するステップは、第１のトランザクションの開始の時間が第２のトランザクションの開始の時間よりも前に発生し、第１のトランザクションのコミット時間が第２のトランザクションの開始の時間よりも前に発生すると決定することを含む。
【００２５】
トランザクションのリストは、第２のトランザクションの開始時に第２のノードにおいて受信される。
【００２６】
トランザクションのリストに含まれるトランザクションは、第２のノード上で実行され、第２のトランザクションの開始時に第１のトランザクションの状態を有するトランザクションからなる。
【００２７】
トランザクションのリストは、トランザクションのリストの中の各トランザクションに関して、トランザクションの開始の時間を含む。
【００２８】
第１のトランザクションの状態は、トランザクションが完了する準備をしていることを示す。
【００２９】
第１のトランザクションは、第１のデータ要素を書き込み、第２のトランザクションは、第１のデータ要素を読み取り、第２のトランザクションによって読み取られる第１のデータ要素のバージョンは、第１のトランザクションの結果に依存する。
【００３０】
第１のトランザクションのあり得る結果は、トランザクションがアボートされる結果及びトランザクションがコミットされる結果を含む。
【００３１】
方法は、第１のトランザクションの結果がトランザクションがアボートされる結果である場合、第１のデータ要素の第１のバージョンを読み取ることを含め、第１のトランザクションの完了後に第２のトランザクションの実行を再開するステップをさらに含む。
【００３２】
方法は、第１のトランザクションの結果がトランザクションがコミットされる結果である場合、第１のトランザクションによって書き込まれた第１のデータ要素の第２の異なるバージョンを読み取ることを含め、第１のトランザクションの完了後に第２のトランザクションの実行を再開するステップをさらに含む。
【００３３】
第１のトランザクション及び第２のトランザクションのうちの一方又は両方は、複数のノードのうちの第３のノードに記憶されたデータ要素にアクセスする。
【００３４】
第１のトランザクションと第２のトランザクションとの両方は、第１のデータ要素に書き込もうと試み、第２のトランザクションは、第１のトランザクションの状態にある。
【００３５】
トランザクションのリストに少なくとも部分的に基づいて、第２のトランザクションの結果が第１のトランザクションの結果に依存すると決定するステップは、第２のトランザクションの開始の時間が第１のトランザクションの開始の時間の後、及び第１のトランザクションのコミット時間の前に発生すると決定することを含む。
【００３６】
第１のトランザクションは、第２のトランザクションの前にその第１のトランザクションの書き込みをコミットするようにスケジューリングされ、第２のトランザクションがアボートされるか否かは、第１のトランザクションが、トランザクションがアボートされる結果となるのか又はトランザクションがコミットされる結果となるのかに依存する。
【００３７】
方法は、第１のトランザクションの結果がトランザクションがアボートされる結果である場合、第１のデータ要素の第１の値を書き込むことを含め、第１のトランザクションの完了後に第２のトランザクションの実行を再開するステップをさらに含む。
【００３８】
方法は、第１のトランザクションの結果がトランザクションがコミットされる結果である場合、第２のトランザクションをアボートすることを含め、第１のトランザクションの完了後に第２のトランザクションの実行を再開するステップをさらに含む。
【００３９】
別の態様においては、概して、コンピュータ可読媒体が、複数のノードを含む分散型データベースシステムにおいて潜在的に同時にあるトランザクションを管理するためのソフトウェアを非一時的形態で記憶し、ソフトウェアは、コンピューティングシステムに、複数のノードのうちの第１のノードに、複数のトランザクションのレコードを維持することであって、各トランザクションが、複数のノードのうちの１又は２以上上で実行され、各レコードが、複数のトランザクションの状態のうちのトランザクションの状態を有し、レコードが、第１のトランザクションに関するレコード及び第２のトランザクションに関するレコードを含み、複数のノードのうちの第２のノードにおける第１のトランザクションの実行が、第２のノードに記憶された第１のデータ要素にアクセスするための操作を含み、第２のノードにおける第２のトランザクションの実行が、第２のノードに記憶された第１のデータ要素にアクセスするための操作を含む、維持することと、第２のノード上で実行され、第２のトランザクションの開始時に第１のトランザクションの状態を有する複数のトランザクションのいずれかを含むトランザクションのリストを第１のノードから第２のノードにおいて受信することであって、トランザクションのリストが、第１のトランザクションを含む、受信することと、トランザクションのリストに少なくとも部分的に基づいて、第２のトランザクションの結果が第１のトランザクションの結果に依存すると決定することと、決定に基づいて第１のトランザクションが完了するまで第２のトランザクションの実行を中断することとを行わせるための命令を含む。
【００４０】
別の態様においては、概して、潜在的に同時にあるトランザクションを管理するための装置が、分散型データベースシステム内に配置された複数のノードであって、各ノードが、少なくとも１つのプロセッサを含む、複数のノードと、複数のノードの間で情報を送信及び受信するために複数のノードのポートを接続する通信媒体とを含み、複数のノードのうちの第１のノードが、複数のトランザクションのレコードを維持するように構成され、各トランザクションが、複数のノードのうちの１又は２以上上で実行され、各レコードが、複数のトランザクションの状態のうちのトランザクションの状態を有し、レコードが、第１のトランザクションに関するレコード及び第２のトランザクションに関するレコードを含み、複数のノードのうちの第２のノードにおける第１のトランザクションの実行が、第２のノードに記憶された第１のデータ要素にアクセスするための操作を含み、第２のノードにおける第２のトランザクションの実行が、第２のノードに記憶された第１のデータ要素にアクセスするための操作を含み、第２のノードが、第２のノード上で実行され、第２のトランザクションの開始時に第１のトランザクションの状態を有する複数のトランザクションのいずれかを含むトランザクションのリストを第１のノードから受信するように構成され、トランザクションのリストが、第１のトランザクションを含み、第２のノードが、トランザクションのリストに少なくとも部分的に基づいて、第２のトランザクションの結果が第１のトランザクションの結果に依存すると決定するように構成され、第２のノードが、決定に基づいて第１のトランザクションが完了するまで第２のトランザクションの実行を中断するように構成される。
【００４１】
態様は、以下の利点のうちの１又は２以上を有する可能性がある。
【００４２】
ノードのネットワーク内に配置された分散型データベースシステムが、広い地域にわたって発生する時間当たりの大量のトランザクションを処理することを可能にし得る。例えば、グローバルな物流プロセス又はクレジットカードプロセスは、世界中でわずかな量の時間に多数のトランザクションを伴う可能性がある。しかし、そのような膨大な量のトランザクション、及びデータに適用されている関連する操作は、特にトランザクションがほぼ同時に発生し、同じデータを使用する場合、トランザクションの意味のある結果を得るために調整される（又は管理される）必要がある。
【００４３】
本明細書において説明される態様は、多版型同時実行制御（multi-version concurrency control）を使用して実装された分散型データベースシステムを含む。概して、多版型同時実行制御は、特定のデータ要素のいくつかの異なるバージョン（すなわち、一意に特定され得る及び独立して修正され得るコピー）が分散型データベースシステム内で保持されることを可能にする。データ要素の新しいバージョンが生成されることを許容することは、そうではなく、各データ要素の単一のバージョンのみが維持されるときに同じデータ要素への同時（及び潜在的に競合する）アクセスを防止するために使用される必要がある可能性がある特定のロックプロトコルの必要を回避する。そのようなロックによって引き起こされるより長い待ち時間も回避される可能性があり、潜在的にシステム全体の性能を高める。
【００４４】
分散型データベースシステムにおいて多版型同時実行制御を使用するとき、いくつかの実用上の問題が生じる。例えば、複数の同時トランザクションが同じデータ要素にアクセスするとき、トランザクションのうちのどれがそれらの作業をコミットすることを許容されるのかに関する曖昧性が生じ得る。一部の通常の分散型データベースシステムは、トランザクションの潜在的に無駄であり、早計であり、誤っている可能性があるアボートを結果として生じるような方法でこれらの曖昧性を解決する。本明細書において説明される態様は、トランザクションの潜在的に無駄であり、早計であり、誤っている可能性があるアボートが避けられるような方法でこれらの曖昧性をすっきりと解決するように構成される。
【００４５】
限られたメモリ及びストレージ容量を有する実際の分散型データベースシステムにおいては、データ要素の余りに多くの以前のバージョンを保持しておくことが、望ましくない量のメモリ及び／又はストレージ容量の消費をもたらす可能性がある。本明細書において説明される態様は、データ要素のどの以前のバージョンがもはや必要とされないのかをより正確に決定し、データ要素のそれらの必要とされない以前のバージョンのみを削除することによってデータ要素の不必要な使われていない以前のバージョンをうまく処分する。その他の目的のためのメモリ及び／又はストレージ容量の可用性の高まりは、システム全体の性能の助けとなる。
【００４６】
態様の中でもとりわけ、本明細書に記載の分散型データベースシステムは、そのような分散型マルチノードデータベースシステム上で多版型同時実行制御及び競合解決を実施する。有利なことに、態様は、トランザクションの状態を含むトランザクションのレコードを、トランザクションが実行されているデータベースのノードのローカルと、マルチノードデータベースのリーダーノードとの両方に維持する。有利なことに、トランザクションのレコードは、分散型データベースシステムのネットワーク中の同時トランザクションに対するきめ細かい制御を可能にする。
【００４７】
有利なことに、特定の態様は、競合の防止を同時に可能にしながらデータ要素の複数のバージョンがデータベースシステム内に存在することを可能にする多版型同時実行制御のスナップショット分離（snapshot isolation）の形態を使用する。有利なことにトランザクションとデータベース内のデータのバージョンとの両方が、トランザクションの間の時間的関係を符号化し、同時トランザクションの間の競合解決のためのメカニズムを提供するタイムスタンプ又は同様のトランザクション識別子に関連付けられる。
【００４８】
データ要素の複数のバージョンを維持する１つの利点は、データ要素にアクセスするトランザクションが容易にアボートされる可能性があり、データ要素の前のバージョンに戻ることによってトランザクションに関連する変更が容易にアンドゥされる(undone)可能性があることである。
【００４９】
有利なことに、特定の態様は、２段階コミット手順を利用してトランザクションの原子性(atomicity)を保証する。
【００５０】
態様は、分散型データベースシステム内の競合状態及び／又は曖昧性の影響を軽減し、それによって、トランザクションの早計なアボートを避けることができる。
【００５１】
分散型データベースシステムのノードは、前に完了したか又はノード上でアクティブであるトランザクションのレコードを維持する。トランザクションのレコードは、分散型データベースシステム内の競合状態及び／又は曖昧性を特定するために使用される。ノードは、トランザクションの関連性のあるレコードのみがノードに維持され、関連性のないレコードがノードに維持されないことを保証するためのパージ手順を実施する。パージは、下でより詳細に説明されるように、パージがシステム内のその他の有用な処理を過度に妨げないような効率的な方法で実施され得る。パージは、データ要素の複数のバージョンを有する可能性がある、同じデータにアクセスする複数のトランザクションの間の競合を防止するための後続の処理も容易にする可能性がある。
【００５２】
本発明のその他の特徴及び利点は、以下の説明及び請求項から明らかになるであろう。
【図面の簡単な説明】
【００５３】
【図１】分散型データベースシステムを含むデータ処理システムのブロック図である。
【図２】分散型データベースシステムに参加（join）する書き込み操作を含むトランザクションを示すブロック図である。
【図３】分散型データベースに対してトランザクションの操作を実行する図２のトランザクションを示すブロック図である。
【図４】リーダーノードから準備メッセージ（prepare message）を受信する図２のトランザクションを示すブロック図である。
【図５】リーダーノードにＯＫメッセージを送信する図２のトランザクションを示すブロック図である。
【図６】リーダーノードからコミットメッセージを受信する図２のトランザクションを示すブロック図である。
【図７】分散型データベースシステムに参加する読み取り操作を含むトランザクションを示すブロック図である。
【図８】分散型データベースに対してトランザクションの操作を実行する図７のトランザクションを示すブロック図である。
【図９】リーダーノードから準備メッセージを受信する図７のトランザクションを示すブロック図である。
【図１０】リーダーノードにＯＫメッセージを送信する図７のトランザクションを示すブロック図である。
【図１１】リーダーノードからコミットメッセージを受信する図７のトランザクションを示すブロック図である。
【図１２】最適化された分散型データベース書き込みアルゴリズムのステップを示す流れ図である。
【図１３】分散型データベースシステム内のアクティブな第１のトランザクション及び第２のトランザクションを示すブロック図である。
【図１４】図１２の分散型データベースシステム内でリーダーノードから準備メッセージを受信する第１のトランザクションを示すブロック図である。
【図１５】リーダーノードから完了するトランザクション識別子のリストを含む準備メッセージを受信し、第１のトランザクションが完了するまでスリープする図１４の第２のトランザクションを示すブロック図である。
【図１６】リーダーノードにＮｏｔ  ＯＫメッセージを送信する図１２の第１のトランザクションを示すブロック図である。
【図１７】リーダーノードからアボートメッセージを受信する図１２の第１のトランザクション及び中断から覚める図１２の第２のトランザクションを示すブロック図である。
【図１８】リーダーノードにＯＫメッセージを送信する図１２の第２のトランザクションを示すブロック図である。
【図１９】リーダーノードからコミットメッセージを受信する図１２の第２のトランザクションを示すブロック図である。
【図２０】最適化された分散型データベース読み取りアルゴリズムのステップを示す流れ図である。
【図２１】分散型データベースシステム内でリーダーノードから準備メッセージを受信する第１のトランザクションを示すブロック図である。
【図２２】図１９の分散型データベースシステムに参加する読み取り操作を含む第２のトランザクションを示すブロック図である。
【図２３】完了するトランザクションのリストを受信し、図２２の第２のトランザクションが分散型データベースシステム上でその第２のトランザクションの操作を安全に実施できるまでスリープする図２２の第２のトランザクションを示すブロック図である。
【図２４】リーダーノードにＯＫメッセージを送信する図１９の第１のトランザクションを示すブロック図である。
【図２５】リーダーノードからコミットメッセージを受信する図１９の第１のトランザクション及び中断から覚める図２２の第２のトランザクションを示すブロック図である。
【図２６】リーダーノードから準備メッセージを受信する図２２の第２のトランザクションを示すブロック図である。
【図２７】リーダーノードにＯＫメッセージを送信する図２２の第２のトランザクションを示すブロック図である。
【図２８】リーダーノードからコミットメッセージを受信する図２２の第２のトランザクションを示すブロック図である。
【図２９】順序が狂ったメッセージの処理アルゴリズムのステップを示す流れ図である。
【図３０】分散型データベースシステム内のアクティブな第１のトランザクション及び第２のトランザクションを示すブロック図である。
【図３１】第１のトランザクションに関するＥＮＤ＿ＴＲＡＮＳメッセージを受信する図２７の分散型データベースシステム内のリーダーノードを示すブロック図である。
【図３２】第２のトランザクションに関するＥＮＤ＿ＴＲＡＮＳメッセージを受信する図２７の分散型データベースシステム内のリーダーノードを示すブロック図である。
【図３３】第１のトランザクションが準備メッセージを受信する前にリーダーノードから完了するトランザクション識別子のリストを含む準備メッセージを受信し、第１のトランザクションが完了するまでスリープする図２７の第２のトランザクションを示すブロック図である。
【図３４】準備メッセージを受信する図２７の第１のトランザクションを示すブロック図である。
【図３５】リーダーノードにＯＫメッセージを送信する図２７の第１のトランザクションを示すブロック図である。
【図３６】リーダーノードからコミットメッセージを受信する図２７の第１のトランザクションを示すブロック図である。
【図３７】目を覚まし、リーダーノードにＮｏｔ  ＯＫメッセージを送信する図２７の第２のトランザクションを示すブロック図である。
【図３８】リーダーノードからアボートメッセージを受信する図２７の第２のトランザクションを示すブロック図である。
【図３９】分散型データベースシステム内でリーダーノードにＰｕｒｇｅ  Ｒｅｑｕｅｓｔ  Ｍｅｓｓａｇｅを送信する第１のノードを示すブロック図である。
【図４０】最下点（low water mark）及びアクティブなトランザクションのリストを含むメッセージを第１のノードに送り返す図３９のリーダーノードを示し、クイックパージ（quick purge）操作を実施する第１のノードを示すブロック図である。
【図４１】最下点及びアクティブなトランザクションのリストを含むメッセージを第１のノードに送り返す図３９のリーダーノードを示し、完全パージ（thorough purge）操作を実施する第１のノードを示すブロック図である。
【発明を実施するための形態】
【００５４】
図１は、分散型データベースシステム１０２を含むデータ処理システム１００の例を示す。分散型データベースシステム１０２は、通信ネットワーク１０６（例えば、ＷＡＮ、ＬＡＮ、又はマルチプロセッサシステム内若しくはチップ上のネットワーク）を介してＭ個のデータベースクライアント１０４と通信する。
【００５５】
１  分散型データベースシステム
分散型データベースシステム１０２は、データベースＤのフラグメントＤｎが割り振られるＮ個のノード（又は「パーティション」）１０８を含む。一部の例において、各ノード１０８は、サーバコンピューティングシステム上で実行されるサーバプロセスに対応する。一部の例においては、いくつかのノード１０８が、単一のプロセッサ若しくはコンピューティングマシン上にホストされる可能性があり、又はノード１０８は、（例えば、各ノード１０８が独自のプロセッサ上でホストされるようにして）複数のプロセッサ若しくはコンピューティングマシンに拡散される可能性がある。
【００５６】
各ノード１０８は、データベースＤのフラグメントが記憶されるデータストレージデバイス１１２と、データストレージデバイス１１２上のデータベースのフラグメントを管理するデータベースマネージャ１１０とを含む。ノード１０８のためのデータベースマネージャ１１０は、データストレージデバイス１１２上のデータベースのフラグメントとクライアント１０４及びその他のノード１０８などのノード１０８の外部のエンティティとの間のインターフェースとしても働く。
【００５７】
動作中、クライアント１０４は、データベースＤに対して実行するための１又は２以上のデータベーストランザクションを指定する。クライアント１０４によって指定されたトランザクションは、ノード１０８のデータベースマネージャ１１０のうちの１又は２以上に通信ネットワーク１０６を介して送信される。トランザクションがＮ個のノード１０８の第ｎのデータベースマネージャ１１０に到着するとき、第ｎのデータベースマネージャ１１０は、第ｎのデータベースマネージャ１１０によって管理される第ｎのデータストレージデバイス１１２上に記憶されるデータベースのフラグメントに対してトランザクションを実行させる。
【００５８】
一部の例において、トランザクションが複数のノード１０８に記憶されるデータベースの複数のフラグメントにアクセスするとき、第ｎのデータベースマネージャ１１０は、複数のノード１０８のデータベースマネージャ１１０にトランザクションを転送する。その他の例においては、トランザクションが生じたクライアント１０４が、トランザクションを完了するために必要とされる適切なノード１０８にトランザクションを送信する。さらにその他の例においては、トランザクションが生じたクライアント１０４が、リーダーノードにトランザクションを送信し、リーダーノードが、トランザクションを完了するために必要とされる適切なノード１０８にトランザクションを送信する。
【００５９】
１又は２以上のトランザクションが適切なノード１０８において受信されるようにして、１又は２以上のトランザクションが実行され、データベースにアクセスし得る。通常の集中的なトランザクション型データベースと同様に、１又は２以上のトランザクションが互いに競合し、一部のトランザクションが成功裏に完了し、その他のトランザクションが失敗する結果を生じる可能性があり、その時点で、それらのトランザクションは、それらのトランザクションの変更をアンドゥさせられ、再試行させられる。
【００６０】
一部の例において、上述のデータベースマネージャ１１０の各々は、タスクの中でもとりわけ、ノード１０８上で過去に実行されたか又は現在実行されている各トランザクションのレコードを維持するためのローカルトランザクションマネージャ１１４を含む。一部の例において、ローカルトランザクションマネージャ１１４によって維持されるトランザクションの各レコードは、トランザクションに関するトランザクション識別子（例えば、トランザクションの開始時間）、コミット識別子（例えば、トランザクションがコミットされた時間）、及びトランザクションの状態（例えば、ＡＣＴＩＶＥ、ＰＲＥＰＡＲＩＮＧ、ＣＯＭＭＩＴＴＥＤ、又はＡＢＯＲＴＩＮＧ）を含む。図に明示的に示されていないが、一部の例において、各データベースマネージャ１１０は、データベースマネージャ１１０によって管理されるデータストレージデバイス１１２上に記憶されるデータベースのフラグメントの管理に責任を負うデータプロセッサと、２つ以上のノード１０８上のデータベースフラグメントへのアクセスを必要とする要求を処理するためのアプリケーションプロセッサと、クライアント１０４及びその他のノード１０８と通信するための通信ソフトウェアとをさらに含む。
【００６１】
一部の例において、ノード１０８のうちの１つ（例えば、図１のノード２）が、「リーダー」ノードとして指定される。リーダーノードは、新しいトランザクションにトランザクション識別子を割り当て、トランザクションにコミット識別子を割り当て、分散型データベースシステム１０２内のさまざまなノード１０８間でコミット操作を調整する責任を負うグローバルトランザクションマネージャ１１６を含む。一部の例において、グローバルトランザクションマネージャ１１６は、分散型データベースシステム１０２内で現在アクティブであるすべてのトランザクションのレコードをさらに保有する。一部の例において、アクティブなトランザクションの各レコードは、トランザクションに関するトランザクション識別子（例えば、トランザクションの開始時間）、トランザクションに関するコミット識別子（例えば、トランザクションがコミットされた時間）、トランザクションが操作しているノードのリスト、及びトランザクションの状態（例えば、ＡＣＴＩＶＥ、ＰＲＥＰＡＲＩＮＧ、ＣＯＭＭＩＴＴＥＤ、又はＡＢＯＲＴＩＮＧ）を含む。
【００６２】
１．１  データベーストランザクション
概して、分散型データベースシステム１０２において動作する各データベーストランザクションは、トランザクションのライフタイムを表す時間間隔に関連付けられる。時間間隔を確立するために、データベースに対して動作するトランザクションＴが始まるとき、トランザクション識別子がＴに割り当てられる。トランザクション識別子は、分散型データベースシステム１０２内のトランザクションを特定するグローバルに区別可能な番号であり、トランザクションに関する開始時間（つまり、時間間隔の始め）を明記する。一部の例においては、そのような識別子を実現するために、トランザクション識別子は、時間の概念を伝える番号の単調増加シーケンスとして生じさせられる。例えば、第１のトランザクションＴ［１０］がトランザクション識別子「１０」を有し、第２のトランザクションＴ［２０］がトランザクション識別子「２０」を有するとき、Ｔ［１０］に関するトランザクション識別子がＴ［２０］に関するトランザクション識別子よりも前に来るので、Ｔ［２０］が開始する前にＴ［１０］が開始したことを認識し得る。
【００６３】
トランザクションがコミットする準備ができているとき、トランザクションは、トランザクションに関する終了時間（つまり、時間間隔の終わり）を明記するコミット識別子を割り当てられる。コミット識別子は、トランザクション識別子と同じ番号のシーケンスから生じ、やはり時間の概念を伝える。
【００６４】
一部の例において、表記Ｔ［ａ，ｂ］は、ａからｂまでの時間にわたるライフタイムを有するトランザクションを表すために使用される。トランザクション識別子ａは、コミット識別子ｂよりも常に小さい。現在アクティブなトランザクション（つまり、コミットしていないトランザクション）は、Ｔ［ａ，ＦＵＴＵＲＥ］と表される可能性があり、ｂ＝ＦＵＴＵＲＥと設定することは、トランザクションが将来の何らかの未知の時間に終わることを示唆する。一部の例において、現在アクティブなトランザクションは、省略表現Ｔ［ａ］を使用して表され、ｂ＝ＦＵＴＵＲＥであることが、含意される。
【００６５】
トランザクションに関連する時間間隔は、トランザクション間の関係についての情報を提供し得る。例えば、第１のトランザクションＴ［１０，１５］及び第２のトランザクションＴ［１６，２０］に関する時間間隔を調べることは、第１のトランザクションが終了した後に第２のトランザクションが始まるようにして２つのトランザクションが逐次的に実行されたという情報を提供する。第３のトランザクションＴ［１０，２０］及び第４のトランザクションＴ［１５，２５］に関する時間間隔を調べることは、２つのトランザクションが同時に実行されたという情報を提供する。本出願においては、２つのトランザクションのそれぞれのライフタイムが重なるとき、２つのトランザクションが同時に実行されていると考えられることが留意される。トランザクションのライフタイムは、トランザクション識別子に関連する時間に始まり、トランザクションが有用な仕事を実行するために活発に実行されている時間を含み、確認フェーズ（例えば、トランザクションに関連するＪＯＩＮ、ＰＲＥＰＡＲＥ、及びＣＯＭＭＩＴメッセージ／フェーズ）に関する時間を含み、コミット識別子に関連する時間に終わり、この時間の後、トランザクションは、完了したと考えられる。２つの同時トランザクションのうちの一方又は両方は、それらのトランザクションのライフタイムのいずれかの部分の間、有用な仕事を実行するためにそれらのトランザクションが活発に実行されていない中断（又は「スリープ」）状態である可能性があり、それらのトランザクションは、それらのトランザクションの重なり合うライフタイムのおかげで、やはり同時に実行されていると考えられる。
【００６６】
一部の例においては、新しいトランザクションが分散型データベースシステム１０２に到着するとき、トランザクションは、「参加」と呼ばれるプロセスを経る。参加するために、トランザクションは、ノード上のデータへのアクセスを要求し、ノードは、トランザクションの以前のレコードを持たない。要求を受信すると、ノードは、リーダーノード上のグローバルトランザクションマネージャ１１６に「参加」メッセージを送信し、メッセージは、ノードの名前（例えば、ノード１）を含む。グローバルトランザクションマネージャ１１６がメッセージを受信するとき、ノードは、トランザクションの参加者として登録される。
【００６７】
そして、グローバルトランザクションマネージャ１１６は、トランザクションに関するトランザクション識別子、トランザクションに関する「最下点」、及びトランザクションに関する「完了するトランザクション識別子」のリストによってノード１０８に応答を送信する。非常に広く言えば、トランザクションに関する最下点は、トランザクションが開始したときの分散型データベースシステム１０２内の最も古いアクティブなトランザクションに関するトランザクション識別子である。完了するトランザクション識別子のリストは、トランザクションが開始したときに準備するプロセスにあったトランザクションのリストである。最下点及び完了するトランザクション識別子のリストは、下でより詳細に説明される。
【００６８】
１．２  データ要素のバージョン付与
一部の例において、データベースＤは、多版型同時実行制御（ＭＶＣＣ，multi-version concurrency control）の特定の形態であるスナップショット分離技術を使用して実装される。そのようなデータベースにおいては、データベース内のデータ要素の１又は２以上に関していくつかのバージョンが存在する可能性がある。データ要素の各バージョンは、データ要素の異なるバージョンが互いに区別され得るような一意識別子を有する。一部の例においては、データ要素の各バージョンに関して、バージョンに関する一意識別子は、データベースにバージョンを書き込んだトランザクションのトランザクション識別子に対応する。つまり、トランザクションがデータ要素の新しいバージョンをデータベースに書き込むたびに、新しいバージョンを書き込むトランザクションに関するトランザクション識別子が、新しいバージョンに関する識別子として割り当てられる。例えば、ｘと命名されたデータ要素は、トランザクションＴ［２５，３０］、Ｔ［３７，４２］、及びＴ［５３，５９］によってそれぞれ書き込まれたｘ［２５］、ｘ［３７］、及びｘ［５３］を含むいくつかのバージョンを有する可能性がある。
【００６９】
１．３  データの可視性
上述のバージョン付与技術は、トランザクションがデータ要素のどのバージョンにアクセスすることを許容されるかを決定し、操作が競合するトランザクションを特定するために分散型データベースシステム１０２のノード１０８によって使用され得る。競合する操作のあるトランザクションが特定されるとき、トランザクションのうちの１つが、強制的にアボートさせられる可能性がある。この目的で、一部の例において、分散型データベースシステム１０２のノード１０８は、トランザクションが１又は２以上のデータ要素にアクセスしようと試みるとき、以下の規則を遵守する。
１）データ要素ｘが与えられたとすると、ｘ［ｍ］がトランザクションＴ［ｍ］によって書き込まれたｘのバージョンである場合、トランザクションＴ［ｉ］は、ｘを読み取ろうと試みるとき、Ｔ［ｉ］が開始される前にコミットされたｘの最も新しいバージョンを読み取ることができる。つまり、Ｔ［ｉ］は、Ｔ［ｊ］がｘを書き込み、Ｔ［ｉ］が始まる前にＴ［ｊ］がコミットしたような、ｊがｉ未満の最も大きなトランザクション識別子であるｘ［ｊ］を読み取ることができる。
２）データ要素ｘが与えられたとすると、ｘ［ｉ］がトランザクションＴ［ｉ］によって書き込まれたｘのバージョンである場合、Ｔ［ｉ］は、Ｔ［ｊ］がｘを書き込み、Ｔ［ｊ］がＴ［ｉ］と同時に存在し、Ｔ［ｊ］が最初にコミットしたようなトランザクションＴ［ｊ］が存在しない場合にコミットすることができる。
【００７０】
概して、上の規則は、同時トランザクションの間の高度な分離を行う。特に、第１の規則は、ダーティリード（つまり、データ要素のコミットされていないバージョンを読むこと）を防止し、第２の規則は、データの意図されない上書きを防止する。規則のどちらも、遮断又は待ちを必要としない。
【００７１】
１．４  ２段階コミット手順
分散型データベースシステム１０２の分散の性質によって、通信ネットワーク１０６上のメッセージの送信と受信との間には本質的な遅延が存在し、ネットワークメッセージがノード１０８において受信され、処理される順序は、それらのネットワークメッセージが送信された順序と異なる可能性がある。この本質的な遅延が原因で、（クライアントの観点から見た）原子性を保証することは、複雑な動作である。クライアントの観点から見た原子性を保証するために、分散型データベースシステム１０２は、２相コミット手順を使用して分散型データベースシステム１０２のノード１０８の間のコミット操作を調整する。
【００７２】
２相コミット手順において、分散型データベースシステム１０２上で動作するトランザクションは、ＡＣＴＩＶＥ状態、ＰＲＥＰＡＲＩＮＧ（若しくはＰＲＥＰＡＲＥＤ）状態、ＣＯＭＭＩＴＴＩＮＧ（若しくはＣＯＭＭＩＴＴＥＤ）状態、又はＡＢＯＲＴＩＮＧ（若しくはＡＢＯＲＴＥＤ）状態である可能性がある。ＰＲＥＰＡＲＥフェーズの間に、トランザクションに参加する各ノードは、トランザクションがコミットすることができるかどうかを決定するための確認手順を実施する。すべてのパーティションがトランザクションがコミットすることができることを（賛成して）認める場合、トランザクションはコミットする。そうでない場合、トランザクションはアボートする。
【００７３】
１．５  分散型データベースの書き込み
図２〜６に、データ要素の新しいバージョンを書き込み、２段階コミットプロトコルを使用して成功裏にコミットするトランザクションの一例が示される。図２を参照すると、分散型データベースシステム２０２の一部は、第１のノード１０８ａ、第２のノード１０８ｂ、及び第５のノード１０８ｃを含む。（与えられた例に関する「第１の」又は「第２の」などのノードのラベル付けは、その他の例においては、適宜それらのラベルを変更することを妨げないことに留意されたい。）第２のノード１０８ｂは、分散型データベースシステム２０２のためのリーダーノードとして指定される。第１のトランザクションＴ［５２，７５］は、第１のノード１０８ａ上で既に完了しており、データ要素のバージョンｘ［５２］２１８が第１のノード１０８ａ上の第１のデータベースフラグメント１１２ａに書き込まれる結果を生じた。第１のトランザクションの第１のローカルレコード２２０は、第１のノード１０８ａの第１のローカルトランザクションマネージャ１１４ａに記憶される。
【００７４】
クライアントがグローバルトランザクションマネージャ１１６にＢｅｇｉｎ  Ｔｒａｎｓａｃｔｉｏｎメッセージ（図示せず）を送信するときに、第２のトランザクションが分散型データベースシステム２０２において開始される。グローバルトランザクションマネージャ１１６は、第２のトランザクションＴ［１０５，ＦＵＴＵＲＥ］に関するグローバルレコード２２１を生成し、Ｓｔａｒｔｅｄ  Ｔ［１０５］メッセージ（図示せず）によってクライアントに応答する。それから、クライアントは、第１のノード１０８ａにおけるトランザクションＴ［１０５］に関するWrite(x)コマンド及び第５のノード１０８ｃにおけるトランザクションＴ［１０５］（図示せず）に関する１又は２以上のその他のコマンドを発行する。第２のトランザクションは第１のノード１０８ａ及び第５のノード１０８ｃにとって新しいので、第１のノード１０８ａ及び第５のノード１０８ｃは、それぞれ、リーダーノード（すなわち、第２のノード１０８ｂ）のグローバルトランザクションマネージャ１１６に第２のトランザクションに関するＪｏｉｎ（Ｔ［１０５］）メッセージを送信する。グローバルトランザクションマネージャ１１６は、第１のノード１０８ａ及び第５のノード１０８ｃがトランザクションに参加したことを反映するためにグローバルレコード２２１を更新し、つまり、Ｔ［１０５，ＦＵＴＵＲＥ］：Ｎ１Ｎ５である。グローバルレコード２２１は、トランザクション識別子１０５を有するトランザクションが現在アクティブであり（つまり、グローバルレコード２２１のコミット識別子がＦＵＴＵＲＥであり）、第１のノード１０８ａ及び第５のノード１０８ｃ上で動作していることを示す。図３を参照すると、グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃにＴ［１０５］に関する空の「完了するトランザクション識別子のリスト」（すなわち、下でより詳細に説明される（））を送り返す。第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、それぞれ、第２のトランザクションＴ［１０５，ＦＵＴＵＲＥ］に関する第２のローカルレコード２２２を生成する。第１のノード１０８ａは、Write(x)コマンドの実行を進め、ｘの第２のバージョンｘ［１０５］２２４が第１のデータベースフラグメント１１２ａに書き込まれる結果を生じる。図に示されていないが、第５のノード１０８ｃも、第２のトランザクションに関するコマンドの実行を進める。
【００７５】
図４を参照すると、第２のトランザクションのコマンドが完了すると、クライアントが、Ｅｎｄ  Ｔｒａｎｓａｃｔｉｏｎメッセージ（図示せず）をグローバルトランザクションマネージャ１１６に送信することによって第２のトランザクションに関するコミットシーケンスを開始し、そして今度は、グローバルトランザクションマネージャ１１６が、第２のトランザクションに関するコミット識別子（すなわち、１１１）を生じさせ、コミット識別子を含めるために第２のトランザクションに関するグローバルレコード２２１を更新する。グローバルトランザクションマネージャ１１６は、さらに、（図４においてアステリスクとして示される）第２のトランザクションに関するグローバルレコード２２１に、ＰＲＥＰＡＲＥ状態にあるものとして印を付け、グローバルレコード２２１の更新されたバージョン、すなわち、Ｔ［１０５，１１１］＊：Ｎ１Ｎ５を結果として生じる。グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに完了するトランザクション識別子の空のリスト（すなわち、（））を含むＰｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージを送信する。グローバルトランザクションマネージャ１１６からＰｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージを受信することに応じて、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、第２のトランザクションに関するそれらのノードのローカルレコードをＴ［１０５，１１１］に更新し、それらのノードが第２のトランザクションをコミットする準備ができているかどうかを決定する。
【００７６】
図５を参照すると、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃが、両方とも、ノード１０８ａ、１０８ｃの両方が第２のトランザクションをコミットする準備ができていることを示すＯＫ（Ｔ［１０５］）メッセージによってグローバルトランザクションマネージャ１１６に応答する。図６を参照すると、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃからＯＫ（Ｔ［１０５］）メッセージを受信することに応じて、グローバルトランザクションマネージャ１１６が、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃにＣｏｍｍｉｔ（Ｔ［１０５］）メッセージを送信し、ｘの新しく書き込まれたバージョンｘ［１０５］をコミットすることを含め、第２のトランザクションにコミットをさせる。
【００７７】
１．６  分散型データベースの読み取り
図７〜１１に、データ要素のバージョンを読み取り、２段階コミットプロトコルを使用してコミットするトランザクションの一例が示される。図７を参照すると、分散型データベースシステム２０２の一部は、第１のノード１０８ａ、第２のノード１０８ｂ、及び第５のノード１０８ｃを含む。第２のノード１０８ｂは、分散型データベースシステム２０２のためのリーダーノードとして指定される。第１のトランザクションＴ［５２，７５］は、第１のノード１０８ａ上で既に完了しており、データ要素ｘのバージョンｘ［５２］１５１８が第１のノード１０８ａ上の第１のデータベースフラグメント１１２ａに書き込まれる結果を生じた。第１のトランザクションの第１のローカルレコード１５２０は、第１のノード１０８ａの第１のローカルトランザクションマネージャ１１４ａに記憶される。
【００７８】
クライアントがグローバルトランザクションマネージャ１１６にＢｅｇｉｎ  Ｔｒａｎｓａｃｔｉｏｎメッセージ（図示せず）を送信するときに、第２のトランザクションが分散型データベースシステム２０２において開始される。グローバルトランザクションマネージャは、第２のトランザクションＴ［８０，ＦＵＴＵＲＥ］に関するグローバルレコード１５２１を生成し、Ｓｔａｒｔｅｄ  Ｔ［８０］メッセージ（図示せず）によってクライアントに応答する。それから、クライアントは、第１のノード１０８ａにおけるトランザクションＴ［８０］に関するRead(x)コマンド及び第５のノード１０８ｃにおけるトランザクションＴ［８０］（図示せず）に関する１又は２以上のその他のコマンドを発行する。第２のトランザクションは第１のノード１０８ａ及び第５のノード１０８ｃにとって新しいので、第１のノード１０８ａ及び第５のノード１０８ｃは、それぞれ、リーダーノード（すなわち、第２のノード１０８ｂ）のグローバルトランザクションマネージャ１１６に第２のトランザクションに関するＪｏｉｎ（Ｔ［８０］）メッセージを送信する。グローバルトランザクションマネージャ１１６は、第１のノード１０８ａ及び第５のノード１０８ｃがトランザクションに参加したことを反映するために第２のトランザクションに関するグローバルレコード１５２１を更新し、つまり、Ｔ［８０，ＦＵＴＵＲＥ］：Ｎ１Ｎ５である。グローバルレコード１５２１は、トランザクション識別子８０を有するトランザクションが現在アクティブであり（つまり、グローバルレコード１５２１のコミット識別子がＦＵＴＵＲＥであり）、第１のノード１０８ａ及び第５のノード１０８ｃ上で動作していることを示す。
【００７９】
図８を参照すると、グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃにＴ［８０］に関する完了するトランザクション識別子のリスト（すなわち、この場合は空である（））を送り返す。第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、それぞれ、第２のトランザクションＴ［８０，ＦＵＴＵＲＥ］に関する第２のローカルレコード１６２２を生成する。第１のノード１０８ａは、Read(x)コマンドの実行を進め、ｘ［５２］が第１のデータベースフラグメント１１２ａから読み取られる結果を生じる。図に示されていないが、第５のノード１０８ｃも、第２のトランザクションに関するコマンドの実行を進める。
【００８０】
図９を参照すると、第２のトランザクションのコマンドが完了すると、クライアントが、Ｅｎｄ  Ｔｒａｎｓａｃｔｉｏｎメッセージ（図示せず）をグローバルトランザクションマネージャ１１６に送信することによって第２のトランザクションに関するコミットシーケンスを開始し、そして今度は、グローバルトランザクションマネージャ１１６が、第２のトランザクションに関するコミット識別子（すなわち、８５）を生じさせ、コミット識別子を含めるために第２のトランザクションに関するグローバルレコード１５２１を更新する。グローバルトランザクションマネージャ１１６は、さらに、（図９においてアステリスクとして示される）第２のトランザクションに関するグローバルレコード１５２１に、ＰＲＥＰＡＲＥ状態にあるものとして印を付け、グローバルレコード１５２１の更新されたバージョン、すなわち、Ｔ［８０，８５］＊：Ｎ１Ｎ５を結果として生じる。グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに完了するトランザクション識別子の空のリスト（すなわち、（））を含むＰｒｅｐａｒｅ（Ｔ［８０，８５］）メッセージを送信する。グローバルトランザクションマネージャ１１６からＰｒｅｐａｒｅ（Ｔ［８０，８５］）メッセージを受信することに応じて、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、それぞれ、第２のトランザクションに関する第２のローカルレコード１６２２をＴ［８０，８５］に更新し、それらのノードが第２のトランザクションをコミットする準備ができているかどうかを決定する。
【００８１】
図１０を参照すると、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃが、両方とも、ノード１０８ａ、１０８ｃの両方が第２のトランザクションをコミットする準備ができていることを示すＯＫ（Ｔ［８０］）メッセージによってグローバルトランザクションマネージャ１１６に応答する。図１１を参照すると、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃからＯＫ（Ｔ［８０］）メッセージを受信することに応じて、グローバルトランザクションマネージャ１１６が、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃにＣｏｍｍｉｔ（Ｔ［８０］）メッセージを送信し、第２のトランザクションにコミットをさせる。
【００８２】
１．７  最適化された分散型データベースの動作
上述の例示的な分散型データベーストランザクションでは、読み取り操作と書き込み操作との両方が、２段階コミット手順においていかなる複雑さに直面することもなく分散型データベース上で実行される。しかし、一部の例においては、１又は２以上のトランザクションがそれらのＰＲＥＰＡＲＥフェーズにあるとき、曖昧さが発生し、分散型データベースシステム１０２における非効率的な動作につながる可能性がある。
【００８３】
下でより詳細に説明されるように、これらの曖昧さは、そのノード１０８上で実行される各トランザクションのレコードを維持するローカルトランザクションマネージャ１１４を使用して軽減される。ローカルトランザクションマネージャによって記憶されるトランザクションの各レコードは、トランザクションのライフタイムＴ［ｉ，ｋ］（まだアクティブであるトランザクションに関してはｋ＝ＦＵＴＵＲＥである）を含む。ローカルトランザクションマネージャによって維持されるレコードは、曖昧性の結果として生じる特定の競合を解決するために使用され得る。
【００８４】
１．７．１  最適化された分散型データベースの書き込み
一部の例においては、第１のトランザクション及び第２のトランザクションが両方ともデータ要素の異なるバージョンを書き込み済みであり、第２のトランザクションのトランザクション識別子が第１のトランザクションに関するトランザクション識別子よりも大きく、第１のトランザクションに関するコミット識別子よりも小さいようにして両方ともＰＲＥＰＡＲＥフェーズにあるとき、曖昧性が、非効率を引き起こす可能性がある。特に、第２のトランザクションは、第１のトランザクションがコミットするか又はアボートするかが知られていないので、その第２のトランザクションがその書き込み操作をアボートすべきか否かを知る術がない。これは、第２のトランザクションが早まってアボートする結果となる可能性がある。
【００８５】
図１２を参照すると、そのような状況が起こることを防止するために、最適化されたデータベース書き込みアルゴリズム１２００が使用される。最適化されたデータベース書き込みアルゴリズム１２００の第１のステップ１２０２において、（おそらくは、操作の中でもとりわけ）データベース書き込み操作を含むトランザクションに関するＢｅｇｉｎ  Ｔｒａｎｓａｃｔｉｏｎメッセージが、リーダーノードのグローバルトランザクションマネージャにおいて受信される。第２のステップ１２０４において、データベース書き込み操作に参加するデータベースシステムのノードのローカルトランザクションマネージャが、グローバルトランザクションマネージャにＪｏｉｎ（）メッセージを送信する。第３のステップ１２０６において、トランザクションが、トランザクションに参加するノードにおいて記憶されるデータ要素に対して実行される。第４のステップ１２０８においては、トランザクションの実行が完了すると、Ｅｎｄ  Ｔｒａｎｓａｃｔｉｏｎメッセージが、グローバルトランザクションマネージャにおいて受信される。第５のステップ１２１０において、グローバルトランザクションマネージャが、完了するトランザクションのリストを含むＰｒｅｐａｒｅ（）メッセージを、参加するノードのローカルトランザクションマネージャに送信する。
【００８６】
第６のステップ１２１２において、参加するノードのローカルトランザクションマネージャが、トランザクションが準備状態にされる前に、トランザクションと同じデータ要素に対して動作するいずれかのその他のトランザクションがＰＲＥＰＡＲＥ状態にされたかどうかを決定するために、完了するトランザクションのリストを、それらのローカルトランザクションマネージャが現在管理するトランザクションのレコードと比較する。そのような以前のトランザクションが確かに存在する場合、アルゴリズムは、第７のステップ１２１４に進み、第７のステップ１２１４において、ローカルトランザクションマネージャが、以前のトランザクションが完了するまでトランザクションをスリープさせる（つまり、ローカルトランザクションマネージャによってＳＵＳＰＥＮＤＥＤ状態にさせる）。このようにしてトランザクションを中断することは、以前のトランザクションの結果が知られるまでトランザクションをアボートすべきかどうかの決定を遅らせる。
【００８７】
そのような以前のトランザクションが存在しない場合、又はトランザクションが中断から覚めるとき、アルゴリズムは、第８のステップ１２１６に進み、第８のステップ１２１６において、ローカルトランザクションマネージャが、トランザクションがコミットされ得るかどうかを決定する。
【００８８】
トランザクションがコミットされ得る場合、アルゴリズムは、第９のステップ１２１８に進み、第９のステップ１２１８において、参加するノードのローカルトランザクションマネージャのすべてが、グローバルトランザクションマネージャにＯＫ（）メッセージを送信する。後続の第１０のステップ１２２０において、グローバルトランザクションマネージャが、参加するノードのローカルトランザクションマネージャにＣｏｍｍｉｔ（）メッセージを送信する。最後に、第１１のステップ１２２２において、トランザクションの変更が、参加するノードにおいてコミットされる。
【００８９】
トランザクションがコミットされ得ない場合、アルゴリズムは、第１２のステップ１２２４に進み、第１２のステップ１２２４において、参加するノードのローカルトランザクションマネージャのうちの１又は２以上が、グローバルトランザクションマネージャにＮｏｔＯＫ（）メッセージを送信する。後続の第１３のステップ１２２６において、グローバルトランザクションマネージャが、参加するノードにＡｂｏｒｔ（）メッセージを送信する。最後に、第１４のステップ１２２８において、トランザクションの変更が、参加するノードにおいてロールバックされる。
【００９０】
以下の例は、図１２のアルゴリズムのステップ１２１０〜１２２８の応用を示す。図１３を参照すると、分散型データベースシステム２０２の一部は、第１のノード１０８ａ、第２のノード１０８ｂ、及び第５のノード１０８ｃを含む。第２のノード１０８ｂは、分散型データベースシステム２０２のためのリーダーノードとして指定される。第１のトランザクションＴ［１００，ＦＵＴＵＲＥ］は、第１のノード１０８ａ上の第１のデータベースフラグメント１１２ａにデータ要素ｘの第１の新しいバージョンｘ［１００］６２６を書き込み、第５のノード１０８ｃ上で１又は２以上のその他の操作（図示せず）を実施した。第２のトランザクションＴ［１０５，ＦＵＴＵＲＥ］は、第１のノード１０８ａ上の第１のデータベースフラグメント１１２ａにデータ要素ｘの第２の新しいバージョンｘ［１０５］２２４を書き込み、第５のノード１０８ｃ上で１又は２以上のその他の操作（図示せず）を実施した。グローバルトランザクションマネージャ１１６は、第１のトランザクションに関する第１のグローバルレコード７２１、すなわち、Ｔ［１００，ＦＵＴＵＲＥ］：Ｎ１Ｎ５を含む。第１のグローバルレコード７２１は、第１のトランザクションがトランザクション識別子１００を有し、第１のノード１０８ａ及び第５のノード１０８ｃ上で現在アクティブであることを示す。グローバルトランザクションマネージャ１１６は、第２のトランザクションに関する第２のグローバルレコード７２６、すなわち、Ｔ［１０５，ＦＵＴＵＲＥ］：Ｎ１Ｎ５をさらに含む。第２のグローバルレコード７２６は、第２のトランザクションがトランザクション識別子１０５を有し、第１のノード１０８ａ及び第５のノード１０８ｃ上で現在アクティブであることを示す。第１のトランザクションの第１のローカルレコードＴ［１００，ＦＵＴＵＲＥ］７２０と第２のトランザクションの第２のローカルレコードＴ［１０５，ＦＵＴＵＲＥ］７２２との両方は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに記憶される。
【００９１】
図１４を参照すると、第１のトランザクションのコマンドが完了すると、クライアントが、Ｅｎｄ  Ｔｒａｎｓａｃｔｉｏｎメッセージ（図示せず）をグローバルトランザクションマネージャ１１６に送信することによって第２の第１のトランザクションに関するコミットシーケンスを開始し、そして今度は、グローバルトランザクションマネージャ１１６が、第１のトランザクションに関するコミット識別子（すなわち、１１０）を生じさせ、コミット識別子を含めるために第１のトランザクションに関する第１のグローバルレコード７２１を更新する。グローバルトランザクションマネージャ１１６は、さらに、第１のトランザクションに関する第１のグローバルレコード７２１に、（図１４においてアステリスクとして示される）ＰＲＥＰＡＲＥ状態にあるものとして印を付け、第１のグローバルレコード７２１の更新されたバージョン、すなわち、Ｔ［１００，１１０］＊：Ｎ１Ｎ５を結果として生じる。グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに完了するトランザクション識別子の空のリスト（すなわち、（））を含むＰｒｅｐａｒｅ（Ｔ［１００，１１０］）メッセージを送信する。グローバルトランザクションマネージャ１１６からＰｒｅｐａｒｅ（Ｔ［１００，１１０］）メッセージを受信することに応じて、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、それぞれ、第１のトランザクションに関する第１のローカルレコード７２０をＴ［１００，１１０］に更新し、それらのノードが第１のトランザクションをコミットする準備ができているかどうかの決定を開始する。
【００９２】
図１５を参照すると、第２のトランザクションのコマンドが完了すると、クライアントが、Ｅｎｄ  Ｔｒａｎｓａｃｔｉｏｎメッセージ（図示せず）をグローバルトランザクションマネージャ１１６に送信することによって第２のトランザクションに関するコミットシーケンスを開始し、そして今度は、グローバルトランザクションマネージャ１１６が、第２のトランザクションに関するコミット識別子（すなわち、１１１）を生じさせ、コミット識別子を含めるために第２のトランザクションに関する第２のグローバルレコード７２６を更新する。グローバルトランザクションマネージャ１１６は、さらに、第２のトランザクションに関する第２のグローバルレコード７２６に、（図１５においてアステリスクとして示される）ＰＲＥＰＡＲＥ状態にあるものとして印を付け、第２のグローバルレコード７２６の更新されたバージョン、すなわち、Ｔ［１０５，１１１］＊：Ｎ１Ｎ５を結果として生じる。グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃにＰｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージを送信する。Ｐｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージと一緒に、グローバルトランザクションマネージャ１１６は、「完了するトランザクション識別子」のリストを送信する。この例においては、Ｔ［１００］が完了するトランザクション（つまり、Ｐｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージがグローバルトランザクションマネージャ１１６によって送信される前にＴ［１００］がＰＲＥＰＡＲＥ状態であった）であるので、完了するトランザクション識別子のリストは、Ｔ［１００］を含む。
【００９３】
グローバルトランザクションマネージャ１１６からＰｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージを受信することに応じて、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、それぞれ、第２のトランザクションに関する第２のローカルレコード７２２をＴ［１０５，１１１］に更新し、それらのノードが第２のトランザクションをコミットする準備ができているかどうかの決定を開始する。
【００９４】
図１５に示される瞬間に、分散型データベースシステム１０２は、第２のトランザクションが安全にコミットし得るかどうかを決定する必要がある。そのようにする１つの簡単な方法において、分散型データベースシステム１０２は、どのトランザクションが最も早いコミット識別子を有するかどうかを決定するために、第１のトランザクションのコミット識別子と第２のトランザクションのコミット識別子とを比較する可能性がある。２つのコミット識別子のうちの遅い方を有するトランザクションが、アボートされる。図１５の例において、第２のトランザクションは、この簡単な方法を使用してアボートする。しかし、第１のトランザクションは、ＰＲＥＰＡＲＥ状態であり、まだコミットしていない。実際の所、第１のトランザクションは、アボートする可能性がある。第１のトランザクションがアボートする場合、上の簡単な方法は、両方のトランザクションがアボートする非効率的で望ましくない結果になる。
【００９５】
そのような非効率的で望ましくない結果を避けるために、完了するトランザクション識別子のリストを利用する別の方法が、第２のトランザクションが安全にコミットし得るかどうかを決定するために使用される。特に、第２のトランザクションがＰＲＥＰＡＲＥフェーズにあるとき、第２のトランザクションと同じ（１又は２以上の）データ要素にアクセスしており、第２のトランザクションのトランザクション識別子よりも小さいトランザクション識別子を有するいずれかの完了するトランザクションが存在するかどうかを決定するために、完了するトランザクション識別子のリストが照会される。この場合、（完了するトランザクション識別子のリストに含まれる）第１のトランザクションは、ＰＲＥＰＡＲＩＮＧ状態にあり、第２のトランザクションと同じデータ要素（すなわち、ｘ）にアクセスしており、第２のトランザクションのトランザクション識別子（すなわち、１０５）よりも小さいトランザクション識別子（すなわち、１００）を有する。ローカルトランザクションマネージャ１１４は、第１のトランザクションが成功裏にコミットするのか又はアボートするのかを知る術がないので、第１のトランザクションがコミットし終わるか又はアボートし終わるかのどちらかまで第２のトランザクションを中断させる。
【００９６】
図１６を参照すると、第１のノード１０８ａのデータベースマネージャ１１０ａは、第１のトランザクションがコミットし得ることを示すＯＫ（Ｔ［１００］）メッセージをグローバルトランザクションマネージャ１１６に送信する。しかし、第５のノード１０８ｃは、第１のトランザクションがコミットし得ないことを示すＮｏｔ  ＯＫ（Ｔ［１００］）メッセージをグローバルトランザクションマネージャ１１６に送信する。図１７を参照すると、第５のノード１０８ｃからＮｏｔ  ＯＫ（Ｔ［１００］）メッセージを受信した結果として、グローバルトランザクションマネージャ１１６は、第１のグローバルレコード７２１を削除し、第１のノード１０８ａ及び第５のノード１０８ｃにＡｂｏｒｔ（Ｔ［１００］）メッセージを送信することによって第１のトランザクションをアボートする。
【００９７】
グローバルトランザクションマネージャ１１６からＡｂｏｒｔ（Ｔ［１００］）メッセージを受信すると、第１のノード１０８ａは、データ要素ｘのｘ［１００］のバージョンをその第１のノードのデータフラグメント１１２ａから削除し、第１のローカルレコード７２０をその第１のノードのローカルトランザクションマネージャ１１４ａから削除する。同様に、第５のノード１０８ｃは、第１のローカルレコード７２０をその第５のノードのローカルトランザクションマネージャ１１４ｃから削除する。第１のトランザクションがアボートされ、第２のトランザクションが中断から覚める。
【００９８】
図１８を参照すると、中断から覚めると、第１のノード１０８ａのデータベースマネージャ１１０ａは、第２のトランザクションがコミットする準備ができていることを示すＯＫ（Ｔ［１０５］）メッセージをグローバルトランザクションマネージャ１１６に送信する。第５のノード１０８ｃも、第２のトランザクションがコミットする準備ができていることを示すＯＫ（Ｔ［１０５］）メッセージをグローバルトランザクションマネージャ１１６に送信する。
【００９９】
第１の及び第５のノード１０８ａ、１０８ｃからのＯＫ（Ｔ［１０５］）メッセージが受信される図１９を参照すると、グローバルトランザクションマネージャ１１６は、第２のトランザクションが動作しているノードのすべてが第２のトランザクションがコミットする準備ができていることを示したと決定する。グローバルトランザクションマネージャ１１６は、第２のグローバルレコード７２６に、もはや準備していないものとして印を付け、第１のノード１０８ａ及び第５のノード１０８ｃにＣｏｍｍｉｔ（Ｔ［１０５］）メッセージを送信し、第１のノード１０８ａのデータベースフラグメント１１２ａ上でｘのｘ［１０５］のバージョンにコミットをさせることを含め、第２のトランザクションにコミットをさせる。
【０１００】
１．７．２  最適化された分散型データベースの読み取り
一部の例においては、第１のトランザクションがデータ要素の新しいバージョンを書き込み、ＰＲＥＰＡＲＥフェーズにあり、データ要素を読み取るための操作を含み、第１のトランザクションのトランザクション識別子よりも大きく、第１のトランザクションのコミット識別子よりも大きいトランザクション識別子を有する第２のトランザクションがアクティブであるとき、システムの非効率的な動作を生じる結果となる可能性がある曖昧性が発生する可能性がある。特に、第２のトランザクションは、第１のトランザクションがコミットするのか又はアボートするのかが分からないので、データ要素の新しいバージョンを読み取るべきか又はデータ要素の前のバージョンを読み取るべきかを知る術がない。
【０１０１】
図２０を参照すると、そのような状況が起こることを防止するために、最適化されたデータベース読み取りアルゴリズム１９００が使用される。最適化されたデータベース読み取りアルゴリズム１９００の第１のステップ１９０２において、（おそらくは、操作の中でもとりわけ）データベース読み取り操作を含むトランザクションに関するＢｅｇｉｎ  Ｔｒａｎｓａｃｔｉｏｎメッセージが、リーダーノードのグローバルトランザクションマネージャにおいて受信される。第２のステップ１９０４において、データベース読み取り操作に参加するデータベースシステムのノードのローカルトランザクションマネージャが、グローバルトランザクションマネージャにＪｏｉｎ（）メッセージを送信する。第３のステップ１９０６において、グローバルトランザクションマネージャが、完了するトランザクションのリストを、参加するノードのローカルトランザクションマネージャに送信する。
【０１０２】
第４のステップ１９０８においては、データ要素を読み取る前に、参加するノードのローカルトランザクションマネージャが、完了するトランザクションのリスト内のいずれかのその他のトランザクションがＰＲＥＰＡＲＥ状態にあり、このトランザクションの開始前にデータ要素のバージョンを書き込んだかどうかを決定するために、完了するトランザクションのリストを、それらのローカルトランザクションマネージャが現在管理するトランザクションと比較する。そのような完了するトランザクションが確かに存在する場合、アルゴリズムは、第５のステップ１９１０に進み、第５のステップ１９１０において、ローカルトランザクションマネージャが、完了するトランザクションが完了するまでトランザクションを中断させる。トランザクションを中断させることは、データ要素のどのバージョンがトランザクションによって読み取られるかの判断を遅らせる。そのような完了するトランザクションが存在しない場合、又はトランザクションが中断から覚めるとき、アルゴリズムは、第６のステップ１９１２に進み、第６のステップ１９１２において、読み取り操作が、トランザクションの開始前に最も新しくコミットされたデータ要素のバージョンに対して実行される。
【０１０３】
第７のステップ１９１３において、Ｅｎｄ  Ｔｒａｎｓａｃｔｉｏｎメッセージが、グローバルトランザクションマネージャにおいて受信される。第８のステップ１９１５において、グローバルトランザクションマネージャが、Ｐｒｅｐａｒｅ（）メッセージを、参加するノードのローカルトランザクションマネージャに送信する。
【０１０４】
第９のステップ１９１４において、ローカルトランザクションマネージャが、トランザクションがコミットされ得るかどうかを決定する。トランザクションがコミットされ得る場合、アルゴリズムは、第１０のステップ１９１６に進み、第１０のステップ１９１６において、参加するノードのすべてのローカルトランザクションマネージャが、グローバルトランザクションマネージャにＯＫ（）メッセージを送信する。後続の第１１のステップ１９１８において、グローバルトランザクションマネージャが、参加するノードのローカルトランザクションマネージャにＣｏｍｍｉｔ（）メッセージを送信する。最後に、第１２のステップ１９２０において、トランザクションの変更が、参加するノードにおいてコミットされる。
【０１０５】
トランザクションがコミットされ得ない場合、アルゴリズムは、第１３のステップ１９２２に進み、第１３のステップ１９２２において、参加するノードのうちの１又は２以上のローカルトランザクションマネージャが、グローバルトランザクションマネージャにＮｏｔＯＫ（）メッセージを送信する。後続の第１４のステップ１９２４において、グローバルトランザクションマネージャが、参加するノードのローカルトランザクションマネージャにＡｂｏｒｔ（）メッセージを送信する。最後に、第１５のステップ１９２６において、トランザクションの変更が、参加するノードにおいてロールバックされる。
【０１０６】
例えば、図２１を参照すると、分散型データベースシステム２０２の一部は、第１のノード１０８ａ、第２のノード１０８ｂ、及び第５のノード１０８ｃを含む。第２のノード１０８ｂは、分散型データベースシステム２０２のためのリーダーノードとして指定される。第１のトランザクションＴ［５２，７５］は、第１のノード１０８ａ上で既に完了しており、データ要素ｘのバージョンｘ［５２］２０１８が第１のノード１０８ａ上の第１のデータベースフラグメント１１２ａに書き込まれる結果を生じた。第２のトランザクションＴ［１００，１１０］は、第１のノード１０８ａと第２のノード１０８ｂとの両方においてアクティブであり、データ要素ｘのバージョンｘ［１００］２０１９を第１のノード１０８ａ上の第１のデータベースフラグメント１１２ａに書き込み済みである。第１のトランザクションの第１のローカルレコード２０２０は、第１のノード１０８ａのローカルトランザクションマネージャ１１４ａに記憶される。第２のローカルレコード２０２２は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに記憶される。グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに、第２のトランザクションに関する完了するトランザクション識別子の空のリスト（すなわち、（））を含むＰｒｅｐａｒｅ（Ｔ［１００，１１０］）メッセージを送信した。
【０１０７】
図２２を参照すると、クライアントがグローバルトランザクションマネージャ１１６にＢｅｇｉｎ  Ｔｒａｎｓａｃｔｉｏｎメッセージ（図示せず）を送信するときに、第３のトランザクションが分散型データベースシステム２０２において開始される。グローバルトランザクションマネージャ１１６は、第３のトランザクションＴ［１１１，ＦＵＴＵＲＥ］に関するグローバルレコード２１２７を生成し、Ｓｔａｒｔｅｄ  Ｔ［１１１］メッセージ（図示せず）によってクライアントに応答する。それから、クライアントは、第１のノード１０８ａにおけるトランザクションＴ［１１１］に関するRead(x)コマンド及び第５のノード１０８ｃにおけるトランザクションＴ［１１１］（図示せず）に関する１又は２以上のその他のコマンドを発行する。第３のトランザクションは第１のノード１０８ａ及び第５のノード１０８ｃにとって新しいので、第１のノード１０８ａ及び第５のノード１０８ｃは、それぞれ、リーダーノード（すなわち、第２のノード１０８ｂ）のグローバルトランザクションマネージャ１１６に第３のトランザクションに関するＪｏｉｎ（Ｔ［１１１］）メッセージを送信する。グローバルトランザクションマネージャ１１６は、第１のノード１０８ａ及び第５のノード１０８ｃがトランザクションに参加したことを反映するために第３のトランザクションに関する第２のグローバルレコード２１２７を更新し、つまり、Ｔ［１１１，ＦＵＴＵＲＥ］：Ｎ１Ｎ５である。第２のグローバルレコード２１２７は、トランザクション識別子１１１を有するトランザクションが現在アクティブであり（つまり、第２のグローバルレコード２１２７のコミット識別子がＦＵＴＵＲＥであり）、第１のノード１０８ａ及び第５のノード１０８ｃ上で動作していることを示す。
【０１０８】
図２３を参照すると、グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに完了するトランザクション識別子のリストを送り返す。この例においては、Ｔ［１００］が完了するトランザクションである（つまり、Ｔ［１００］がＰＲＥＰＡＲＥ状態である）ので、完了するトランザクション識別子のリストは、Ｔ［１００］を含む。第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、それぞれ、第３のトランザクションＴ［１１１，ＦＵＴＵＲＥ］に関する第３のローカルレコード２２２５を生成する。
【０１０９】
図２３に示される時点で、第３のトランザクションの前に、Ｔ［１１１］は、ｘを読み取ろうと試みる。第１のノード１０８ａのためのローカルトランザクションマネージャ１１４ａは、完了するトランザクションのリストを照会して、第３のトランザクションと同じ（１又は２以上の）データ要素にアクセスしており、第３のトランザクションのトランザクション識別子よりも小さいトランザクション識別子を有するいずれかの完了するトランザクションが存在するかどうかを決定することによって、第３のトランザクションがｘを読み取ることが安全であるかどうかを決定する。いずれかのそのような完了するトランザクションが存在する場合、第３のトランザクションがｘを読み取ることは安全でない。この場合、第２のトランザクションは、ＰＲＥＰＡＲＩＮＧ状態にあり、第３のトランザクションと同じデータ要素（すなわち、ｘ）にアクセスしており、第３のトランザクションのトランザクション識別子（すなわち、１１１）よりも小さいトランザクション識別子（すなわち、１００）を有する。
【０１１０】
ＰＲＥＰＡＲＩＮＧ状態の第２のトランザクションが原因で、第３のトランザクションＴ［１１１］は、その第３のトランザクションがｘ［５２］を読み取るべきか又はｘ［１００］を読み取るべきかを決定することができない。つまり、第２のトランザクションＴ［１００，１１０］が準備フェーズにある状態では、第２のトランザクションがコミットするか又はアボートするかが未知である。第２のトランザクションがアボートする場合、第３のトランザクションはｘ［５２］を読み取るべきである。そうではなく、第２のトランザクションがコミットする場合、第３のトランザクションはｘ［１００］を読み取るべきである。
【０１１１】
しかし、第２のトランザクションがすぐにその判断をする（つまり、コミットするか又はアボートするかのどちらか）ことが知られており、したがって、第１のノード１０８ａのローカルトランザクションマネージャ１１４ａは、第２のトランザクションが完了する（つまり、コミットし終わる）まで第３のトランザクションを中断する。
【０１１２】
図２４を参照すると、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃが、両方とも、ノード１０８ａ、１０８ｃの両方が第２のトランザクションをコミットする準備ができていることを示すＯＫ（Ｔ［１００］）メッセージによってグローバルトランザクションマネージャ１１６に応答する。図２５を参照すると、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃからＯＫ（Ｔ［１００］）メッセージを受信することに応じて、グローバルトランザクションマネージャ１１６が、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃにＣｏｍｍｉｔ（Ｔ［１００］）メッセージを送信し、第２のトランザクションにコミットをさせる。
【０１１３】
Ｃｏｍｍｉｔ（Ｔ［１００］）メッセージが第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃにおいて受信されるとき、ローカルトランザクションマネージャ１１４ａ、１１４ｃは、第２のトランザクションが成功裏にコミットした（及びアボートしなかった）ことを知る。ローカルトランザクションマネージャ１１４ａ、１１４ｃは、第３のトランザクションを中断から覚まし、そして、第３のトランザクションが、第１のデータベースフラグメント１１２ａからｘ［１００］を読み取る。図２６を参照すると、第３のトランザクションの操作が完了すると、グローバルトランザクションマネージャ１１６は、第３のトランザクションに関するコミット識別子（すなわち、１１５）を生じさせ、コミット識別子を含めるために第３のトランザクションに関する第２のグローバルレコード２１２７を更新する。また、グローバルトランザクションマネージャ１１６は、（図２６においてアステリスクとして示される）第３のトランザクションに関する第２のグローバルレコード２１２７に、ＰＲＥＰＡＲＥ状態にあるものとして印を付け、第２のグローバルレコード２１２７の更新されたバージョン、すなわち、Ｔ［１１１，１１５］＊：Ｎ１Ｎ５を結果として生じる。
【０１１４】
グローバルトランザクションマネージャ１１６は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに完了するトランザクション識別子の空のリスト（すなわち、（））を含むＰｒｅｐａｒｅ（Ｔ［１１１，１１５］）メッセージを送信する。グローバルトランザクションマネージャ１１６からＰｒｅｐａｒｅ（Ｔ［１１１，１１５］）メッセージを受信することに応じて、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、第３のトランザクションに関するそれらのノードのそれぞれの第３のローカルレコード２２２５をＴ［１１１，１１５］に更新し、それらのノードが第３のトランザクションをコミットする準備ができているかどうかを決定する。
【０１１５】
図２７を参照すると、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃが、両方とも、ノード１０８ａ、１０８ｃの両方が第３のトランザクションをコミットする準備ができていることを示すＯＫ（Ｔ［１１１］）メッセージによってグローバルトランザクションマネージャ１１６に応答する。図２８を参照すると、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃからＯＫ（Ｔ［１１１］）メッセージを受信することに応じて、グローバルトランザクションマネージャ１１６が、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃにＣｏｍｍｉｔ（Ｔ［１１１］）メッセージを送信し、第３のトランザクションにコミットをさせる。
【０１１６】
１．８  順序が狂ったメッセージの処理
一部の例においては、２又は３以上のトランザクションに関するＰＲＥＰＡＲＥメッセージなどのメッセージが、グローバルトランザクションマネージャ１１６から分散型データベースシステム１０２内のノード１０８に第１の順序で送信されるが、ノード１０８のうちの１又は２以上のローカルトランザクションマネージャ１１４に第１の順序とは異なる第２の順序で到着する可能性がある。ＰＲＥＰＡＲＥメッセージが、それらのＰＲＥＰＡＲＥメッセージがグローバルトランザクションマネージャ１１６から送信される順序ではなくそれらのＰＲＥＰＡＲＥメッセージがローカルトランザクションマネージャ１１４において受信される順序で処理される場合、コミットするべきトランザクションを誤ってアボートすることによって、第１のコミットするトランザクションが勝つ規則（つまり、データ要素を書き込む２つの同時トランザクションに関して、コミットする第１のトランザクションが勝ち、その他のトランザクションがアボートしなければならない）に違反するなどの副次的な作用が発生する可能性がある。そのような副次的な作用は、システムの非効率的で、潜在的に誤った動作を引き起こす可能性がある。
【０１１７】
図２９を参照すると、そのような状況が起こるのを防ぐために、順序が狂ったメッセージの処理アルゴリズム２７００が使用される。第１のステップ２７０２において、完了するトランザクションのリストを含むＰｒｅｐａｒｅ（）メッセージが、第１のトランザクションに参加するノードのローカルトランザクションマネージャにおいて受信される。第２のステップ２７０４において、ローカルトランザクションマネージャは、完了するトランザクションのリスト内のいずれかのトランザクションが第１のトランザクションと同じデータ要素に書き込んでいるが、参加しているノードにおいてまだＰＲＥＰＡＲＥ状態にないかどうかを決定するために、第１のトランザクションを完了するトランザクションのリスト及びトランザクションマネージャに管理されるトランザクションと比較する。
【０１１８】
いずれかのそのようなトランザクションが特定される場合、第１のトランザクションに関するＰｒｅｐａｒｅ（）メッセージが、順序が狂って受信されており、アルゴリズムは、第３のステップ２７０６に進み、第３のステップ２７０６において、ローカルトランザクションマネージャが、特定されたトランザクションが完了するまで第１のトランザクションを中断させる。特定されたトランザクションが完了するまで第１のトランザクションを中断させることは、第１のコミットするトランザクションが勝つ規則が違反されないような適切なメッセージの順序付けを再確立する。
【０１１９】
第１のトランザクションに関するＰｒｅｐａｒｅ（）メッセージが順序が狂って受信されない場合、又は第１のトランザクションが中断から覚めるとき、アルゴリズムは、第４のステップ２７０８に進み、第４のステップ２７０８において、ローカルトランザクションマネージャが、第１のトランザクションがコミットされ得るかどうかを決定する。第１のトランザクションがコミットされ得る場合、アルゴリズムは、第５のステップ２７１０に進み、第５のステップ２７１０において、参加するノードのすべてのローカルトランザクションマネージャが、グローバルトランザクションマネージャにＯＫ（）メッセージを送信する。後続の第６のステップ２７１２において、グローバルトランザクションマネージャが、参加するノードのローカルトランザクションマネージャにＣｏｍｍｉｔ（）メッセージを送信する。最後に、第７のステップ２７１４において、第１のトランザクションの変更が、参加するノードにおいてコミットされる。
【０１２０】
第１のトランザクションがコミットされ得ない場合、アルゴリズムは、第８のステップ２７１６に進み、第８のステップ２７１６において、参加するノードのうちの１又は２以上のローカルトランザクションマネージャが、グローバルトランザクションマネージャにＮｏｔＯＫ（）メッセージを送信する。後続の第９のステップ２７１８において、グローバルトランザクションマネージャが、参加するノードのローカルトランザクションマネージャにＡｂｏｒｔ（）メッセージを送信する。最後に、第１０のステップ２７２０において、第１のトランザクションの変更が、参加するノードにおいてロールバックされる。
【０１２１】
例えば、図３０を参照すると、分散型データベースシステム２０２の一部は、第１のノード１０８ａ、第２のノード１０８ｂ、及び第５のノード１０８ｃを含む。第２のノード１０８ｂは、分散型データベースシステム２０２のためのリーダーノードとして指定される。第１のトランザクションＴ［１００，ＦＵＴＵＲＥ］は、第１のノード１０８ａ上の第１のデータベースフラグメント１１２ａにデータ要素ｘの第１の新しいバージョンｘ［１００］６２６を書き込み、第５のノード１０８ｃ上で１又は２以上のその他の操作（図示せず）を実施した。第２のトランザクションＴ［１０５，ＦＵＴＵＲＥ］は、第１のノード１０８ａ上の第１のデータベースフラグメント１１２ａにデータ要素ｘの第２の新しいバージョンｘ［１０５］２２４を書き込み、第５のノード１０８ｃ上で１又は２以上のその他の操作（図示せず）を実施した。グローバルトランザクションマネージャ１１６は、第１のトランザクションに関する第１のグローバルレコード７２１、すなわち、Ｔ［１００，ＦＵＴＵＲＥ］：Ｎ１Ｎ５を含む。第１のグローバルレコード７２１は、第１のトランザクションがトランザクション識別子１００を有し、第１のノード１０８ａ及び第５のノード１０８ｃ上で現在アクティブであることを示す。グローバルトランザクションマネージャ１１６は、第２のトランザクションに関する第２のグローバルレコード７２６、すなわち、Ｔ［１０５，ＦＵＴＵＲＥ］：Ｎ１Ｎ５をさらに含む。第２のグローバルレコード７２６は、第２のトランザクションがトランザクション識別子１０５を有し、第１のノード１０８ａ及び第５のノード１０８ｃ上で現在アクティブであることを示す。第１のトランザクションの第１のローカルレコードＴ［１００，ＦＵＴＵＲＥ］７２０と第２のトランザクションの第２のローカルレコードＴ［１０５，ＦＵＴＵＲＥ］７２２との両方は、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃに記憶される。
【０１２２】
図３１を参照すると、グローバルトランザクションマネージャ１１６は、（例えば、クライアント１０４のうちの１つから）ＥＮＤ＿ＴＲＡＮＳ（Ｔ［１００］）メッセージを受信するとき、第１のトランザクションに関するコミット識別子（すなわち、１１０）を生じさせ、コミット識別子を含めるために第１のトランザクションに関する第１のグローバルレコード７２１を更新する。グローバルトランザクションマネージャ１１６は、さらに、第１のトランザクションに関する第１のグローバルレコード７２１に、（図３１においてアステリスクとして示される）ＰＲＥＰＡＲＥ状態にあるものとして印を付け、第１のグローバルレコード７２１の更新されたバージョン、すなわち、Ｔ［１００，１１０］＊：Ｎ１Ｎ５を結果として生じる。
【０１２３】
図３２を参照すると、グローバルトランザクションマネージャ１１６は、（例えば、クライアント１０４のうちの１つから）ＥＮＤ＿ＴＲＡＮＳ（Ｔ［１０５］）メッセージを受信するとき、第２のトランザクションに関するコミット識別子（すなわち、１１１）を生じさせ、コミット識別子を含めるために第２のトランザクションに関する第２のグローバルレコード７２６を更新する。グローバルトランザクションマネージャ１１６は、さらに、第２のトランザクションに関する第２のグローバルレコード７２６に、（図３２においてアステリスクとして示される）ＰＲＥＰＡＲＥ状態にあるものとして印を付け、第２のグローバルレコード７２６の更新されたバージョン、すなわち、Ｔ［１０５，１１１］＊：Ｎ１Ｎ５を結果として生じる。
【０１２４】
図３３を参照すると、グローバルトランザクションマネージャ１１６が、ローカルトランザクションマネージャ１１４ａ、１１４ｃに完了するトランザクション識別子の空のリスト（すなわち、（））を含むＰｒｅｐａｒｅ（Ｔ［１００，１１０］）メッセージを最初に送信する。それから、グローバルトランザクションマネージャは、後続のＰｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージを、Ｔ［１００］を含む完了するトランザクション識別子のリストと一緒にローカルトランザクションマネージャ１１４ａ、１１４ｃに送信する。
【０１２５】
図３３の例において、Ｐｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージ及び完了するトランザクション識別子のそのメッセージの関連するリストは、Ｐｒｅｐａｒｅ（Ｔ［１００，１１０］）メッセージの前にローカルトランザクションマネージャ１１４ａ、１１４ｃに到着する。つまり、Ｐｒｅｐａｒｅ（．．．）メッセージが、順序が狂って受信される。Ｐｒｅｐａｒｅ（．．．）メッセージが単純にそれらのメッセージがローカルトランザクションマネージャ１１４ａ、１１４ｃにおいて受信される順序で処理されるならば、ローカルトランザクションマネージャ１１４ａ、１１４ｃは、第２のトランザクションＴ［１０５，１１１］が第１のコミットするトランザクションであると決定し、Ｔ［１００］をアボートさせることになる。もちろん、第１のトランザクションＴ［１００］をアボートすることは、第２のトランザクションＴ［１０５，１１１］が実際には第１のコミットするトランザクションではないので誤った操作になる。確かに、第１のトランザクションＴ［１００，１１０］は、第２のトランザクションのコミット識別子１１１よりも小さいコミット識別子１１０を第１のグローバルレコード７２１内に有するので第１のコミットするトランザクションである。
【０１２６】
第１のトランザクションを誤ってアボートすることを防止するために、この例においては、Ｐｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージを受信すると、ローカルトランザクションマネージャ１１４ａ、１１４ｃは、いずれかのトランザクションが第２のトランザクションＴ［１０５，１１１］と同じ（１又は２以上の）データ要素を書き込み済みであり、ＰＲＥＰＡＲＥ状態にあるかどうかを決定するために、完了するトランザクション識別子のリストを調べる。この場合、第１のトランザクションＴ［１００］は、完了するトランザクション識別子のリストに含まれており（つまり、第１のトランザクションＴ［１００］がＰＲＥＰＡＲＥ状態にあり）、第２のトランザクションＴ［１０５，１１１］も書き込んだデータ要素ｘのバージョンを書き込み済みであるので、これらの条件を満たす。第１のトランザクションＴ［１００］をアボートするのではなく、ローカルトランザクションマネージャ１１４ａ、１１４ｃは、第１のトランザクションＴ［１００］の結果が知られるまで第２のトランザクションＴ［１０５，１１１］を中断する。
【０１２７】
図３４を参照すると、Ｐｒｅｐａｒｅ（Ｔ［１０５，１１１］）メッセージがローカルトランザクションマネージャ１１４ａ、１１４ｃにおいて受信された後の時点で、Ｐｒｅｐａｒｅ（Ｔ［１００，１１０］）メッセージが、ローカルトランザクションマネージャ１１４ａ、１１４ｃにおいて受信される。グローバルトランザクションマネージャ１１６からＰｒｅｐａｒｅ（Ｔ［１００，１１０］）メッセージを受信することに応じて、第１の及び第５のノード１０８ａ、１０８ｃのローカルトランザクションマネージャ１１４ａ、１１４ｃは、それぞれ、第１のトランザクションに関する第１のローカルレコード７２０をＴ［１００，１１０］に更新し、それらのノードが第１のトランザクションをコミットする準備ができているかどうかの決定を開始する。
【０１２８】
図３５を参照すると、第１のノード１０８ａのデータベースマネージャ１１０ａは、第１のトランザクションがコミットする準備ができていることを示すＯＫ（Ｔ［１００］）メッセージをグローバルトランザクションマネージャ１１６に送信する。第５のノード１０８ｃも、第１のトランザクションがコミットする準備ができていることを示すＯＫ（Ｔ［１００］）メッセージをグローバルトランザクションマネージャ１１６に送信する。
【０１２９】
第１の及び第５のノード１０８ａ、１０８ｃからのＯＫ（Ｔ［１００］）メッセージが受信される図３６を参照すると、グローバルトランザクションマネージャ１１６は、第１のトランザクションが動作しているノードのすべてが第１のトランザクションがコミットする準備ができていることを示したと決定する。グローバルトランザクションマネージャ１１６は、第１のグローバルレコード７２１に、もはや準備していないものとして印を付け、第１のノード１０８ａ及び第５のノード１０８ｃにＣｏｍｍｉｔ（Ｔ［１００］）メッセージを送信し、第１のノード１０８ａのデータベースフラグメント１１２ａ上でｘのｘ［１００］のバージョンにコミットをさせることを含め、第１のトランザクションにコミットをさせる。
【０１３０】
図３７を参照すると、第１のトランザクションがコミットされた状態で、第２のトランザクションが中断から覚める。中断から覚めると、第１のノード１０８ａのデータベースマネージャ１１０ａは、そのことが第１のコミットするトランザクションが勝つ規則に違反するので、第２のトランザクションが第１のノード１０８ａ上でコミットし得ないことを示すＮｏｔ  ＯＫ（Ｔ［１０５］）メッセージをグローバルトランザクションマネージャ１１６に送信する。第５のノード１０８ｃのデータベースマネージャ１１０ｃは、第２のトランザクションがコミットし得ることを示すＯＫ（Ｔ［１０５］）メッセージを送信する。
【０１３１】
図３８を参照すると、第１のノード１０８ａからＮｏｔ  ＯＫ（Ｔ［１０５］）メッセージを受信した結果として、グローバルトランザクションマネージャ１１６が、第２のグローバルレコード７２６を削除し、第１のノード１０８ａ及び第５のノード１０８ｃにＡｂｏｒｔ（Ｔ［１０５］）メッセージを送信することによって第２のトランザクションをアボートする。
【０１３２】
グローバルトランザクションマネージャ１１６からＡｂｏｒｔ（Ｔ［１０５］）メッセージを受信すると、第１のノード１０８ａは、データ要素ｘのｘ［１０５］のバージョンをその第１のノードのデータフラグメント１１２ａから削除し、第２のローカルレコード７２２をその第１のノードのローカルトランザクションマネージャ１１４ａから削除する。同様に、第５のノード１０８ｃは、第２のローカルレコード７２２をその第５のノードのローカルトランザクションマネージャ１１４ｃから削除する。
【０１３３】
１．９  ローカルトランザクションマネージャのパージメカニズム
上述のように、分散型データベースシステム１０２内のノード１０８の各々のためのローカルトランザクションマネージャ１１４は、ノード１０８上で過去に実行されたか又は現在実行されている各トランザクションのレコードを維持する。一部の例において、このプロセスがスケーリングすることを難しくする技術的詳細が存在する。例えば、トランザクションＴ［１０］がそのトランザクションがデータ要素のバージョンｘ［８］を読むことができるかどうかを決定する場合を考える。ｘ［８］はＴ［８］によって書き込まれ、Ｔ［８］がＴ［１０］の前に始まったことが知られている。しかし、Ｔ［８］がコミットした時間又はいったいＴ［８］がコミットをしたのかどうかは、（ｘ［８］自体から）分からない。Ｔ［１０］は、Ｔ［８］のコミット情報をｘから直接得られないが、ローカルトランザクションマネージャ１１４に記憶されたＴ［８］のレコードからこの情報を得ることができる。以下の４つの場合のうちの１つが存在することになる。
１．Ｔ［８］が、まだアクティブである（そして、ローカルトランザクションマネージャ１１４が、Ｔ［８］がまだアクティブであることを知っている）。この場合、Ｔ［１０］は、ｘ［８］を読み取ることができない。
２．Ｔ［８］が、アボートしている（そして、ローカルトランザクションマネージャ１１４が、Ｔ［８］がアボートしていることを知っている）が、アボートが、ｘ［８］をまだ「アンドゥ」していない。この場合、Ｔ［１０］は、ｘ［８］を読み取ることができない。
３．Ｔ［８］がＴ［１０］が始まる前にコミットした、つまり、Ｔ［８］がＴ［８，９］である。この場合、Ｔ［１０］は、ｘ［８］を読み取ることができる。
４．Ｔ［８］がＴ［１０］が始まった後にコミットし、したがって、Ｔ［８］が（例えば）Ｔ［８，１２］である。この場合、Ｔ［１０］は、ｘ［８］を読み取ることができない。
【０１３４】
困難は、上のポイント３及び４から生じる。特に、ローカルトランザクションマネージャ１１４は、（効率的なアクセスのために）そのトランザクションに関するトランザクションの状態をメモリに維持する。ポイント３及び４は、ローカルトランザクションマネージャ１１４がＴ［８］がコミットした後のある時間の期間Ｔ［８］のトランザクションの状態を維持しなければならないことを示唆する。これは、ライフタイムの長い（long-lived）サーバプロセスに関する問題を引き起こす。特に、ローカルトランザクションマネージャ１１４は、可視性の計算を容易にするために必要なだけ長くＴ［８］の状態を維持しなければならず、この状態を無期限に維持することができず、そうでなければ、サーバプロセスがメモリを使い果たし、クラッシュすることになる。
【０１３５】
メモリを使い果たすのを防ぐために、分散型データベースシステム１０２内のローカルトランザクションマネージャ１１４は、「古い」トランザクションの状態（つまり、トランザクションの古いレコード）を周期的にパージする。ローカルトランザクションマネージャ１１４は、２つのパージ戦略、すなわち、最も良くあるケースを対象とするアルゴリズム的に効率的な戦略（「クイックパージ」）と、クイックパージでは十分ではない場合のための、効率的には劣るがより完全な戦略（「完全パージ」）とを使用する。
【０１３６】
概して、パージアルゴリズムは、「グローバル最下点」の概念に依拠する可能性がある。グローバル最下点は、次のように、つまり、Ｔ［ｉ］がシステム内の最も古いアクティブなトランザクションであるものとし、Ｔ［ｊ］がＴ［ｉ］が始まったときの最も古いアクティブなトランザクションであるものとして画定される。グローバル最下点は、ｊである。トランザクションのレコードのパージに関する限り、グローバル最下点は、次のこと、つまり、トランザクション識別子がｊよりも小さいいかなるトランザクションも、そのトランザクションの状態の情報が可視性の計算のために再び必要とされることがないだけ十分前にコミットされたはずであることを示唆する。
【０１３７】
１．９．１  クイックパージ
クイックパージアルゴリズムが始まる前に、ノード１０８のためのローカルトランザクションマネージャ１１４は、コミット識別子によって順序付けられたコミットされたトランザクションのリストを含む。このリストは、可視性の計算のために必要とされる可能性があるすべてのコミットされたトランザクションを含む。クイックパージプロセスを開始するために、ローカルトランザクションマネージャ１１４は、分散型データベースシステム１０２のグローバルトランザクションマネージャ１１６にネットワークメッセージを送信し、分散型データベースシステム１０２に関するグローバル最下点及びグローバルにアクティブなトランザクションのリストを要求する。グローバルトランザクションマネージャ１１６は、要求された情報を含むメッセージによってローカルトランザクションマネージャ１１４に応答する。ローカルトランザクションマネージャ１１４は、コミットされたトランザクションの各々のコミット識別子をグローバル最下点と比較することを含め、コミットされたトランザクションのそのローカルトランザクションマネージャ１１４のリストを処理する。例示的なグローバル最下点よりも小さいコミット識別子を有するすべてのコミットされたトランザクションは、ローカルトランザクションマネージャ１１４からパージされる。一部の例において、クイックパージアルゴリズムは、早期終了条件（early termination condition）を用いるリニアワンパスアルゴリズム（linear one-pass algorithm）である。単一のローカルトランザクションマネージャ上で、クイックパージアルゴリズムは、正しい操作のために必要な最も小さな数のトランザクションを調べることができる。
【０１３８】
図３９を参照すると、分散型データベースシステム２０２の一部は、第１のノード１０８ａ、第２のノード１０８ｂ、及び第５のノード１０８ｃを含む。第２のノード１０８ｂは、分散型データベースシステム２０２のためのリーダーノードとして指定される。第１のノード１０８ａのローカルトランザクションマネージャ１１４ａは、第１のノード１０８ａにおいて既に完了したトランザクションの５つのローカルレコード、すなわち、Ｔ［１００，１２０］の第１のローカルレコード２８４０、Ｔ［６３，８０］の第２のローカルレコード２８４２、Ｔ［５０，６２］の第３のローカルレコード２８４４、Ｔ［２５，３５］の第４のローカルレコード２８４６、及びＴ［２０，３０］の第５のローカルレコード２８４８を含む。第５のノード１０８ｃのローカルトランザクションマネージャ１１４ｃは、第５のノード１０８ｃ上でアクティブであるトランザクションの２つのローカルレコード、すなわち、Ｔ［１１０，ＦＵＴＵＲＥ］の第６のローカルレコード２８５０及びＴ［５３，ＦＵＴＵＲＥ］の第７のローカルレコード２８５２を含む。グローバルトランザクションマネージャ１１６は、分散型データベースシステム内でアクティブであるトランザクションの２つのグローバルレコード、すなわち、Ｔ［１１０，ＦＵＴＵＲＥ］：Ｎ５の第１のグローバルレコード２８５４及びＴ［５３，ＦＵＴＵＲＥ］：Ｎ５の第２のグローバルレコード２８５６を含む。第１のノード１０８ａのローカルトランザクションマネージャ１１４ａは、グローバルトランザクションマネージャ１１６に「Ｐｕｒｇｅ  Ｒｅｑｕｅｓｔ  Ｍｅｓｓａｇｅ」を送信しており、分散型データベースシステム１０２に関するグローバル最下点及びグローバルにアクティブなトランザクションのリストを要求する。
【０１３９】
図４０を参照すると、グローバルトランザクションマネージャ１１６は、例えば、この場合は４８であるグローバル最下点と、例えば、Ｔ［１１０］及びＴ［５３］を含むグローバルにアクティブなトランザクションのリストとによって「Ｐｕｒｇｅ  Ｒｅｑｕｅｓｔ  Ｍｅｓｓａｇｅ」に応答する。任意のクイックパージを実施するために、ローカルトランザクションマネージャ１１４ａは、最も古いものから最も新しいものまでトランザクションのそのローカルトランザクションマネージャ１１４ａのローカルレコードに繰り返し適用され、ローカルレコードのコミット識別子を例示的なグローバル最下点と比較して、どのローカルレコードをパージすべきかを決定する。この例においては、第５のローカルレコード２８４８のコミット識別子（すなわち、３０）が、例示的なグローバル最下点（すなわち、４８）と比較される。３０は４８より小さいので、第５のローカルレコード２８４８は、ローカルトランザクションマネージャ１１４ａからパージされる。次に、第４のローカルレコード２８４６のコミット識別子（すなわち、３５）が、グローバル最下点（すなわち、４８）と比較される。３５は４８より小さいので、第４のローカルレコード２８４６は、ローカルトランザクションマネージャ１１４ａからパージされる。そして、第３のローカルレコード２８４４のコミット識別子（すなわち、６２）が、例示的なグローバル最下点（すなわち、４８）と比較される。６２は４８より大きいので、第３のローカルレコード２８４４はパージされず、この場合、クイックパージアルゴリズムが完了する。
【０１４０】
１．９．２  完全パージ
一部の例において、上述のクイックパージアルゴリズムは、トランザクションが比較的安定した率で到着し、実行され、完了する作業負荷に対して有効である。しかし、すべての作業負荷が、これらの特徴を有するとは限らない。特に、一部の例において、クイックパージアルゴリズムは、長くランされる(long-running)トランザクション（すなわち、ライフタイムが平均よりも著しく長いトランザクション）に上手く対処しない。そのような例において、ローカルトランザクションマネージャ１１４は、完全パージアルゴリズムを使用する。
【０１４１】
概して、完全パージアルゴリズムは、ローカルトランザクションマネージャ１１４が例示的なグローバル最下点及びグローバルにアクティブなトランザクション識別子のリストを所有し、クイックパージアルゴリズムを既に実施した可能性があると実行される。完全パージアルゴリズムは、ローカルトランザクションマネージャ１１４によって記憶されたコミットされたトランザクションのローカルレコードに繰り返し適用され得る。各ローカルレコードＴ［ｉ，ｊ］に関して、ローカルトランザクションマネージャ１１４は、グローバルにアクティブなトランザクション識別子のリストに対して繰り返し適用され、それぞれのグローバルにアクティブなトランザクション識別子ｇをローカルレコードのトランザクション識別子（すなわち、ｉ）及びコミット識別子（すなわち、ｊ）と比較して、ローカルレコードがパージされ得るかどうかを決定し得る。概して、i < g < jであるようなグローバルにアクティブなトランザクション識別子ｇが存在する場合、ローカルレコードはパージされ得ない。そのようなｇが特定されない場合、ローカルレコードはパージされ得る。
【０１４２】
i < g < jであるようなｇが存在する場合にＴ［ｉ，ｊ］を維持する必要があることは、次のこと、つまり、この特定のローカルトランザクションマネージャ１１４に参加しなかったが、Ｔ［ｉ，ｊ］と同時に存在するアクティブなトランザクションＴ［ｇ］が存在することを示唆するということに留意されたい。もしもＴ［ｇ］が参加するようなことがあれば、Ｔ［ｉ，ｊ］の状態情報が、Ｔ［ｇ］の可視性の判断のために必要とされる可能性がある。
【０１４３】
図４１を参照すると、クイックパージアルゴリズムが、（図４０に示されたように）実施されており、ローカルトランザクションマネージャ１１４ａが、グローバルにアクティブなトランザクションＴ［５３］及びＴ［１１０］のリストを有する。完全パージアルゴリズムは、第１のローカルレコード２８４０、第２のローカルレコード２８４２、及び第３のローカルレコード２８４４に繰り返し適用される。
【０１４４】
完全パージアルゴリズムが第１のローカルレコード２８４０に達するとき、アルゴリズムは、グローバルにアクティブなトランザクションのリストのトランザクション識別子（すなわち、５３及び１１０）を第１のローカルレコード２８４０のトランザクション識別子（すなわち、１００）及びコミット識別子（すなわち、１２０）と比較して、第１のローカルレコード２８４０がパージされ得るかどうかを決定する。この例においては、トランザクション識別子「１１０」を有するグローバルにアクティブなトランザクションが存在する。「１１０」は第１のローカルレコード２８４０のトランザクション識別子（すなわち、１００）とコミット識別子（すなわち、１２０）との間に入るので、第１のローカルレコード２８４０はパージされない。
【０１４５】
完全パージアルゴリズムが第２のローカルレコード２８４２に達するとき、アルゴリズムは、グローバルにアクティブなトランザクションのリストのトランザクション識別子（すなわち、５３及び１１０）を第２のローカルレコード２８４２のトランザクション識別子（すなわち、６３）及びコミット識別子（すなわち、８０）と比較して、第２のローカルレコード２８４２がパージされ得るかどうかを決定する。この例においては、グローバルにアクティブなトランザクションのトランザクション識別子のいずれも第２のローカルレコード２８４２のトランザクション識別子（すなわち、６３）とコミット識別子（すなわち、８０）との間に入らないので、第２のローカルレコード２８４２はパージされる。
【０１４６】
完全パージアルゴリズムが第３のローカルレコード２８４４に達するとき、アルゴリズムは、グローバルにアクティブなトランザクションのリストのトランザクション識別子（すなわち、５３及び１１０）を第３のローカルレコード２８４４のトランザクション識別子（すなわち、５０）及びコミット識別子（すなわち、６２）と比較して、第３のローカルレコード２８４４がパージされ得るかどうかを決定する。この例においては、トランザクション識別子「５３」を有するグローバルにアクティブなトランザクションが存在する。「５３」は第３のローカルレコード２８４４のトランザクション識別子（すなわち、５０）とコミット識別子（すなわち、６２）との間に入るので、第３のローカルレコード２８４４はパージされない。
【０１４７】
図４１の例においては、完全パージアルゴリズムの完了時に、第１のローカルレコード２８４０及び第３のローカルレコード２８４４以外のすべてのローカルレコードが、第１のノード１０８ａのローカルトランザクションマネージャ１１４ａからパージされる。
【０１４８】
２  実施形態
上述の分散型データベースシステムは、例えば、好適なソフトウェア命令を実行するプログラミング可能なコンピューティングシステムを用いて実装される可能性があり、又はフィールドプログラマブルゲートアレイ（ＦＰＧＡ，field-programmable gate array）などの好適なハードウェアで、若しくは何らかの混成の形態で実装される可能性がある。例えば、プログラミングされる手法において、ソフトウェアは、それぞれが少なくとも１つのプロセッサ、（揮発性及び／又は不揮発性メモリ及び／又はストレージ要素を含む）少なくとも１つのデータストレージシステム、（少なくとも１つの入力デバイス又はポートを用いて入力を受け取るため、及び少なくとも１つの出力デバイス又はポートを用いて出力を与えるための）少なくとも１つのユーザインターフェースを含む（分散、クライアント／サーバ、又はグリッドなどのさまざまなアーキテクチャである可能性がある）１又は２以上のプログラミングされた又はプログラミング可能なコンピューティングシステム上で実行される１又は２以上のコンピュータプログラムのプロシージャを含み得る。ソフトウェアは、例えば、データフローグラフの設計、構成、及び実行に関連するサービスを提供するより大きなプログラムの１又は２以上のモジュールを含む可能性がある。プログラムのモジュール（例えば、データフローグラフの要素）は、データリポジトリに記憶されたデータモデルに準拠するデータ構造又はその他の編成されたデータとして実装され得る。
【０１４９】
ソフトウェアは、ある期間（例えば、ダイナミックＲＡＭなどのダイナミックメモリデバイスのリフレッシュ周期の間の時間）媒体の物理特性（例えば、表面ピット及びランド、磁区、又は電荷）を使用して、揮発性若しくは不揮発性ストレージ媒体又は任意のその他の非一時的媒体に具現化されるなど、非一時的形態で記憶され得る。命令をロードするのに備えて、ソフトウェアは、ＣＤ−ＲＯＭ又は（例えば、多目的若しくは専用のコンピューティングシステム若しくはデバイスによって読み取り可能な）その他のコンピュータ可読媒体などの有形の非一時的媒体上に提供される可能性があり、或いはそのソフトウェアが実行されるコンピューティングシステムの有形の非一時的媒体にネットワークの通信媒体を介して配信される（例えば、伝播信号に符号化される）可能性がある。処理の一部又はすべては、専用のコンピュータ上で、又はコプロセッサ若しくはフィールドプログラマブルゲートアレイ（ＦＰＧＡ，field-programmable gate array）若しくは専用の特定用途向け集積回路（ＡＳＩＣ，application-specific integrated circuit）などの専用のハードウェアを使用して実施される可能性がある。処理は、ソフトウェアによって規定された計算の異なる部分が異なるコンピューティング要素によって実施される分散された方法で履行される可能性がある。それぞれのそのようなコンピュータプログラムは、本明細書において説明された処理を実施するためにストレージデバイスの媒体がコンピュータによって読み取られるときにコンピュータを構成し、動作させるために、多目的又は専用のプログラミング可能なコンピュータによってアクセスされ得るストレージデバイスのコンピュータ可読ストレージ媒体（例えば、ソリッドステートメモリ若しくは媒体、又は磁気式若しくは光学式媒体）に記憶されるか又はダウンロードされることが好ましい。本発明のシステムは、コンピュータプログラムによって構成された有形の非一時的媒体として実装されると考えられる可能性もあり、そのように構成された媒体は、本明細書において説明された処理ステップのうちの１又は２以上を実施するために特定の予め定義された方法でコンピュータを動作させる。
【０１５０】
本発明のいくつかの実施形態が、説明された。しかしながら、上述の説明は、以下の請求項の範囲によって画定される本発明の範囲を例示するように意図されており、限定するように意図されていないことを理解されたい。したがって、その他の実施形態も、以下の請求項の範囲内にある。例えば、本発明の範囲を逸脱することなくさまざまな修正がなされ得る。さらに、上述のステップの一部は、順序に依存しない可能性があり、したがって、説明された順序とは異なる順序で実施される可能性がある。
【図１】
0006498352.tif 000002
【図２】
0006498352.tif 000003
【図３】
0006498352.tif 000004
【図４】
0006498352.tif 000005
【図５】
0006498352.tif 000006
【図６】
0006498352.tif 000007
【図７】
0006498352.tif 000008
【図８】
0006498352.tif 000009
【図９】
0006498352.tif 000010
【図１０】
0006498352.tif 000011
【図１１】
0006498352.tif 000012
【図１２】
0006498352.tif 000013
【図１３】
0006498352.tif 000014
【図１４】
0006498352.tif 000015
【図１５】
0006498352.tif 000016
【図１６】
0006498352.tif 000017
【図１７】
0006498352.tif 000018
【図１８】
0006498352.tif 000019
【図１９】
0006498352.tif 000020
【図２０】
0006498352.tif 000021
【図２１】
0006498352.tif 000022
【図２２】
0006498352.tif 000023
【図２３】
0006498352.tif 000024
【図２４】
0006498352.tif 000025
【図２５】
0006498352.tif 000026
【図２６】
0006498352.tif 000027
【図２７】
0006498352.tif 000028
【図２８】
0006498352.tif 000029
【図２９】
0006498352.tif 000030
【図３０】
0006498352.tif 000031
【図３１】
0006498352.tif 000032
【図３２】
0006498352.tif 000033
【図３３】
0006498352.tif 000034
【図３４】
0006498352.tif 000035
【図３５】
0006498352.tif 000036
【図３６】
0006498352.tif 000037
【図３７】
0006498352.tif 000038
【図３８】
0006498352.tif 000039
【図３９】
0006498352.tif 000040
【図４０】
0006498352.tif 000041
【図４１】
0006498352.tif 000042