ここで開示される実装において、トランザクション番号等のトランザクション識別子は、サーバー・システムに保存されるレコードのアップデート各々に関連付けられてよい。ここで使用されるように、トランザクション番号は、サーバー・システムにおいてトランザクションに対して指定される固有の番号を指すことができ、トランザクションはレコードの生成及び/又は更新であってもよい。トランザクション・ヘッダが、指定されたトランザクション・カウンタ番号で更新される場合、新たなクエリは、その指定されたトランザクション・カウンタ番号を、それらのマルチバージョン同時制御(MVCC)スナップショットとして使用し得る。開示される対象事項の実装において、行ルックアップ・オペレーションは、コミットされていない(アンコミットされている)ように見える行レコードに遭遇するかもしれず、なぜなら行レコードはそれらに指定されるトランザクション・カウンタ番号を有していないかもしれないからである(即ち、トランザクション・カウンタ番号がそれらにスタンプされていないかもしれない)。行レコードは、同時オペレーションにおいてスタンプされる(即ち、コミット済みとなるような)過程におけるものであり得る。
トランザクション番号について、コミットされていないように見える行に遭遇したキー・ルックアップは、そのトランザクション番号がコミットされるか否かを判断するために、対応するトランザクション・ヘッダにアクセスし得る。トランザクション番号がコミットされていると判断される場合、トランザクション・カウンタ番号が決定され得る。行がコミットされるべきであると判断される場合、ルックアップを実行する1つ以上のオペレーションは、行レコード・バーションにトランザクション・カウンタ番号を指定(即ち、スタンプ)することができる。
トランザクションについてコミット・タイム処理(the commit-time processing)を終了し得るシステムは、トランザクションにより影響を受ける行を訪れることができる。システムは、その行をトランザクション・カウンタ番号でスタンプすることができ(同時ルックアップがそうしていない場合)、任意の行のロックを解放することができる。即ち、トランザクション・ヘッダ・レコードに対するトランザクション・コミット番号の指定は、トランザクションをコミットすることができ、行のロックはトランザクションのコミットメントに基づいて解放される。コミットメントについての知識は、コミット・タイム処理のこの最終段階の間に行レコードに転送され得る。より大きなトランザクションは、コミット・タイム処理を終えるためにより長くかかり得るが、他のコミット・トランザクションの処理を妨げないであろう。更に、適切なMVCCスナップショットを有する同時トランザクションは、影響を受ける行にアクセスするために、コミット・タイム処理が完了まで待機する必要はないかもしれない。ここで開示されるシステム及び方法では、トランザクション・カウンタ番号にとって、キー・ルックアップにより又は進行中のコミット・タイム処理によりスタンプされることは十分であり得る。
典型的なデータベース・システムは、異なる場所に保存されるデータベース・レコードの異なるバージョンを有する。トランザクション又はレコードのステータスは様々な時間に様々な場所で更新される。典型的なデータベース・システムは、システムに対するクエリが異なる場所から行われる場合に、データベース・システム経験が類似するように、異なる場所に保存されるレコードの同時性を制御しようと試みるが、異なる場所に保存されるレコードに対する更新は周期的にしか実行されない。各々の場所は異なる時間に更新され得る。従って、ある場所に保存されるレコードは異なる場所に保存されるレコードよりも最新であるかもしれない。従って、異なる場所に保存されるレコードを調和させるための周期的な更新の間の時間等において、クエリがデータベース・システムに対して行われる場合に、特定の場所でどのデータが利用可能であるかに依存して、結果に不一致が生じる。
開示される対象事項の実装は、レコードの同時性を制御し、そして指定されたトランザクション・カウンタ番号を有する更新されたトランザクション・ヘッダを利用することにより、データベース・システムに対して為されたクエリに、より最新の情報を提供する。新たなクエリは、この指定されたトランザクション・カウンタ番号を、それらのMVCCスナップショットとして使用することができる。即ち、データベース・システムにとって、コミットされていないものとして見えるトランザクションは(なぜなら、トランザクションは、トランザクション・カウンタ番号でスタンプされていないからである)、これらのトランザクションがスタンプされる過程におけるものである場合(例えば、コミットされていないトランザクションではなく、レコード・バージョンとなるように処理される場合)、クエリに応答するために使用されてよい。これは、最新であるデータを、クエリに利用可能にするが、そうでなければ、データベース・システムがレコード・バージョンとしてコミットするまで時間を費やすであろう。コミット処理を実行するための時間は、トランザクションのサイズに依存して変わり得る(例えば、より大きなトランザクションは、比較的より小さなトランザクションよりも、システムがコミットするまで長時間を費やし得る)。
マルチテナントは、例えばユーザー、ユーザーのグループ、又は組織等であってもよい様々なテナントが、様々なテナントの間で共有され得るサーバー・システム上のソフトウェア・ツール又はインスタンスにより、サーバー・システム上の各自自身のレコードにアクセスすることを許容することができる。各テナントのレコードは、そのテナントに関するデータベースの一部分であってもよい。複数のテナントのレコードは、同じサーバー・システムの中に全て一緒に保存され得るが、各々のテナントは、そのテナントに帰属する又はそのテナントにより作成されたレコードにアクセスすることができるだけであってもよい。これは、各々のテナントのレコードを別々に、例えば個々のサーバー又はサーバー・システムに保存する必要無しに、サーバー・システムがマルチテナントを可能にすることを許容し得る。テナントのデータベースは、例えば、リレーショナル・データベース、階層データベース、又は適切な他の任意のデータベース・タイプであってもよい。サーバー・システムに保存される全てのレコードは、例えばLSM(a log-structured merge)ツリーを含む適切な任意の構造に保存され得る。
ここで開示されるレコードは、マルチテナント・システムのインスタンスにおけるキー・バリュー・ペアにより識別され得る。バリュー(値)は、例えば、リレーショナル・データベースのテーブルの行の内容、リレーショナル・データベースのテーブルの行の識別子、又は適切な他の任意の値であってもよい。キーは、レコードに対する識別子であってもよく、そして例えば英数字シーケンス等の適切な任意の形式におけるものであってよい。キーの一部分は、レコードに関する情報を提供してもよい。例えば、キーの一部分は、レコードが帰属するテナントを一意に識別し得るテナント識別子であってもよい。キーの他の部分は、例えば、レコードの値が行の内容である場合にはテーブル番号及び行の識別子、又は値が行の識別子である場合には、テーブル番号、テーブルにおけるインデックス番号、及びインデックスされた列の識別子を識別してもよい。
更に、マルチテナント・システムは、各ノードでコンピューティング・システムを有する、ネットワークを通じて分散されたサーバー・システム上の様々なテナント・インスタンスを有することができ、本願ではインスタンス・ノードと言及され得る。インスタンス・ノードは、データベース・システムの特定の場所に保存されるデータベースのレコード、及び/又は特定のテナントのためのものであってもよいレコードを含み得る。各々のインスタンスは、データベース・ファイル又はレコードを管理する一組のメモリ構造を含み得る。データベースは、ストレージ・デバイスに保存される一組のファイル及び/又はレコードを含んでもよく、ストレージ・デバイスは本願で開示されるようなサーバー・システムの一部分であってもよい。インスタンスは、関連するデータを管理し、データベースのユーザーに応対する。インスタンスは、特定の場所に保存されたレコードのため及び/又は特定のテナントのために特定の時点を表現し、異なるインスタンスはデータベース・レコードの異なるバージョンを有し得る。各テナントのライブ又はプロダクション・データベース・インスタンスは、1つのコンピュータ・システムで処理されるトランザクションを有するだけであってもよい。そのインスタンスのトランザクションを処理するコンピューティング・システムはまた、他のテナントの他のインスタンスのトランザクションを処理してもよい。各々のサーバー・システムは、そのテナントのライブ又はプロダクション・インスタンスに関してそのサーバー・システムによりトランザクションがコミットされている順序で厳密に昇順又は降順に(テナントのインスタンスにとって)固有のトランザクション番号を指定してもよい。更に、各々のサーバー・システムは、そのテナントのライブ又はプロダクション・インスタンスに関してその特定のサーバー・システムによりトランザクションがコミットされている順序で厳密に昇順又は降順に(テナントのインスタンスにとって)固有のトランザクション番号を指定してもよい。他のノードにおける他のサーバー・システムに関し、それらは同様に、トランザクションをコミットするために同じトランザクション番号割り当て方式を使用してもよい。
全体にわたって説明されるデータベース・システム(例えば、図5-7に示されるシステム100、図9に示されるセントラル・コンポーネント700及び/又は別のコンピュータ800、又は図10に示されるデータベース1200a、1200b、1200c及び/又は1200d)及びテナント・マイグレーション方法において、レコードはマルチテナント・システムのインスタンスにおけるキー・バリュー・ペアとして識別されてもよい。データベースにおけるテナンシー(Tenancy)が作成され、テナンシーに関連付けられる認証されたユーザーは、そのテナンシーに関するオペレーションを眺める、アクセスする、及び/又は実行することができる。例えば、値は、リレーショナル・データベースのテーブルの行の内容、リレーショナル・データベースのテーブルにおける行の識別子、又は適切な他の任意の値であってもよい。キーは、例えば英数字シーケンス等の適切な任意の形式におけるレコードに関する識別子であってもよい。キーの一部分はレコードの内容に関する上方を提供してもよい。例えば、キーの一部分は、レコードの内容が帰属するテナントを一意に識別し得るテナント識別子であってもよい。キーの他の部分はテーブル番号を識別してもよい。キーの一部分はまた、行の識別子を提供してもよい(例えば、レコードの値が行の内容である場合である)。キーの一部分はまた、例えば、テーブル番号、テーブルにおけるインデックス番号、及び値が行の識別子である場合にインデックスされた列の識別子を含んでもよい。
データベース・システム(例えば、図5-7に示されるシステム100、図9に示されるセントラル・コンポーネント700及び/又は別のコンピュータ800、又は図10に示されるデータベース1200a、1200b、1200c及び/又は1200d)は、所与のレコードの不変バージョンとしてトランザクションを保存してもよい。サーバー・システムに既に保存されているレコードの内容の不変バージョンは、内容がサーバー・システムから(極めて希に)削除されるまで変更されないであろう。即ち、受信されるトランザクションは、レコードの内容を変更する代わりに、サーバー・システムに保存されるレコードの内容の新たなバージョンを作成し得る。従って、本願で開示されるレコードの複数のバージョン(例えば、異なる内容を有するレコード)に関し、トランザクション識別子(例えば、トランザクション番号を含み得る)を除いて同じキーを有することが可能になり得る。他の点で、所与のレコードのバージョンに関する同一キーの使用は、リレーショナル・データベースに保存されたデータの変化を許容する。従って、物理的なレコードの各バージョンは不変であってもよく;即ち、それは削除されない、又は月、年又は数十年であり得る任意の長期間にわたって削除されない。例えば、レコードの早期のバージョンに対して、(トランザクション識別子以外)同一のキーを有するレコードの後のバージョンは、そのレコードに対するデータ値における変化(即ち、レコードの内容の変化)を示し得る。代替的に、トランザクションはレコードを作成し得る又はレコードを削除し得る(即ち、コンテンツを作成又はコンテンツを削除し得る)。レコードは、「トゥームストーン(tombstone)」(例えば、削除されるべきデータを識別するマーカー)を挿入することにより削除されてもよく、将来的な時点で、更新されたレコードが書き込まれてもよい(もはやトゥームストーンによりマークされたレコードを含まない)。
タイム・スタンプ又は他の時間識別子が、テナントの形成の際に作成されてもよい。その後、テナント・データは、タイム・スタンプより前に保存されたデータのプールにおけるキーに基づいて適切なバージョンにアクセスすることにより、タイム・スタンプより前のデータのバージョンのための主要キー・リクエストを解釈し得る。タイム・スタンプより後に作成又は更新されたデータにアクセスする個々のテナントのためのキーは、テナントにより作成された適切なデータにアクセスするように解釈されるであろう。あるいは、タイム・スタンプを使用するのではなく、データベース内の各トランザクションは、その後の各トランザクションに関して単調に増加する関連する固有のトランザクション番号を有してもよく、システムは、タイム・スタンプの代わりに、最も最近に作成されたトランザクション識別子に留意することができる。
開示される対象事項の実装において、トランザクション識別子は、サーバー・システムに保存されるレコードのアップデート各々に関連付けられてもよい。トランザクション識別子は、例えば、厳密に増加し得るトランザクション番号を含んでもよい。即ち、各々の以後のトランザクションのトランザクション番号は、常に、先行するトランザクションよりも高い。これは、トランザクション番号によって順序付けることが可能なトランザクションを許容することができ、あるユーザーに関して後に保存されるトランザクションは、常に、そのユーザーに関して先に保存されたトランザクションより高いトランザクション番号を有する。所与のユーザーの又はテナントのトランザクションは、トランザクション番号によって時間順にされてもよい。幾つかの実施形態において、トランザクションに関連するトランザクション番号は、クロック時間に同期した値に基づくトランザクション番号に起因して、トランザクションに関する大凡のタイム・スタンプとして振る舞うことが可能であり、レコードのバージョンであってもよいトランザクションの組織化及び抽出を、それらが保存された大凡の時間に基づいて許容する。
開示される対象事項の実装において、トランザクション番号は、トランザクションがコミットされる場合にトランザクションに割り当てられてもよい。割り当てられるトランザクション番号は、図5に示され及び後述されるトランザクション・カウンタ110等のカウンタに基づいてもよい。即ち、トランザクション・カウンタはトランザクション・カウンタ番号を生成することができ、生成されたトランザクション・カウンタ番号は、トランザクションがコミットされる場合に、トランザクションのトランザクション番号、又はトランザクション番号の一部分として割り当てられてもよい。以下に説明される幾つかの実装において、トランザクション番号は、タイム・スタンプとタイム・スタンプ以来のトランザクションの番号を示すトランザクション・カウントとの双方を有してもよい。そのような実装において、コミットされるトランザクションは、トランザクションに関連付けられる又は割り当てられる固有のトランザクション番号を有するであろう。
以下に詳細に説明されるように、図1-4Bは、開示される対象事項の実施例によるトランザクションをコミットする方法を示し、図5-11は開示される対象事項の実施例によるトランザクション・カウンタ番号の割り振りに相応しい構成例を示す。図1-11に関連して説明される方法及び構成を利用する具体例が、これらの方法及び構成の説明の後に続く。
図1は開示される対象事項の実装に従ってトランザクション・カウンタ番号がマルチバージョン同時制御(MVCC)として使用され得るようにトランザクションをスタンピングする方法例10を示す。方法10はデータベース・システムにとってコミットされていないように見えるトランザクションを提供し、そのトランザクションは、これらのトランザクションが、スタンプされる過程におけるものである場合に(例えば、コミットされていないトランザクションではなく、レコード・バージョンとなるように処理される場合に)、クエリに応答するために使用され得る。これは、最新であるデータを、クエリにとって利用可能にするが、そうでなければデータベース・システムがレコード・バージョンとしてコミットするまで時間がかかるであろう。オペレーション11において、サーバー・システム及び/又はデータベース・システム(例えば、図5-9のサーバー・システム100、図10のデータベース1200a-d)は、トランザクション・カウンタ番号に関するクエリを、コンピュータ(例えば、図9に示されるコンピュータ600及び/又は別のコンピュータ800、及び/又は図7に示されるサーバー・システム400等の他のサーバー・システム)から受信し得る。オペレーション12において、データを識別するトランザクション・ヘッダが、指定されたトランザクション・カウンタ番号とともに(例えば、図5のトランザクション番号マネージャ130により)更新される場合、データを識別する更新されたトランザクション・ヘッダは、受信したクエリにより、マルチバージョン同時制御情報のインスタンスとして使用され得る。ストレージ(例えば、図5に示されるストレージ140)に保存されるトランザクション(例えば、図5に示されるコミットされていないトランザクション145及び/又はレコード・バージョン160)は、サーバー・システム(例えば、図5に示されるサーバー・システム100)により受信されるクエリにとってトランザクションをビジブル(visible)及び/又は認識可能にし得るデータを識別するトランザクション・ヘッダを含んでもよい。例えば、データを識別するトランザクション・ヘッダにおけるトランザクション・カウンタ番号は、クエリにとってトランザクションをビジブル及び/又は認識可能にし得る。マルチバージョン同時制御情報は、テナント・データのインスタンスに関して及び/又はデータベース(例えば、図5-9のサーバー・システム、図10のデータベース1200a-d)のインスタンス・ノードに関して特定の時点におけるコミットされていないトランザクション及び/又はレコードの状態を識別するために使用されてもよい。サーバー・システム100は、オペレーション14において、受信したクエリに基づいてデータベースのテーブルにおけるキー・ルックアップを実行してもよく、キーはデータベースのテーブルにおける1つ以上の行の識別子を含む。キー・ルックアップはデータベース内のコミットされていないトランザクション(例えば、図5に示されるコミットされていないトランザクション145)及びコミットされているトランザクション(例えば、レコード・バージョン160)を識別するために使用され得る。例えば、図5に示されるサーバー・システム100は、受信したクエリに基づいて、コミットされていないトランザクション145(例えば、キー151を有するトランザクション146、キー152を有するトランザクション147、キー153を有するトランザクション148、及び/又はキー154を有するトランザクション149)及び/又はレコード・バージョン160(例えば、キー171を有するトランザクション191、キー172を有するトランザクション192等)に関してキー・ルックアップ・オペレーションを実行し得る。
オペレーション16において、キー・ルックアップが、トランザクション番号に関してストレージ140におけるコミットされていない行に遭遇した場合、データを識別する対応するトランザクション・ヘッダがアクセスされ、ストレージ内のデータ・アレイ要素を識別し、トランザクション番号がコミットされるか否か、及び対応するトランザクション・カウンタ番号を決定してもよい。コミットされていない行は、それらに指定されるトランザクション・カウンタ番号を有しない行レコードであるかもしれない(即ち、トランザクション・カウンタ番号がそれらに対してスタンプされていないかもしれない)。図示されるように、例えば、図5において、ストレージ140はコミットされていないトランザクション45を有し、及び/又はコミットされたトランザクションを有し得るレコード・バージョン160を有し得る(例えば、トランザクション番号191,192,193,194,195,196,197,及び/又は198)。トランザクション・カウンタ番号は、トランザクション番号がコミットされた場合に決定されてもよい(例えば、トランザクション番号は、ストレージ140のレコード・バージョン160の中のレコードである)。即ち、トランザクション番号は、トランザクションがコミットされた場合にトランザクションに割り当てられてもよい。割り当てられるトランザクション番号はカウンタ(例えば、図5に示されるトランザクション・カウンタ110)に基づいていてもよい。トランザクション・カウンタはトランザクション・カウンタ番号を生成することができ、生成されたトランザクション・カウンタ番号は、トランザクションがコミットされる場合に、トランザクションを生成してトランザクションにトランザクション番号を割り振る際に使用される。開示される対象事項の幾つかの実装では、オペレーション16において対応するトランザクション・ヘッダ(コミットされていないトランザクション145及び/又はレコード・バージョン160のヘッダ)にアクセスすることは、行バージョン・レコード及び行ロック・レコードに関するトランザクション・ヘッダ・インデックス・フィールドを利用してデータ・アレイ要素を識別することを含み得る。データ・アレイ要素は、コミットされていないトランザクション145の値155,156,157,158、及び/又はレコード・バージョン160の181,182,183,184,185,186,187,及び/又は188を利用して識別されてもよい。オペレーション18において、トランザクション・カウンタ番号は、(例えば、トランザクション番号マネージャ130により)行バージョン・レコードにスタンプされてもよい。サーバー・システムは、トランザクション・カウンタ番号のスタンピングに基づいて、トランザクションのコミット・タイム処理を完了してもよい。即ち、コミット・タイム処理は、今のところコミットされていないトランザクションであるトランザクションを処理することができ、そのためそれらはレコード・バージョン(例えば、コミットされたトランザクション)になる。
開示される対象事項の幾つかの実装において、トランザクション識別子を有するトランザクションにより影響を受ける各々の行は、トランザクション・カウンタ番号でスタンプされてもよく、任意の行のロックが解放されてもよい。このオペレーションは、コミット・タイム処理の一部分としてサーバー・システムにより実行されてもよい。
幾つかの実装では、1つ以上の行ルックアップ・レコードが、サーバー・システムにとってコミットされていないものとして見える場合に、行ルックアップが実行されてもよく(例えば、行レコードは、図5に示されるコミットされていないトランザクションの一部である)、そのため1つ以上の行ルックアップ・レコードは、それらがトランザクション・カウンタ番号でスタンプされない場合にアンコミットされる。即ち、1つ以上のアンコミットされた行ルックアップ・レコードは、サーバー・システム100により処理され得る一方、1つ以上のアンコミットされたレコードはクエリにとって外的にビジブル及び/又は認識可能ではない。
図2はトランザクションが認識可能でない場合に(即ち、図5に示されるサーバー・システム100により受信されるクエリに対して認識可能及び/又はビジブルでない場合に)レコードに対するトランザクションをコミットする開示される対象事項の実装による方法例20を示す。請求項20の方法は、トランザクションが認識可能及び/又は視察可能になるまでレコードに対するトランザクションをコミットすることができない現在のデータベース・システムを改善する。請求項20の方法は、最新であるデータが、クエリにとって利用可能であることを許容するが、そうでない場合、データベース・システムがレコード・バージョンとしてコミットするまで時間がかかるであろう。開示される対象事項の実装において、認識可能でない及び/又はビジブルでないトランザクションは、典型的には、コミットされていないトランザクション(例えば、図5に示されるコミットされていないトランザクション145)である。トランザクションがトランザクション・カウンタ番号及び/又はトランザクション番号のうち少なくとも1つを有する場合、トランザクションはクエリにとって認識可能及び/又はビジブルであり得る。トランザクションは認識可能及び/又はビジブルでない場合、トランザクション・ロックがトランザクション番号に関して据えられ、そのためトランザクションは変更されず、操作されず、及び/又はクエリにとって認識可能にされてもよく、なぜならトランザクションはレコードにコミットされるように処理されているからである。
幾つかの実装において、方法20は選択的なオペレーション21を含み得る。選択的なオペレーション21において、トランザクション識別子(例えば、サーバー・システムに保存されるレコードのアップデート各々に関連付けられるトランザクション番号又は他の適切な識別子)はサーバー・システム(例えば、図5に示されるサーバー・システム100)によりハッシュされてもよい。ハッシュに対する代替として、サーバー・システム(図5に示されるサーバー・システム100)は、オペレーション21において、トランザクション識別子の直接的なルックアップを実行してもよい。(例えば、コミットされていないトランザクション145のトランザクション146,147,148及び/又は149のような)トランザクション識別子のバケットが、オペレーション22において、レコード・チェーンに対するアクセスを制御するためにラッチされてもよい。ハッシュ・オペレーションがオペレーション21において実行された場合、バケットは(例えば、図5に示されるような値155,156,157,及び/又は158のうちの一部であってもよいし、又はトランザクション146,147,148,及び/又は149のうちの一部分であってもよい)トランザクション識別子のハッシュを含むことができ、トランザクション識別子をハッシュすることによる如何なるハッシュ衝突もオペレーション22において解決され得る。オペレーション24において、(例えば、図5に示されるトランザクション番号マネージャ130により)トランザクション・カウンタ番号が、データを識別するトランザクション・ヘッダにおいて、トランザクション番号に対して設定され得る。オペレーション26において、バケットはアンラッチされ(又はラッチ解除され)、(例えば、リード・オペレーションで使用されてもよい)トランザクション・カウンタ番号が、(例えば、トランザクション番号マネージャ130及び/又はストレージ・マネージャ135により)更新されてもよい。オペレーション28において、トランザクション番号に関するトランザクション・ロック(例えば、トップ・レベルのトランザクション・ロック)は、トランザクション番号をアンブロックするためにトランザクション・マネージャにより開放されてもよい。これは、レコードに対するトランザクションをコミットすることができ、トランザクションが、クエリに対して認識可能及び/又は視察可能であることを許容し得る。
幾つかの実装において、オペレーション24においてデータを識別するトランザクション・ヘッダにおいてトランザクション・カウンタ番号を設定することは、トランザクションに関連する全ての行ロックを解放することを更に含んでもよい。データを識別するトランザクション・ヘッダにおいてトランザクション・カウンタ番号を設定することは、1つ以上のクエリにとってトランザクションをビジブルにすることができる。
図3はトランザクションがサーバー・システムによりビジブル及び/又は認識可能である場合に(即ち、クエリに対してビジブルである場合に)レコードに対するトランザクションをコミットする開示される対象事項の実装による方法例30を示す。即ち、方法30は、トランザクションにより影響を受けるデータベースの行を訪れ、そしてそれらにトランザクション制御番号でスタンピングすることにより、トランザクションのためのコミット・タイム処理のオペレーションを実行することに関連する。方法30は、複数のトランザクションのためのコミット・タイム処理を実行するために使用されてもよく、そのため、コミット・タイム処理されるために比較的長い時間がかかり得るより大きなトランザクションは、より小さな他のトランザクションとともに処理されてもよく、従って本願ではなく従来技術を利用する場合に可能になるものより比較的短い時間しかかからないであろう。オペレーション32において、(例えば、図5に示されるトランザクション番号191,192,193,194,195,196,197,及び/又は198等の)トランザクション識別子のハッシュ・バケットは、(例えば、ストレージ140に保存され得る)レコード・チェーンへのアクセスを制御するためにラッチされ得る。データを識別するトランザクション・ヘッダにおいて現在のキー・ハッシュ値と現在のシーケンス番号とは、オペレーション34において、(例えば、トランザクション番号マネージャ130及び/又はストレージ・マネージャ135により)設定されることができ、そしてハッシュ・バケットは、オペレーション36において、(例えば、トランザクション番号マネージャ130及び/又はストレージ・マネージャ135により)トランザクション識別子に関してアンラッチされてもよい。シーケンス番号は、行バージョン・レコードにおける位置のロケーションであってもよい。現在のシーケンス番号は、サーバー・システムによりレビューされる行バージョン・レコードのうちの現在の位置であってもよい。オペレーション40において、サーバー・システムは、行ロック・レコード及び行バージョン・レコードから、(例えば、ストレージ140の行レコード・バージョン160等における、行ロック・レコード又は行バージョン・レコードを識別する情報などの)行識別子が存在するか否かを判断することができ、ここで、トランザクション番号はトランザクション識別子と同一であり、シーケンス番号はサーバー・システムによりレビューされる現在のシーケンス番号と同一である。トランザクション番号はトランザクション識別子と同一であり、シーケンス番号はサーバー・システムによりレビューされる行における現在のシーケンス番号と同一であると判断される場合、オペレーション42において、現在の行バージョン・レコードをコミット済みとしてマークするために、トランザクション・カウンタ番号が現在の行バージョン・レコード(例えば、図5に示されるトランザクション番号マネージャ130によりレビューされる現在の行)にスタンプされ得る。
開示される対象事項の幾つかの実装において、行識別子がトランザクション識別子に等しくない場合、又は行識別子がトランザクション識別子に等しく且つ行識別番号が現在のシーケンス番号以上である場合、(例えば、図3に示される方法30のオペレーション44,46,及び/又は48に従って)サーバー・システム100は、ストレージ140のレコード(例えば、レコード・バージョン160等)のうちの次の行バージョンに移動することができる。
オペレーション44は、前のシーケンス番号が存在するか否かを判断することができる。前のシーケンス番号が存在する場合、オペレーション46は、前のシーケンス番号を、現在のシーケンス番号であると設定することができる。前のシーケンス番号が存在しない場合、方法30は、オペレーション48によりストップさせられる。
幾つかの実装において、トランザクション番号がトランザクション識別子と同一であり、シーケンス番号が、行ロック・レコードのうちの1つに対する現在のシーケンス番号と同一である場合、その行ロック・レコードのうちの1つはストレージ・デバイス(例えば、図5に示されるストレージ140)から除外されてもよい。即ち、(例えば、図5に示されるトランザクション番号マネージャ130により)トランザクション・カウンタ番号が現在の行バージョン・レコードにスタンプされ、現在の行バージョン・レコードがコミット済みとしてマークされ得る場合(即ち、オペレーション42において)、行ロックは除外及び/又は解放され得る。
開示される対象事項の幾つかの実装において、方法30は、現在のキー・ハッシュを前のキー・ハッシュに設定し、現在のシーケンス番号を前のシーケンス番号に設定し、キー・バケットをアンラッチすることを含んでもよく、ここで、ラッチはストレージ140におけるレコード・チェーンへのアクセスを制御する。幾つかの実装において、方法30は、ダイレクト・ルックアップ・キー(a direct look-up a key)を実行することができ、次いで現在のシーケンス番号を前のシーケンス番号に設定し、キー・バケットをアンラッチすることができる。前のシーケンス番号が末端値に到達した場合、レコード・チェーンのレビューは(例えば、トランザクション番号マネージャ130及び/又はストレージ・マネージャ135により)停止させられる。前のシーケンス番号が末端値でない場合、レコード・チェーンのうちの新たな行バージョン・レコードが(例えば、トランザクション番号マネージャ130により)レビューされ得る。
開示される対象事項の方法30はまた、トランザクション識別子をハッシュし、トランザクション識別子をハッシュすることからの如何なるハッシュ衝突も解決することを含み得る。幾つかの実装では、トランザクション識別子をハッシュするのではなく、サーバー・システム(例えば、図5に示されるサーバー・システム)は、トランザクション識別子のダイレクト・ルックアップを実行してもよい。
図4A-4Bは開示される対象事項の実装に従ってレコードにおけるトランザクションをルックアップする方法例を示す。図4Aは、行がコミットされているか否かを判断するためにレコードの中の行をサーチする方法例50を示す。行がコミットされていない場合、トランザクション・ヘッダが検査されることが可能であり、それをコミットされるものとしてマークするために、現在の行バージョン・レコードにトランザクション・カウンタ番号がスタンプされることが可能である。即ち、方法50は、レコードに対してコミットされていない行におけるルックアップ・オペレーションを実行することに関連する。典型的なデータベース・システムは、コミットされていない行におけるルックアップ・オペレーションを提供せず、コミットされた行におけるルックアップ・オペレーションに限定されている。
方法50のオペレーション52において、キーは(例えば、図5に示されるサーバー・システム100等の)サーバー・システムによりハッシュされ得る。オペレーション54において、キー・ハッシュ・バケットはキーのためにラッチされ、ハッシュからの任意の衝突は解決され得る。オペレーション56において、レコードのうちのキーの行バージョン・チェーンは、(例えば、トランザクション番号マネージャ130及び/又はストレージ・マネージャ130により)サーチされ、スナップショット・トランザクション・カウンタ番号と、キーの自己識別番号と、ストレージ140に保存され得るコマンド識別ステートメントとに基づいて、最も新しいビジブルな行バージョン・レコードを決定することができる。スナップショット・トランザクション・カウンタ番号は、特定の時点でレコードのスナップショットに関連するトランザクション・カウンタ番号であってもよい。即ち、スナップショットは特定の時点におけるレコードのステータス及び/又はデータを決めることができる。キーの自己識別番号は、特定のキーを識別するために使用される番号であってもよい。コマンド識別ステートメントは、サーバー・システムにより実行されるサブトランザクション・プロセスを指定するために使用され得る。コマンド識別ステートメントの値に応じて、トランザクションはビジブル及び/又は認識可能(即ち、クエリにとってビジブル及び/又は認識可能)であり得る。
図4Bは、図5に示されるストレージ140内のレコードのうちのキーの行バージョン・チェーンを検索し、オペレーション56における最新のビジブルなレコードを決定することに含まれ得るオペレーション例を示す。即ち、図4Bに示される方法は、最新の認識可能及び/又はビジブルな行においてルックアップ・オペレーションを実行することに仕向けられている。オペレーション58において、例えば、行の中のデータの情報を識別するトランザクション・ヘッダに基づいて、行がアンコミットされているか否か、及び/又は行がロックされているか否かが判断される。オペレーション58において、行がアンコミットされ、そのためロックが存在しないと判断された場合(例えば、アンコミットされたトランザクション)、トランザクション・カウンタ番号値は、オペレーション60において、情報を識別するトランザクション・ヘッダから読み出されてもよい。オペレーション62において、トランザクション・カウンタ番号が有効である場合、トランザクション・カウンタ番号が、(例えば、トランザクション番号マネージャ130によって)現在の行バージョン・レコードにスタンプされてもよく、現在の行バージョン・レコードは、コミットされたものとしてマークされ得る。トランザクション・カウンタは、トランザクション・カウンタ番号と同じ行トランザクション・カウンタを有することによって有効であり得る。図5に示されるように、コミットされたトランザクションは、ストレージ140のレコード・バージョン160に保存されてもよい。オペレーション58が、行バージョンはコミットされている、又はオペレーション62が完了していると判断すると、オペレーション64は、行バージョンがMVCCスナップショットにとってビジブルであるか否か(例えば、行バージョンがMVCCスナップショットの一部として使用されるか否か)を決定することができる。オペレーション64が、行バージョンはMVCCスナップショットにとってビジブルであると判断した場合、オペレーション70は、サーチを停止してもよい。オペレーション64が、行バージョンはMVCCスナップショットにとってビジブルでないと判断した場合、オペレーション68は、もし存在するならば次の行バージョンへ進み、オペレーション58を実行する、又は次の行バージョンが存在しないならばサーチを停止することができる。
図4A-4Bに示される方法50では、キーをサーチする際に、レコードのチェーンは横断され得る(即ち、本方法は、レコードのチェーンを「歩く(walk)」ことができる)。図4A-4Bに示される方法は、コミットされた行及びコミットされていない行の両方で実行されるルックアップ・オペレーションを提供することができる。サーチされているキーがレコードのチェーン内のある地点で発見されると、方法50は、その行がアンコミットされているか否かを判断し、もしそうであるならば、ヘッダ情報を読み出し、現在の行バージョン・レコードにトランザクション・カウンタ番号をスタンプして、それをコミット済みにするようにしてもよい。サーチされるキーがレコードのチェーン内のある地点で発見され、その行がコミットされると、サーチは停止させられてよい。レコードのチェーンが全体的に横断され、キーが発見されない場合(即ち、本方法がレコードのチェーンの全長を「歩いている」場合)もまた、方法60は停止させられてもよい。
図5は、開示される対象事項の実装に従うトランザクション番号の割り当てに適したシステム例の機能ブロック図を示す。例えば、サーバー・システム100は、Apache Hadoopに関連して動作するPostgres、Mysql(登録商標)又はオラクル・データベース12c等の適切なデータベース管理システムの一部であってもよい。サーバー・システム100は、トランザクション・カウンタ110、クロック120、ロック・マネージャ125、トランザクション番号マネージャ130、ストレージ・マネージャ135、ログ・マネージャ138、及びストレージ140を含むことができる。サーバー・システム100は、カウンタ110、クロック120、ロック・マネージャ125、トランザクション番号マネージャ130、記憶マネージャ135、ログ・マネージャ138、及びストレージ140を実装するための、例えば図10に記載されるようなコンピュータ600、又はそのコンポーネントのような任意の適切なコンピューティング・デバイスであってもよい。サーバー・システム100は、単一のコンピューティング・デバイスであってもよく、又は複数の接続されたコンピューティング・デバイスを含んでもよく、例えば、ラップトップ、デスクトップ、個々のサーバー、サーバー・クラスタ、サーバー・ファーム、又は分散型サーバー・システムであってもよく、又は仮想コンピューティング・デバイス又はシステム、又は物理的及び仮想的なシステムの任意の適切な組み合わせであってもよい。簡明化のために、プロセッサ、短期及び長期ストレージ、オペレーティング・システム、データベース管理システムの大部分などの一般的なコンポーネントは示されていない。サーバー・システム100は、コンピューティング・システム及びネットワーク・インフラストラクチャの一部であってもよく、又は他の方法では、サーバー・システム100に類似する他のサーバー・システムを含み得るより大きなサーバー・ネットワークを含むコンピューティング・システム及びネットワーク・インフラストラクチャに接続されてもよい。
サーバー・システム100のトランザクション・カウンタ110は、トランザクション・カウンタ番号の値を記憶及び更新するためのサーバー・システム100上のハードウェア及びソフトウェアの任意の適切な組み合わせであり得る。クロック120は、所望の精度の時間値で、現在の時間又はある時点から経過した時間のような、時間を追跡するためのサーバー・システム100上のハードウェア及びソフトウェアの任意の適切な組み合わせとすることができる。ロック・マネージャ125は、トランザクション番号ハッシュ・バケット及び/又はコミットされていないトランザクション145及び/又はレコード・バージョン160のキー・ハッシュ・バケットのロック及び/又はアンロックを管理するために、サーバー・システム100におけるハードウェア及びソフトウェアの適切な組み合わせであるとすることができる。トランザクション番号マネージャ130は、トランザクションがサーバー・システム100でコミットされた場合に、又はトランザクションがコミットされた順序でトランザクションにトランザクション番号を割り当て、カウンタ110及びカウンタ番号の値を管理するために、サーバー・システム100におけるハードウェア及びソフトウェアの任意の適切な組み合わせであるとすることができる。ストレージ・マネージャ135は、サーバー・システム100のストレージからレコードを検索するためのハードウェアとソフトウェアの任意の適切な組み合わせであってもよく、例えば、ストレージ140を含んでもよいデータベース管理システムに一般的に見られるようなものであってもよい。ストレージ・マネージャ135は、キーと時間値又はキーとトランザクション番号を含み得るリクエストに応答して、レコードのバージョンを検索することができる。ログ・マネージャ138は、ロック・マネージャ125、トランザクション・ナンバー・マネージャ130、及び/又はストレージ140の状態を記録するために、サーバー・システム100におけるハードウェア及びソフトウェアの適切な組み合わせとすることができる。ログ・マネージャ138は、例えば、トランザクションのレコード・チェーン内の1つ以上のレコードの挿入を記録することができる。トランザクション番号、プライマリ・キー値、及び/又は行の値が、レコードの一部としてログに記録され得る。ストレージ140は、コミットされていないトランザクション145及びレコード・バージョン160を保存するためのサーバー・システム100における任意の適切なストレージであってもよい。レコード・バージョン160は、サーバー・システム100の1つ以上のユーザー又はテナントのためのデータベース用のレコードのバージョンであってもよい。
サーバー・システム100、及びテナントのためのデータベースは、所与のレコードの不変バージョン(immutable versions)としてトランザクションを記憶することができる。サーバー・システムにすでに保存されているレコードの不変バージョンは、それらが(あったとしても)サーバー・システムから削除されるまで、変更されないであろう。即ち、受信したトランザクションは、レコードの既存のバージョンに保存されているデータを変更する代わりに、サーバー・システムに格納されることになるレコードの新しいバージョンを作成することができる。従って、ここで開示されるようなレコードの複数のバージョンに対して、同一のキーを有することが可能である。所与のレコードのバージョンに対して同一のキーを使用することは、リレーショナル・データベースに保存されるデータの変更を許容し得る。このようなレコードの各バージョンは不変であってもよい;即ち、レコードは決して削除されない、あるいは、数カ月、数年、数十年であってもよい任意の長期間にわたって削除されない。たとえば、レコードの先行バージョンと同じキーを有するレコードの後バージョンは、そのレコードのデータ値の変化を示し得る。代替的に、トランザクションはレコードを作成したり又はレコードを削除したりしてもよいが、レコードの削除は、トランザクションを排除しなくてもよい。
トランザクション・カウンタ110は、カウンタ番号の値を格納及び更新するためのハードウェア及びソフトウェアの任意の適切な組み合わせであってもよい。トランザクション・カウンタ110は、例えば、ハードウェア又はソフトウェア・レジスタ、又はサーバー・システム100における他の形態のメモリであってもよく、任意の適切なサイズのカウンタ番号を保存してもよい。トランザクション・カウンタ110は、コンピュータ・システム100によってコミットされるトランザクションに対する重複トランザクション番号を防止することができ、厳密に増加又は減少するトランザクション番号を提供することができる。例えば、カウンタ番号は64ビット番号として記憶されてもよい。トランザクションがコミットされた場合にトランザクションに割り当てられるトランザクション番号は、トランザクション・カウンタ110等のカウンタに基づいてもよい。あるいは、トランザクション番号は、2つの別個のフィールドを含んでもよい。第1のフィールドは、タイム・スタンプを表すことができ、カウンタは、最後のタイム・スタンプ以降のトランザクション数を表し得る第2のフィールドを提供する。タイム・スタンプとタイム・スタンプ以降のトランザクション数を示すトランザクション・カウントとの双方を伴うトランザクション数は厳密に増加するであろう。そのような実装では、コミットされるトランザクションは、トランザクションに関連付けられる又は割り当てられる固有のトランザクション番号を有するであろう。
トランザクション・カウンタ110は、カウンタ番号の値を更新することが可能であってもよい。トランザクションをコミットする際に、トランザクション番号が割り当てられた後、カウンタ番号の値は、任意の適切な量だけインクリメントされてもよい。例えば、カウンタ番号の値は、同期イベントが発生していない限り、1又は1より大きな整数だけ増加されてもよい。2つのトランザクション番号が同一でなく、それらが厳密に増加又は減少している限り、連続的に割り当てられるトランザクション番号の間に、いかなる大きさのギャップがあってもよい。サーバー・システムでコミットされる各トランザクションは、カウンタ番号の現在の値に基づいてトランザクション番号を割り当てられ、次いでインクリメントされてもよく、そのため、次のトランザクションは、コミットされる前に、インクリメントされた番号を割り当てられ得る。
例えば、カウンタ番号の値は、トランザクションがコミットされる場合又はトランザクションがコミットされる直前に、トランザクション番号を、コミットされていないトランザクション145のうちの1つ、例えばトランザクション146に割り当てるために使用され得る。トランザクション・カウンタ110からのカウンタ番号の値がトランザクション番号を割り当てるために使用された後、トランザクション・カウンタ110は、例えばカウンタ番号を任意の適切な量だけ厳密にインクリメント(又は厳密にデクリメント)して、カウンタ番号の値を更新することができてもよい。また、トランザクション・カウンタ110は、例えば、トランザクション番号マネージャ130又はクロック120から受信されるカウンタ番号の新しい値に基づいて、カウンタの値を更新することが可能であってもよい。例えば、トランザクション・カウンタ110は、何らかのトランザクションがサーバー・システム100でコミットされる前に、初期同期の間のクロックの時間値に基づいてカウンタ番号の初期値を設定することができる。
クロック120は、任意の適切な精度の時間値で、現在の時間又はある時点から経過した時間などのような時間を追跡するためのハードウェア及びソフトウェアの任意の適切な組み合わせであり得る。例えば、クロックは、ソフトウェア・システム・クロック、ハードウェア・クロック、又は既知の周波数で発振する信号に基づいて更新するカウンタであってもよい。例えば、クロックは、64ビットマイクロ秒カウンタであってもよく、これは、クロックが約584,550年にわたって固有の値を提供することを意味する。クロックによって保存される時間値は、任意の適切な方法で現在の時間を表すことができる。例えば、時間値は、あらかじめ指定されたある時点から経過した時間の量をマイクロ秒で示してもよく、また、そのあらかじめ指定された時点に基づいて現在の時間に変換することが可能であってもよい。クロック120は、任意の適切な時間又はインターバルで、任意の適切な外部クロックと同期してもよく、又は外部同期なしに、内的に時間を保持するだけでああってもよい。
ロック・マネージャ125は、トランザクションのロック及び/又はアンロック、トランザクション番号ハッシュ・バケット、及び/又はコミットされていないトランザクション145及び/又はレコード・バージョン160のキー・ハッシュ・バケットを管理するためのサーバー・システム100におけるハードウェア及びソフトウェアの適切な組み合わせであり得る。ロック・マネージャは、コミットされていないトランザクション145(例えば、トランザクション146、147、148、及び/又は149)、及び/又はキー151、152、153、及び/又は154のうちの1つ以上をロック及び/又はアンロックすることができる。幾つかの実装において、ロック・マネージャ125は、レコード・バージョン160(例えば、レコード・バージョン161、162、163、164、165、166、167、及び/又は168)のロック及び/又はアンロックを制御することができる。
トランザクション番号マネージャ130は、ハードウェアの任意の適切な組み合わせであってもよく、トランザクションがサーバー・システム100においてコミットされたときにトランザクションにトランザクション番号を割り当て、そしてトランザクション・カウンタ110及びカウンタ番号の値を管理する。トランザクション番号マネージャ130は、トランザクションがコミットされることとなる際に、トランザクション番号を、トランザクション146、147、148、又は149の内のいずれか等のコミットされていないトランザクション145に割り当てることができる。コミットされるアンコミット・トランザクション145のうちの1つに割り当てられるトランザクション番号は、トランザクション・カウンタ110により保存されるカウンタ番号の値に基づいてもよい。例えば、トランザクション番号は、カウンタ番号の現在の値であってもよい。カウンタ番号の値に基づいてトランザクション番号が割り当てられた後、カウンタ番号の値は更新され得る。トランザクション・カウンタ110は、それ自体でカウンタ番号の値を更新することが可能であってもよく、あるいはトランザクション番号マネージャ130は、トランザクション・カウンタ110に、カウンタ番号の値を更新させることが可能であってもよい。また、トランザクション番号マネージャ130は、トランザクション・カウンタ110に、任意の適切なイベントに基づいてカウンタ番号の値を更新させてもよい。
ストレージ・マネージャ135は、サーバー・システム100から、例えばストレージ140から、レコードを検索するためのハードウェア及びソフトウェアの任意の適切な組み合わせであるとすることができる。ストレージ・マネージャ135は、キー及び時間値を含み得るリクエストに応答してレコードを検索することが可能であってもよい。例えば、ストレージ・マネージャ135は、例えばサーバー・システム100の所与のテナントに関連付けられるユーザーから、レコードを検索するためのリクエストを受信することができる。リクエストは、キーと時間値とを含み得る。ストレージ・マネージャ135は、例えば、トランザクション番号が、ここで開示されるような時間値又は近似的な時間値である又はそれらを含む場合に、リクエストに応答する、レコード・バージョン160からのレコードの適切なバージョンを検索することが可能であってもよい。ストレージ・マネージャ135は、ストレージ140内のレコード・バージョン160のうちの何れが、受信したリクエストからのキーに合致するキーと、リクエストの時間の値以下、又は同時もしくはそれよりも早い時点のトランザクション番号とを含むかを決定することが可能であってもよい。幾つかの実装において、レコード・バージョン160は不変レコードであってもよい。ストレージ・マネージャ135は、レコード・バージョン160のうちの何れが、同一のキーを有するレコードのグループの中で、リクエストの時間値によって指定される時間において現在のレコードとなるか、あるいはリクエストに応答し得るかを決定することが可能であってもよい。例えば、同一のキーを持つレコードのバージョンのグループからのレコード又はトランザクションの応答バージョンは、リクエストの時間値より大きくない最高のトランザクション番号を持つグループからのレコードのバージョンであってもよい。ストレージ・マネージャ135は、レコード・バージョン160からのレコードの応答バージョンを、リクエストを提出した当事者、例えばテナントに送ることが可能であってもよい。
例えば、ストレージ・マネージャ135は、例えばサーバー・システム100の所与のテナントに関連付けられたユーザーから、レコードを検索するためのリクエストを受信することができる。リクエストは、コミットされていないトランザクション(例えば、トランザクション146、147、148、及び/又は149等の1つ以上のコミットされていないトランザクション145)に対するものであってもよい。幾つかの実装形態では、ストレージ・マネージャ135は、トランザクション番号マネージャ130と通信し、リクエストが受信される場合に、新しいMVCCスナップショットとして新しいトランザクション・カウンタ番号(例えば、コミットされていないトランザクションに対するもの)を使用することができる。これは、図1及び図2に関連して、ならびに以下に説明する動作例に関連して、説明されている。
ログ・マネージャ138は、トランザクションのレコード・チェーン内の1つ以上のレコードの挿入のログを記録するために、サーバー・システム100におけるハードウェア及びソフトウェアの適切な組み合わせであり得る。トランザクション番号、プライマリ・キー値、及び/又は行の値は、レコードの一部としてログに記録され得る。即ち、ストレージ140内のレコードの状態は、トランザクション及び/又はトランザクションの処理の一部として変化することができ、ログ・マネージャは、レコードの挿入を含むレコードへの変更のログを記録することができる。動作例に関連して以下に説明するように、ログ・マネージャ138は、トランザクションをコミットするためにコミット・レコードをログに記録してもよく、及び/又は中止されたトランザクションに対するアボート・トランザクションをログに記録してもよい。
ストレージ140は、コミットされていないトランザクション145及びレコード・バージョン160をサーバー・システム100で記憶するためのハードウェア及びソフトウェアの任意の適切な組み合わせであり得る。ストレージ140は、例えば、ハード・ディスク・ドライブ、ソリッド・ステート・ドライブ、光メディア、フラッシュ・メモリ、テープ・ドライブ、レジスタ、及びランダム・アクセス・メモリを含む任意の適切な揮発性及び不揮発性の物理ストレージ媒体の任意の適切な組み合わせを使用することができる。コミットされていないトランザクション145及びレコード・バージョン160等のデータは、任意の適切なファイル・システム又はストレージ・スキーム又は階層を使用して、任意の適切なフォーマットで記憶され得る。例えば、ストレージ140は、複数のレベルを有するログ構造化マージ(LSM)ツリーを使用してデータを記憶することができる。さらに、システム100が複数テナント・システムである場合、ストレージは、テナントのためのデータベースの各インスタンスについて、別個のログ構造マージ・ツリーに組織化されてもよい。あるいは、特定のサーバー又はシステムにおける全てのレコードは、単一のログ構造化マージ・ツリー内に格納されてもよく、その場合、レコードのバージョンに関連する固有のテナント識別子は、ここで開示されるように、各テナントのデータを区別するために使用されてもよい。より最近のトランザクションは、ツリーの最高又は最上位レベルに格納され、古いトランザクションはツリーの下位レベルに格納されてもよい。あるいは、各レコードの最新のトランザクション又はバージョンは、ツリーの最高レベルに、以前のバージョン又は以前のトランザクションは、ツリーの下位レベルに格納されてもよい。
コミットされていないトランザクション145は、例えばコミットされていないテナント等のサーバー・システム100のユーザーから受信されるトランザクションであってもよい。コミットされていないトランザクション145のトランザクション146、147、148、149の各々は、トランザクション番号マネージャ130によって割り当てられるようなトランザクション番号を含み得るヘッダを含むことができる。あるいは、トランザクションのヘッダ情報(例えば、値155、156、157、及び/又は158)は、値(例えば、値155、156、157、及び/又は158)の一部として含まれてもよい。
コミットされていないトランザクション145のトランザクション146、147、148、及び149の各々は、キー151、152、153、及び154と、値155、156、157、及び158とを含むことができる。キー151、152、153、及び154は、トランザクション146、147、148、及び149に対するそれぞれのレコードと、トランザクション146、147、148、及び149のコミットに基づいて格納されるレコードのバージョンとに対する識別子であり得る。キー151、152、153、及び154は、例えば英数字シーケンス等の任意の適切な形態であってもよい。キー151、152、153、及び154の一部は、例えば、トランザクションをサブミットしたテナントを一意に識別し得るテナント識別子、テーブル番号及び行の識別子、例えば、レコード値が行の内容である場合、テーブル番号、テーブルのインデックス番号、そして値が行の識別子である場合、インデックスされる列の識別子であってもよい。値155、156、157、及び158は、例えば、それぞれのトランザクション146、147、148、及び149に対する、リレーショナル・データベースのテーブルの行の内容、リレーショナル・データベースのテーブルの行の識別子、又は他の任意の適切な値であり得る。
コミットされていないトランザクション145は、まだコミットされておらず且つレコード・バージョン160のレコードのバージョンとして保存されていないトランザクションであり得る。コミットされていないトランザクション145のうちの1つであるトランザクションは、トランザクションがまだレコードのバージョンとして保存されていないかもしれないので、トランザクションをサブミットしたテナントのためのライブ又はプロダクション・データベースでは見えないにかもしれない。
レコード・バージョン160は、コミットされていないトランザクション145からトランザクションをコミットした結果生じるレコードのバージョンであってもよい。コミットされていないトランザクションがコミットされると、トランザクションは、トランザクション番号を割り当てられる又はそれに関連付けられることができ、レコードのバージョンが、キー及びトランザクションからの値とともに、レコード・バージョン160に保存され得る。例えば、トランザクション146がコミットされた場合、キー151及び値155を伴うレコードのバージョンが、レコード・バージョン160に保存されてもよく、コミット中にトランザクション146に割り当てられたトランザクション番号に関連付けられてもよい。レコード・バージョン161、162、163、164、165、166、167、及び168の各々は、個々のキー171、172、173、174、175、176、177、及び178と、値181、182、183、184、185、186、187、及び188とを含むことができ、各自のキー及び値に基づくことができる各自のトランザクション番号191、192、193、194、195、196、197、及び198に関連付けられ、トランザクション番号は、コミットされる際にレコード・バージョン161、162、163、164、165、166、167、及び168として保存されたトランザクションに割り当てられる。トランザクション番号は、特定のトランザクションがコミットされる場合に、各々のトランザクションとともに、厳密に増加(又は厳密に減少)し得る。
幾つかの実装において、トランザクション161等のトランザクションは、複数のレコードの値への変更を示す複数のキー又はキー範囲を含んでもよく、そしてトランザクションに含まれる各キーの値を含んでもよい。例えば、単一のトランザクションは、テナントのデータベースにおけるテーブル内のある行数に関するキーと、各行数に対する値とを含み得る。1つより多いキーを含むコミットされていないトランザクションをコミットすることは、トランザクションに含まれる各キーについて保存されるレコードのバージョンをもたらす結果となり得る。トランザクションは、1つのトランザクション番号を割り当てられてもよく、そしてトランザクションがコミットされる場合に保存されるレコードの各バージョンは、同じトランザクション番号を受けることができる。1つのトランザクションは重複するキーを含み得ず、同じレコードの2つのバージョンが同じトランザクション番号を有することを防止する。トランザクション・カウンタ110及び/又はトランザクション番号マネージャ130は、トランザクションをサブミットしたテナントについて固有のテナント識別子を使用して、トランザクションに基づいて保存されたレコードの各バージョンに対するキーを生成することができる。
システム100が、例えば、マルチテナント・データベースである場合、レコード・バージョン160は、サーバー・システム100の任意数の様々なテナントに帰属することができる。例えば、レコード・バージョン161、162、164、及び168は、第1テナントの第1インスタンスに属するレコードのバージョンであってもよい一方、レコード・バージョン163、165、166、及び167は、第2テナントのインスタンスに属するレコードのバージョンであってもよい。レコードへのアクセス、及びレコードのバージョンとして記憶されるトランザクションは、レコード・バージョン160のキーによって制御され得る。例えば、キー171、172、174、及び178の各々は、第1テナントのための固有のテナント識別子を含んでもよく、テナントに関連する第1テナント又はユーザーとってアクセス可能であるだけであってもよく、そのレコードへのアクセス又は検索のリクエストは、典型的には、固有のテナント識別子を含む又は参照するキーを含むことになるであろう。これは、第1テナントに対して固有のテナント識別子を有するキーを含むレコードを求めるリクエストを、第2テナントは提出し得ないので、第2テナントが、レコード・バージョン161、162、164、及び168にアクセスすることを防止することができる。しかしながら、たとえ複数のトランザクションが異なるテナントに対するものであり、トランザクションの順序が、異なるテナントのトランザクションの間で切り替わりを維持していたとしても、トランザクション番号は、コミットされたトランザクションが異なるテナントに対するものであり得たとしても、厳密に増加(又は厳密に減少)し得る。
サーバー・システム100のストレージ140内のテナントに属するレコード・バージョン160は、そのテナントのためのデータベースのデータであってもよい。例えば、レコード・バージョン161、162、164、及び168は、第1テナントのためのライブ又はプロダクション・データベースのインスタンスのレコードのバージョンであってもよい。レコード・バージョン161、162、164及び168の最新バージョンと、レコードのバージョンとして保存された何らかの最新でない取って代わったトランザクションとは、取って代わったトランザクションが現在のトランザクションである場合に前の時間で見えたように、第1テナントが、それらのデータベースの全部又は一部を見ることを許容し得る。同様に、レコード・バージョン163、165、166、及び167は、第2テナントのためのデータベースのレコードのバージョンであってもよい。ストレージ140は、任意数のテナントのためのデータベースのレコードのバージョンを含んでもよいが、レコード・バージョン自体は、サーバー・システム100のストレージ140によって使用されるファイル・システム、ストレージ・スキーム、又は階層におけるテナントによる分離を伴わずに一緒に保存されてもよい。幾つかの実装において、サーバー・システム100のストレージ140内のテナントに属するレコード・バージョン160は、サーバー・システム100が一部であるより大きなサーバー・ネットワークにおけるテナントのためのライブ又はプロダクション・データベースのための全てのレコード・バージョンを含むことができる。
サーバー・システム100は、より大きなサーバー・ネットワークの一部であってもよく、これは、例えば他のポッド又はデータ・センター等の他の物理的なロケーションにある他のサーバー・システム又はサーバー・システムのクラスタを含んでもよい。より大きなサーバー・ネットワーク内で、特定の目的に関して単一のテナントに属するレコードは、そのテナントのためのライブ又はプロダクション・データベースを本質的に形成し、ネットワーク内のノードにおける単一のサーバー・システムに存在することができる。より大きなサーバー・ネットワーク内の他の任意のサーバー・システムに保存される、テナントのライブ又はプロダクション・データベースの一部又は全部のコピーを含むテナントに属するレコードのトランザクションは、テナントのライブ又はプロダクション・データベースの一部ではなく、そして遠く離れたロケーションでのより速い読み込みアクセスの目的で、サンドボックス化、テスト、トレーニング、分析、バックアップ及び冗長アクセス、又はローカル・キャッシュのために使用されるだけであってもよく、そしてテナントのライブ又はプロダクション・データベースとは考えられなくてもよい。より大きなサーバー・ネットワーク内の各サーバー・システム又はサーバー・クラスタは、トランザクション番号の識別子を割り当てるために、それ自身のカウンタ及び現在のカウンタ番号を有してもよい。あるいは、カウンタ及びカウントは、サーバー又はサーバー・クラスタのストレージ・エリア・ネットワーク又はSANに維持されることが可能である。
例えばサーバー・システム100等のサーバー・システムにおける、例えばトランザクション・カウンタ110等の同じカウンタ、及びカウンタ番号は、サーバー・システムにおいてライブ・インスタンスを有する全てのテナントに対してコミットされるトランザクションにトランザクション番号を割り当てるために使用され得る。これにより、サーバー・システムによってコミットされるレコードの全てのバージョンに関連するトランザクション番号が一意であり、そしてサーバー・システムにおけるレコードの全てのバージョン及びサーバー・システムにおける各テナントに属するレコードの全てのバージョンの双方について、トランザクションがコミットされた順に厳密に増加又は減少する順序を構成することが保証され得る。
図6は、開示される対象事項の実装によるコミットされていないトランザクションのためのトランザクション番号割り当てに適した構成例を示す。この例では、トランザクション146は、例えばサーバー・システム100のテナントから、サーバー・システム100によって受信され、ストレージ140内のコミットされていないトランザクション145の1つとして保存されている。例示的なトランザクション146は、キー151及び値155を含む。トランザクション146は、例えばトランザクション146が処理された時点からの或る期間の経過などの、任意の適切なイベントに基づいて、サーバー・システム100においてコミットされてもよい。引き続きその例において、トランザクション番号マネージャ130は、トランザクション・カウンタ110からカウンタ番号値を受信し、カウンタ番号値に基づいてトランザクション番号210をトランザクション146に割り当てる。トランザクション番号マネージャ130はまた、例えば、カウンタ番号値を増分させることによって、トランザクション・カウンタ110が、カウンタ番号値を更新することを引き起こしてもよい。次に、レコード・バージョン246が、トランザクション146に基づいて保存される。レコード・バージョン246は、ストレージ140内のレコード・バージョン160とともに保存されてもよく、本願で先に開示されたように、トランザクション146からのキー151及び値155を含んでもよく、トランザクション146に署名されたトランザクション番号210に関連づけられてもよい。レコード・バージョン246がコミットされると、コミットされていないトランザクション146は、コミットされていないトランザクション145から除外又は削除され得る。
トランザクション146がサーバー・システム100でコミットされる前に、コミットされていないトランザクション146のヘッダ(例えば、値155)は、割り当てられたトランザクション・カウンタ番号で(例えば、トランザクション番号マネージャ130により)更新されてもよい。サーバー・システム100によって受信される新しいクエリは、この割り当てられたトランザクション・カウンタ番号をMVCCスナップショットとして使用することができる。上述したように、トランザクション146は、同時オペレーションにおいてコミットされる(即ち、「スタンプ」)過程におけるものであってもよく、サーバー・システム100は、割り当てられたトランザクション・カウンタ番号をスナップショットとして使用することが可能であってもよい。
図7は、開示される対象事項の実装によるトランザクション番号の割り当てに適した構成例を示す。テナント用のライブ又はプロダクション・データベースは、1つのサーバー・システム、クラスタ、又はデータ・センターから、より大きなサーバー・ネットワーク内の別のものへマイグレーションさせられてもよい。例えば、レコードの現在のバージョン及びコミットされていないトランザクション(例えば、MVCCスナップショットとして使用され得る指定されたトランザクション・カウンタ番号を有し得る)を含む全てのレコード及びトランザクションは、より大きなサーバー・ネットワーク内のテナントのプロダクション・データベースに属するが、1つのサーバー・システムに格納されてもよく、そして、メンテナンス、パフォーマンス、又はサーバー障害を含む種々の理由に起因して、別のサーバー・システムへ移動又はマイグレーションさせられてもよい。ここでさらに詳細に説明されるように、ライブ又はプロダクション・データベースがマイグレーションされる元のサーバー・システムは「送信」サーバー・システムと考えられてもよく、ライブ又プロダクション・データベースがマイグレーションされる先のサーバー・システムは、マイグレーションされるレコードが、マイグレーションされたレコードとなり得る「受信」サーバー・システムと考えられてもよい。
ライブ又はプロダクション・データベースがシステム間で移動させられる場合、各トランザクション、又は実装で移動させられるレコードのバージョンは、キーと共に送信サーバー・システムのカウンタを利用して割り当てられたトランザクション番号に関連付けられることができる。従って、移動させられるレコードの1つ以上のバージョンは、受信サーバー・システムのカウンタのカウンタ番号の値よりも高く、また、受信サーバー・システムにすでに保存されているレコードのバージョンに関連する任意のトランザクション番号よりも高いトランザクション番号を割り当てられてもよい。これは、送信又は受信システムにおいて割り当てられているトランザクションの数、又はトランザクション識別子が時間値を含む場合に、例えば、異なる再同期期間、受信及びコミットされたトランザクションの異なるボリューム、クロック・ドリフト等の多くの理由で生じ得る。
サーバー・システム100は、送信サーバー・システム400によって既にトランザクション番号を割り当てられている可能性があるレコード460のレコード・バージョンを受信することができる。サーバー・システム100は、受信サーバー・システムであってもよく、サーバー・システム400は、レコード・バージョン460のための送信サーバー・システムであってもよい。レコード・バージョン460からのレコード・バージョンは、例えば、サーバー・システム400のテナントのインスタンスに属するレコードに関するサーバー・システム400上のすべてのレコード・バージョンであってもよい。レコード・バージョン460からのレコード・バージョンのマイグレーションの前に、そのテナントに属するレコードのインスタンスに対して、サーバー・システム100上のレコード・バージョン160にはレコード・バージョン160が存在しないかもしれない。
マイグレーションされるレコードのためのレコード・バージョン461、462、463、464、465、466、467、及び468等のレコード・バージョン460の一部又は全部が、サーバー・システム400によって送信され、サーバー・システム100のストレージ140に格納されてもよい。レコード・バージョン461、462、463、464、465、466、467、及び468の各々は、コミットされたトランザクションであってもよく、それ自身のキー、値、及び関連するトランザクション番号を有してもよい。トランザクション461ないし468のトランザクション番号はまた、固有であってもよく、トランザクションがサーバー400でコミットされた順序において厳密に増加又は減少して割り当てられてもよい。
マイグレーションされるレコードに対するトランザクション446、447、448、及び/又は449等のコミットされていないトランザクション445の一部又は全部が、サーバー・システム400によって送信され、サーバー・システム100のストレージ140(図示せず)に格納されてもよい。例えば、マイグレーションされるこのようなコミットされていないトランザクションは、図5に示されるストレージ140のコミットされていないトランザクション145のセクションに保存されてもよい。コミットされていないトランザクション446、447、448、及び449のうちの1つ以上は、コミットされる過程におけるトランザクションであってもよく、それ自身のキー、値、及び関連するトランザクション番号を有してもよい。
さらに、ネットワーク内の全てのノードにおける全てのサーバー・システムのトランザクション番号は、固有のトランザクション番号(例えば、厳密に増加又は減少する番号)を割り当てることができる。更に、割り当てられるトランザクション番号は、全てのサーバーに対して固有で厳密に増加し得る、又は全てのサーバーに対して固有で厳密に減少し得る。幾つかの実装において、トランザクション番号は、1つのトランザクションが1つ以上のレコードの複数のバージョンを生じる場合のように、レコード・バージョン間で一意でないかもしれない。サーバー・システム100に送信される任意のレコード・バージョン461、462、463、464、465、466、467、及び468に関連する最新のトランザクション番号が決定され得る。この最新のトランザクション番号は、レコードの送信前又は送信中に、サーバー・システム400によって決定されてもよく、又はサーバー・システム100によって、例えばトランザクション番号マネージャ130によって、マイグレーションされるレコード及びトランザクションの受信中又は受信後に決定されてもよい。代替的又は追加的に、最新のトランザクション番号は、レコード・バージョン460の一部となるようにコミットされる過程にある可能性がある、又はコミットされていないトランザクション145に保存されるためにストレージ140にマイグレーションされる可能性があるサーバー・システム400のコミットされていないトランザクション445(例えば、トランザクション446、447、448、及び/又は449)に関連付けられてもよい。即ち、コミットされていないトランザクション(例えば、トランザクション446、447、448、及び/又は449)の最新のトランザクション番号は、MVCCスナップショットとして使用されてもよい。
引き続きレコード・バージョン460を用いる上記の例に関し、サーバー・システム100及び400の両方が、厳密に増加する順序で(サーバー・システムに対して)固有のトランザクション番号を割り当てる同一のトランザクション番号スキーマを使用していると仮定すると、トランザクション番号マネージャ130は、レコード・バージョン461、462、463、464、465、466、467、467、及び468のいずれかに関連する最高のトランザクション番号の値と、トランザクション・カウンタ110のカウンタ番号値及び/又はコミットされていないトランザクション445(例えば、トランザクション446、447、448、及び/又は449)に関連する最高のトランザクション番号とを比較することができる。マイグレーションされたレコードに関するレコード・バージョン461、462、463、464、465、466、467、及び468のいずれかに関連する最も高いトランザクション番号が、より高い、又は時間的に先行している場合、即ち、コミットされていないトランザクション445(例えば、トランザクション446、447、448、及び/又は449)に関連する最高のトランザクション番号及び/又はカウンタ番号値である場合、トランザクション番号マネージャ130は、トランザクション・カウンタ110が、マイグレーションされたレコードのいずれかに関連する最も高いトランザクション番号の値よりも高いカウンタ番号値を設定することを引き起こすことができる。そうでない場合、カウンタ番号値は同じ値に留まってもよい。これは、サーバー・システム100のストレージ140に保存されるトランザクションに関連するトランザクション番号の厳密な増加又は減少を保証することができ、なぜなら、サーバー・システム100における次のコミットされるトランザクションは、より高い又は時間的に先行するトランザクション番号-即ち、マイグレーションされたレコード461、462、463、464、465、466、467、及び468を含むレコード・バージョン160の任意のレコード・バージョンに関連する最も高いトランザクション番号-を割り当てられるからである。
代替的に、ランザクション番号マネージャ130は、コミットされていないトランザクション446、447、448、及び449のいずれかに関連する最も高いトランザクション番号の値(例えば、レコード・バージョン460に対してコミットされる過程にあり得るもの)を、トランザクション・カウンタ110のカウンタ番号値と比較することができる。マイグレーションされたレコードに関するコミットされていないトランザクション445のいずれかに関連する最高のトランザクション番号が、より高い、又は時間的に先行している場合、即ち、カウンタ番号値及び/又はレコード・バージョン460のいずれかに関連する最高のトランザクション番号である場合、トランザクション番号マネージャ130は、トランザクション・カウンタ110が、マイグレーションされたレコードのいずれかに関連する最高のトランザクション番号の値よりも高いカウンタ番号値を設定することを引き起こすことができる。そうでない場合、カウンタ番号値は同じ値のまま留まってもよい。これは、サーバー・システム100のストレージ140に保存されるトランザクションに関連するトランザクション番号の厳密な増加又は減少を保証することができ、なぜなら、サーバー・システム100における次のコミットされるトランザクションは、より高い又は時間的に先行するトランザクション番号-即ち、マイグレーションされたレコード461、462、463、464、465、466、467、及び468を含むレコード・バージョン160の任意のレコード・バージョンに関連する最も高いトランザクション番号-を割り当てられるからである。
任意のライブ又はプロダクション・データベースの厳密な増加又は減少を維持するための代替方法も可能である。第1のサーバー・クラスタから第2のサーバー・クラスタへプロダクション・データベースをマイグレーションするための時間インターバルは、大多数のサーバー・クラスタ又はポッド間の相対スキューよりもはるかに小さい可能性が高い。従って、ほとんどの場合、単にローカル・サーバの時間を、トランザクション番号の一部として含めることで、受信サーバー・システムとマイグレーションされるデータベースとのクロックのインクリメントの間でカウンタ・カウント・トランザクションによる厳密な増減を保証するのに十分であるはずである。
図8Aは、開示される対象事項の実装によるトランザクション番号割り当てに適した構成例を示す。ストレージ140のレコード・バージョン160内のレコード・バージョンを有するレコードの幾つかに対するリクエストは、リクエスター・システム500からサーバー・システム100によって受信され得る。リクエスター・システム500は、例えば、サーバー・システム100のテナントに関連付けられるユーザーによって使用される任意の適切なコンピューティング・デバイスであってもよい。リクエストは、サーバー・システム100上のテナントのデータベースから、例えばテーブルの一部として、テーブル全体として、又は複数のテーブルとして、テナントが個々に見ることを望むテナントに属するレコードに対するものであり得る。あるいは、ユーザーは、データベース全体のコピーを取得することを望むかもしれない。
リクエスター・システム500からのリクエストは、キー(key)と時間値とを含むことができる。例えば、リクエストは、キー「A7*」を含むことができ、ここで、「A7」は、リクエスター・システム500を使用するテナントの固有のテナント識別子であり、ワイルドカードは、リクエストが、キーの残りの部分によらず、その固有のテナント識別子を含むキーを有する全てのレコードに対するものであることを示すことができるリクエストの時間値は、221800であってもよい。これは、221800の時間値で示される時点で現在(current)であったテナントに属する全てのレコード・バージョンを、レコード・バージョン160から検索することを、テナントが望んでいることを示すことができる。
ストレージ・マネージャ135は、リクエスター・システム500からリクエストを受信し、レコード・バージョン161、162、163、164、165、及び166のうちの何れがリクエストに応じているかを決定することができる。応答レコード・バージョンは、A7*のリクエストのキー値に一致するレコード・バージョンであり、且つ同じレコードの同じキーを有する別のレコード・バージョンと関連する任意の他のトランザクション番号よりも高い一方、依然としてリクエストの時間値以下であるトランザクション番号と関連し得る。レコード・バージョンは、キー値と一致するが、関連するトランザクション番号に起因して応じていないかもしれないし(例えば、トランザクションがリクエストの時間値又はトランザクション番号の後に発生した場合)、あるいは適切なトランザクション番号に関連付けられるが、キー値に一致しないことに起因して応じていないかもしれない。例えば、レコード・バージョン161、163、164及び166は、A7D5、A7D5、A7N4、及びA7D5のそれぞれのキー値に関し、A7*のリクエストのキー値と一致し得る。レコード・バージョン161は、例えば、22456というレコード・バージョン161に関連するトランザクション番号が221800のリクエストの時間値よりも高く、レコード・バージョン161のトランザクションはリクエストの時間値で示された時間の後に保存されたことを示すので、リクエストに対する応答レコードにはならないであろう。別の例として、レコード・バージョン166は、同じレコードのために保存されたトランザクションであり得るので、レコード・バージョン163と同一のキーを有し、レコード・バージョン163は、221506というトランザクション番号に関連し、これは、221800というリクエストの時間値よりも低く、200100というレコード・バージョン166に関連するトランザクション番号よりも高い。これは、レコード・バージョン163が、そのレコードに関してレコード・バージョン166に取って代わった、リクエストの時間値221800によって示される時点におけるレコードの現在のレコード・バージョンであったことを示し得る。従って、レコード・バージョン166は、例示のリクエストに対する応答レコード・バージョンではない。レコード・バージョン163及び164は、リクエスター・システム500からのリクエストに応じることができる。ストレージ・マネージャ135は、応答レコード163及び164をリクエスター・システム500へ送信することができ、例えばテナントのデータベースからテーブルを表示する等のように、それらは任意の適切な方法で使用されることができる。
図8Bは、開示される対象事項の実装によるトランザクション番号の割り当てに適した構成例を示す。ストレージ140内のコミットされていないトランザクション(例えば、トランザクション146、147、148、及び/又は149、又はコミットされていないトランザクション145)であり得る幾つかのレコードに対するリクエストは、リクエスター・システム500からサーバー・システム100によって受信され得る。即ち、コミットされていないトランザクションは、典型的には、リクエスター・システム500にとってビジブルではないかもしれないが、少なくとも部分的に、コミットされていないトランザクションがそれらに割り当てられたトランザクション番号を有し且つコミットされる過程にある場合にはビジブルであり得る。
リクエスター・システム500からのリクエストは、キーと時間値とを含むことができる。例えば、リクエストは、キー「A7*」を含むことができ、ここで、「A7」は、リクエスト・システム500を使用するテナントの固有のテナント識別子であり、ワイルドカードは、リクエストが、キーの残りの部分によらず、その固有のテナント識別子を含むキーを有する全てのレコードに対するものであることを示すことができる。リクエストの時間値は221800であってもよい。これは、221800の時間値で示された時点で現在であったテナントに属する全てのレコード・バージョン(例えば、図8Aに示されるもの)及び/又はコミットされていないトランザクション145(指定されたトランザクション番号を有するが、未だコミットされていないもの)を検索することを、テナントが望んでいることを示し得る。
ストレージ・マネージャ135は、リクエスター・システム500からリクエストを受信し、コミットされていないトランザクション146、147、148、及び/又は149のうちの何れがリクエストに応じているかを決定することができる。応じているコミットされていないトランザクションは、A7*のリクエストのキー値に一致するレコード・バージョンであり、同じレコードのうち、同じキーを有する他のレコード・バージョンと関連する任意の他のトランザクション番号よりも高い一方、依然としてリクエストの時間値以下であるトランザクション番号と関連付けられ得る。トランザクション番号が未だ割り当てられていない未コミットのトランザクション(例えば、トランザクション146及び149)は考慮されなくてよい。コミットされていないトランザクションのうちのトランザクションは、キー値と一致するが、関連するトランザクション番号又は関連するトランザクション番号の欠如に起因して応じてないかもしれないし(例えば、トランザクションがリクエストの時間値又はトランザクション番号の後に発生した場合)、又は適切なトランザクション番号に関連付けられるが、キー値に一致しないことに起因して応じていないかもしれない。例えば、トランザクション146、148、及び149は、A7D5、A7D5、及びA7N4のそれぞれのキー値に関し、A7*のリクエストのキー値と一致し得る。トランザクション146は、例えばトランザクション146に関連するトランザクション番号が存在しないので、リクエストに対する応答レコードではあり得ない。トランザクション148は、リクエスター・システム500からのリクエストに応じ得る。ストレージ・マネージャ135は、トランザクションをリクエスター・システム500へ送信してもよく、これらは例えばテナントのデータベースからテーブルを表示する等のように任意の適切な方法で使用され得る。
現在開示されている対象事項の実装は、種々のコンポーネント及びネットワーク・アーキテクチャにおいて実現され、使用され得る。図9は、現在開示されている対象事項の実装を実現するのに適したコンピュータ例600の例である。ここで更に詳細に説明されるように、コンピュータ600は、複数のコンピュータのネットワーク内の単一のコンピュータであってもよい。図9に示されるように、コンピュータ600は、セントラル・コンポーネント700(例えば、サーバー、クラウド・サーバー、データベース等)と通信することができる。セントラル・コンポーネント700は、別のコンピュータ800等の1つ以上の他のコンピュータと通信することができる。この実装によれば、セントラル・コンポーネント700に対する及び/又はそこから得られる情報は、コンピュータ600がコンピュータ800と情報を共有しないように、各コンピュータに関して分離されていてもよい。代替的又は追加的に、コンピュータ600は別のコンピュータ800と直接的に通信してもよい。
コンピュータ(例えば、ユーザー・コンピュータ、企業コンピュータ等)600は、セントラル・プロセッサ640、メモリ670(典型的にはRAMであるが、ROM、フラッシュRAMなどを含み得る)、入出力コントローラ680、ディスプレイ・アダプタを介したディスプレイ又はタッチスクリーン等のユーザー・ディスプレイ620、キーボード、マウス、WiFi/セルラ無線機、タッチスクリーン、マイクロホン/スピーカ等のような1つ以上のコントローラ及び関連するユーザー入力又はデバイスを含むことができ、I/Oコントローラ680に密接に結合され得るユーザー入力インターフェース660、ハード・ドライブ、フラッシュ・ストレージ、ファイバ・チャネル・ネットワーク、SANデバイス、SCSIデバイス等の固定ストレージ630、光ディスク、フラッシュドライブ等を制御及び受信するように動作するリムーバブル・メディア・コンポーネント650等のコンピュータ600の主要なコンポーネントを相互接続するバス610を含む。
バス610は、先に述べたように、セントラル・プロセッサ640とメモリ670との間のデータ通信を可能にし、メモリは、リード・オンリ・メモリ(ROM)又はフラッシュ・メモリ(いずれも図示せず)と、ランダム・アクセス・メモリ(RAM)(図示せず)とを含んでもよい。RAMは、オペレーティング・システム及びアプリケーション・プログラムがロードされるメイン・メモリを含むことが可能である。ROM又はフラッシュ・メモリは、特に、周辺コンポーネントとの相互作用のような基本的なハードウェア動作を制御する基本入出力システム(BIOS)を含むことが可能である。コンピュータ600に常駐するアプリケーションは、ハード・ディスク・ドライブ(例えば、固定ストレージ630)、光ドライブ、フロッピー・ディスク、又は他の記憶媒体650等のコンピュータ読み取り可能な媒体に記憶され、アクセスされることが可能である。
固定ストレージ630は、コンピュータ600と一体であってもよく、又は別個であって他のインターフェースを介してアクセスされてもよい。ネットワーク・インターフェース690は、電話リンクを介して遠隔サーバーに、インターネット・サービス・プロバイダ(ISP)を介してインターネットに直接接続を提供してもよいし、又はPOP(ポイント・オブ・プレゼンス)又は他の技術によるインターネットへの直接的なネットワーク・リンクを介して遠隔サーバーに対する直接接続を提供してもよい。ネットワーク・インターフェース690は、ディジタル・セルラ電話接続、セルラ・ディジタル・パケット・データ(CDPD)接続、ディジタル衛星データ接続などを含む無線技術を使用してこのような接続を提供することができる。例えば、ネットワーク・インターフェース690は、図10に示されるように、コンピュータが、1つ以上のローカルの、広域の、又は他のネットワークを介して他のコンピュータと通信することを可能にし得る。
他の多くのデバイス又はコンポーネント(図示せず)(例えば、文書スキャナ、ディジタル・カメラなど)は、同様の方法で接続されてもよい。逆に、図10に示される全てのコンポーネントが、本開示を実施するために存在する必要はない。コンポーネントは、図示の方法とは異なる方法で相互接続されることが可能である。図10に示されるようなコンピュータの動作は、当技術分野において容易に理解され、本出願において詳細には説明されない。本開示を実施するためのコードは、メモリ670、固定ストレージ630、リムーバブル・メディア650のうちの1つ以上のようなコンピュータ読み取り可能記憶媒体、又は遠隔ストレージ・ロケーションで保存されることが可能である。
図10は、開示される対象事項の実装によるネットワーク構成例を示す。クラウド1202によって表されるネットワーク内の異なるノードにおける4つの別個のデータベース・システム1200a-dは、ネットワーク・リンク1204を介して互いに及びユーザー(図示せず)と通信する。データベース・システム1200a-dは、各々、データベースの異なるインスタンス・ノードであってもよく、及び/又はテナント・データの1つ以上のインスタンスを含んでもよい。例えば、各データベース・システム1200は、Linux(登録商標)オペレーティング・システム及びHadoopフレームワークを実行するPostgress、Mysql Server又はOracle(登録商標) 12cのようなマルチテナント・データベースの複数のインスタンスをホストするように動作することが可能であり、各インスタンスは、特定のテナントに関連するユーザーに限ってアクセス可能である。各データベース・システムは、ストレージ・エリア・ネットワーク(図示せず)、負荷バランサ及びバックアップ・サーバーにより、ファイアウォール、他のセキュリティ・システム、及び認証システムと共に、コンピュータのクラスタを構成することができる。システム1200のいずれかのインスタンスの幾つかは、ユーザーから受信したトランザクション、又はインスタンス内の記憶のためにデータを取り込んで提供するためのコンピューティング要素(図示せず)から受信したトランザクションを処理及びコミットするライブ又はプロダクション・インスタンスであってもよい。各データベース・システムは、シーケンスがコミットされる順に、コミットされた各トランザクションにトランザクション番号を割り当てるために、図5-9で説明されたようなシステムを使用することができる。
上述した1つ以上の実装を使用して、以下の例は、処理中の(コミットされていない)トランザクションにおけるサーバー・システムの動作を示すことができ、データ構造、ロック・マネージャ125、トランザクション番号マネージャ130、及びストレージ・マネージャ135、及びログ・マネージャ138の例示的な動作が以下に示されて説明される。
具体例では、ステートメント境界とセーブポイントのロールバック・ターゲットとして使用されるトランザクション番号とトランザクション・シーケンス番号ペアとを示すように、値が選択される。具体例において、ストレージ140を使用する実装はトランザクション動作を開始し、ストレージ140は使用され得るサブトランザクションを開始する。幾つかの実装において、これらのオペレーションは使用されない場合があり、トランザクション番号マネージャ130は、トランザクション番号の知識と、ストレージ140によって返されるストレージ140のトランザクション・シーケンス番号がロケーション・オペレーションを取得することに基づいて、トップレベル・トランザクション及びサブトランザクションのためのログ構造化マージ(LSM)トランザクション番号を表す値を作成することができる。
第1具体例では、3つのトランザクション履歴が存在する(即ち、トランザクション1、トランザクション2、及びトランザクション3であり、トランザクションは以下の表1Aに示されるトップレベル・トランザクションであってもよく、xは整数値である)。
表1A
上記の表1Aのライン1に示すように、3つのトップレベル・トランザクション1、2、及び3が作成される。トランザクション番号マネージャ130は、トランザクション番号(例えば、この例では、トランザクション番号101、102及び103のそれぞれ)を割り当ててもよく、トランザクション・コンテキストを作成してもよく、割り当てられたトランザクション番号を有するアクティブなトランザクションが現在存在するレジスタのようなレジスタ140と通信してもよい。トランザクションの開始のトランザクション・シーケンス番号(即ち、シーケンス番号ゼロ)及びLSMトランザクション番号を有する対数構造マージ(LSM)トランザクション番号値が、トランザクション・コンテキストに関連付けられ、及び/又は格納される。トランザクション番号マネージャは、各トランザクションのためのロック・タグ(lock tags)を有するロック・マネージャ125において排他的ロック(即ち、トランザクション101、102、及び103に関するロック)を得ることができる。ログ・レコード(例えば、ログ・マネージャ138によって管理及び/又は生成されるログ・レコード)は、これらの何れのオペレーションのいずれによっても生成されない。
表1Aのライン1に対するロック・マネージャ125の状態は、以下の表1Bに示される。
表1B
テーブル1Aのライン1に対するトランザクション番号マネージャ130の状態(即ち、トランザクション番号マネージャ内のコンテキスト・スタックの状態)は、以下の表1Cに示される:
表1C
表1Aのライン1に対するログ・マネージャ138の状態は、以下の表1Dに示される:
表1D
表1Aのライン1に対するトランザクションの状態は、以下の表1Eに示されている:
表1E
表1Aのライン1に対するストレージ140におけるプライマリ・キーの状態は、下記の表1Fに示される。
表1F
上記の表1Aのライン2に示すように、トランザクション1は、第1コマンド識別ステートメント(cid)(cid=1)を処理するための新しいサブトランザクションを開始することができる。トランザクション番号マネージャ130は、サブトランザクションのための新しいLSMトランザクション番号値を得ることができる。トランザクション1のステータスは、(101,0)であってもよく、なぜなら、トランザクション番号101のためのストレージ140にレコードがまだ追加されていないからである。サブトランザクション・コンテキストは、トランザクション番号101に対してトランザクション番号マネージャ130によって管理されるコンテキスト・スタックにプッシュされてもよい。アップデートを処理するために、テーブル1Aの行にわたってスキャンが実行されてもよく、スナップショット・トランザクション・カウンタ番号は1(one)である。各行が返されると、列xの内容に対して計算が行われてもよく、各々の更新された行のプライマリ・キーに対する挿入レコード・オペレーションを呼び出すことによって、適切な行バージョン・レコードがストレージ140内に作成され得る。各々の挿入されたレコードは、トランザクション番号101のトランザクション・レコード・チェーン毎の内のその位置を表す単調に増加するトランザクション・シーケンス番号を割り当てられ得る。各々の挿入は、ログ・マネージャ138によってログに記録されてもよい。アップデートはプライマリ・キーの値に影響しないかもしれないので、挿入はキー・アップデートが存在しないことを示したロック・モードを有し得る。挿入は、キーに対する任意の既存のコミットされていないデータとコンフリクトしないかもしれないので、暗黙の行ロック・リクエストが許可され得る(例えば、リクエストは直ちに許可され得る)。1(1)であるトランザクション・カウンタ番号を持つスナップショットは、1であるプライマリ・キー値と2であるプライマリ・キー値に対するコミットされた行バージョン・レコードにスタンプされたトランザクション・カウンタ番号以下であるため、そのアップデートはスナップショット・バイオレーションを生成しないであろう。各々の行バージョン・レコードの挿入及び関連する状態の検査は、対応するプライマリ・キーのキー・バケット・ラッチの下で生じ得る。更新オペレーションが完了すると、トランザクション番号マネージャ130は、ステートメントのサブトランザクション・コンテキストを検索することができる。
表1Aのライン2に対するロック・マネージャ125の状態は、以下の表2Aに示される:
表2A
テーブル1Aのライン2に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表2Bに示される:
表2B
表1Aのライン2に対するログ・マネージャ138の状態は、以下の表2Cに示される:
表2C
表1Aのライン2に対するトランザクションの状態は、以下の表2Dに示されている:
表2D
表1Aのライン2に対するプライマリ・キーの状態は、以下の表2Eに示されている:
表2E
上記の表1Aのライン3に示すように、トランザクション1は、サブトランザクションの(101,2)のLSMトランザクション番号を受けるために、サブトランザクションを開始するオペレーションを呼び出すことによって、s1という名前のセーブポイントを定義することができる。トランザクション番号マネージャ130は、新しいサブトランザクション・コンテキストを、トランザクション1のトランザクション番号マネージャ130のコンテキスト・スタックにプッシュすることができる。ストレージ140の状態は変化せず、ログ・マネージャ138によって値はログに記録されなくてもよい。
表1Aのライン3に対するロック・マネージャ125の状態は、以下の表3Aに示される:
表3A
テーブル1Aのライン3に対するトランザクション番号マネージャ130の状態(即ち、コンテキストスタックの状態)は、以下の表3Bに示される:
表3B
表1Aのライン3に対するログ・マネージャ138の状態は、以下の表3Cに示される:
表3C
表1Aのライン3に対するトランザクションの状態は、以下の表3Dに示されている:
表3D
表1Aのライン1に対するプライマリ・キーの状態は、以下の表3Eに示されている:
表3E
ライン4に示すように、トランザクション1は、2番目のコマンド識別ステートメント(cid=2)を処理するための新しいサブトランザクションを開始することができる。トランザクション番号マネージャ130は、サブトランザクションを開始するオペレーションを実行し、サブトランザクションのLSMトランザクション番号(即ち(101,2))を取得する。このサブトランザクション・コンテキストは、トランザクション番号101のトランザクション番号マネージャ130のコンテキスト・スタックにプッシュされてもよい。更新を処理するために、オペレーションが実行され、トランザクション番号101及び1であるスナップショットトランザクション番号のためのテーブルの行にわたってスキャンを開始し、スキャン・キーは1であるプライマリ・キーを有する行を返すことになる。コミットされていない行バージョン・レコードは、リターンされ、101であるトランザクション番号と1であるコマンド識別ステートメント(cid=1)とを有する。トランザクション(即ち、トランザクション1)は、トランザクション1のコマンド識別ステートメント(即ち、cid=1)が現在のコマンド識別ステートメント(即ち、cid=2)より小さいので、ビジブル(即ち、クエリーにとって可視)であり得る。xの新しい値は、101+666=767として計算されてもよく、挿入レコード・オペレーションは、新しい行バージョンをストレージ140に記録するように実行されてもよい。プライマリ・キーは変更されないかもしれず、そのため、キー・アップデートが存在しないロック・モードとともに挿入が生じる。行バージョン・レコードのトランザクション・カウンタ番号が101であるので、プライマリ・キーが1である場合の既存の暗黙の「キー・アップデートなし」モードの行ロックとの競合は存在しない。トランザクションは、それ自身とコンフリクトせず、スナップショット・バイオレーションは存在しない。挿入は、ログ・マネージャ138によってログに記録され得る。更新オペレーションが完了すると、トランザクション番号マネージャ130は、ステートメントのサブトランザクション・コンテキストを検索することができる。
表1Aのライン4に対するロック・マネージャ125の状態は、以下の表4Aに示される:
表4A
テーブル1Aのライン4に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表4Bに示される:
表4B
表1Aのライン4に対するログ・マネージャ138の状態は、以下の表4Cに示されている:
表4C
表1Aのライン4に対するトランザクションの状態は、以下の表4Dに示されている:
表4D
表1Aのライン4に対するプライマリ・キーの状態は、以下の表4Eに示されている:
表4E
上記の表1Aのライン5に示すように、トランザクションは、1であるコマンド識別ステートメント1(cid=1)を有する第1ステートメントを処理するための新しいサブトランザクションを開始することができる。トランザクション番号マネージャ130は、サブトランザクションを開始するためのオペレーションを実行することができ、サブトランザクションのLSMトランザクション番号(即ち(102,0))を取得することができ、このサブトランザクション・コンテキストは、トランザクション番号102のトランザクション番号マネージャ130のコンテキスト・スタックにプッシュされ得る。オペレーションは、トランザクション番号102及びスナップショット・トランザクション・カウンタ番号1のためのテーブルの行にわたってスキャンするために実行されてもよく、スキャン・キーは、1というプライマリ・キーを有する行を返す。行バージョン・レコードが返され、これは1であるトランザクション・カウンタ番号を有するトランザクションのコミットされたバージョンである。これはトランザクション2にとってビジルブルであり得るが、なぜなら、トランザクション・カウンタ番号は1であり、それはトランザクション2のスナップショット・トランザクション・カウンタ番号以下である一方、トランザクション1からのコミットされていない行バージョン・レコードはビジブルではないからである。トランザクション2は、x=2を有する新しいバージョンの行を記録することによって、更新の処理に進むことができる。ロック・モードは、キー・アップデートではないかもしれないが、上述の表1Aの行とは異なり、トランザクション1によって保持されている暗黙のキー・アップデートなしの行ロックとコンフリクトが存在するかもしれない。更新のための行バージョン・レコードは、プライマリ・キーが1である場合にキー・バケット・ラッチを保持しながらストレージ140内に作成され得るが、フラグは、この更新がペンディング・ロック収集であることを示すために、falseに設定されてもよい(即ち、granted flag= false)。1のプライマリ・キーの現在の行ロック状態に対して、トランザクション2はトランザクション1によってブロックされ(トランザクション番号は=101)、トランザクション2はトランザクション1の完了を待機し、又は1のプライマリ・キーの行ロックを明示的に解放する、と判断されてもよい。共有モードでロックタグ・トランザクション・ロック(101)を取得しようとする場合に、トランザクション2はブロックされ得る。トランザクション1はまだアクティブであり得、トランザクション番号マネージャ130は、ロックタグ・トランザクション(101)上の排他的ロックを維持することができ、従って、共用ロック・リクエストはスリープすることができる。
表1Aのライン5に対するロック・マネージャ125の状態は、以下の表5Aに示される:
表5A
表1Aのライン5に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表5Bに示される:
表5B
表1Aのライン5に対するログ・マネージャ138の状態は、以下の表5Cに示されている:
表5C
表1Aのライン5に対するトランザクションの状態は、以下の表5Dに示されている:
表5D
表1Aのライン5に対するプライマリ・キーの状態は、以下の表5Eに示されている:
表5E
表1Aのライン6に示されるように、トランザクション1はセーブポイントs1へロールバックされ得る。トランザクション番号マネージャ130は、ロールバックのターゲットを記録し(即ち、(101,2))、同じLSMトランザクション番号によりストレージ140とともにロールバック・オペレーションを実行することができる。ロールバック・オペレーションにおいて、トランザクション1の行バージョン・レコードのリストは、ロールバック・ターゲットより小さなLSMトランザクション番号を有する行バージョン・レコードを発見するまで、逆のシーケンス番号順で(例えば、最大から最小へ)レビューされ得る。このリストの横断中に、訪問する各行バージョン・レコードのキー・バケット・ラッチが取得され得る。ラッチを保持しながら、ストレージ140のデータ構造からロールバック・レコードをアンリンク解除することと、行バージョン・レコードに関連する暗黙の行ロックの解放に起因して何らかのブロックされた行レベル・ロッカーがブロック解除され得るか否かを検査することとの両方を行うことができる。LSMトランザクション番号(101,2)及びシーケンス番号3を有する行バージョン・レコードは、ストレージ140から除去され得る。プライマリ・キー1のためのコミットされていない行バージョン・レコード、即ちLSMトランザクション番号(101,0)とシーケンス番号1とを有する行バージョン・レコードが存在するので、トランザクション2が、トランザクション1のペンディング行ロックを取得することを許容しないかもしれない。トランザクション1に関連する最新のシーケンス番号は、2にロールバックされ得る。トランザクション番号マネージャ130は、セーブポイントs1に対応するサブトランザクション・コンテキストを検索することができる。
表1Aのライン6に対するロック・マネージャ125の状態は、以下の表6Aに示されている:
表6A
テーブル1Aのライン6に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表6Bに示される:
表6B
表1Aのライン6に対するログ・マネージャ138の状態は、以下の表6Cに示される:
表6C
表1Aのライン6に対するトランザクションの状態は、以下の表6Dに示されている:
表6D
表1Aのライン6に対するプライマリ・キーの状態は、以下の表6Eに示されている:
表6E
上記の表1Aのライン7において、トランザクション3は、第1コマンド識別ステートメント(即ち、cid=1)を処理するための新しいサブトランザクションを開始することができる。トランザクション番号マネージャ130は、サブトランザクションのためのLSMトランザクション番号(即ち、(103,0))を検索することができ、サブトランザクション・コンテキストは、トランザクション番号103のためのコンテキスト・スタックにプッシュされ得る。トランザクション番号マネージャ130は、トランザクション番号102及びスナップショット・トランザクション・カウンタ番号1のためのテーブルの行にわたってスキャンするように、1というプライマリ・キーを有する行を返すスキャン・キーを用いてオペレーションを実行することができる。行バージョン・レコードが返され、これは1であるトランザクション・カウンタ番号のコミット済みバージョンである。これはトランザクション3にとってビジブルであり得るが、なぜなら、トランザクション1のトランザクション・カウンタ番号はトランザクション3のスナップショット・トランザクション・カウンタ番号以下である一方、トランザクション1からの未コミットの行バージョン・レコードはビジブルでないからである。トランザクション3は、x=3を有する行の新しいバージョンを記録するように、ストレージ140にレコードを挿入することによって、更新の処理に進むことができる。ロック・モードは、キー・アップデート・モードではないかもしれないが、トランザクション1によって保持される暗黙のキー・アップデートなしモードの行ロックと、トランザクション2によって要求されるペンディングの暗黙のキー・アップデートなし行ロックとでコンフリクトが存在するかもしれない。トランザクション3の更新のための行バージョン・レコードは、1であるプライマリ・キーのためのキー・バケット・ラッチが保持される間に、ストレージ140内に作成されることができ、フラグはfalseに設定されてもよい(即ち、granted flag=false)。現在の行ロック状態は、1のプライマリ・キーに対して決定されてもよく、トランザクション3がトランザクション2(即ち、トランザクション番号102)によって近位にブロックされることが決定されてもよい。トランザクション3は、トランザクション2が終了するのを待つか、又は1という値を有するプライマリ・キーの行ロックを明示的に解放してもよい。ストレージ140は、共有モードでトランザクション番号102のロックに対するロックタグを取得することを試みることにより、トランザクション3をブロックすることができる。トランザクション2はアクティブであってもよく、トランザクション番号マネージャ130は、トランザクション番号102のロックタグの排他的ロックを維持していてもよく、従って、共有ロック・リクエストは待機することができる(即ち、「スリープ」)。
表1Aのライン7に対するロック・マネージャ125の状態は、以下の表7Aに示されている:
表7A
テーブル1Aのライン7に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表7Bに示されている:
表7B
表1Aのライン7に対するログ・マネージャ138の状態は、以下の表7Cに示されている:
表7C
表1Aのライン7に対するトランザクションの状態は、以下の表7Dに示されている:
表7D
表1Aのライン7に対するプライマリ・キーの状態は、以下の表7Eに示されている:
表7E
上記の表1Aのライン8において、トランザクション1は中断され得る。トランザクション番号マネージャ130は、ログ・マネージャ138によりアボートをログに記録し、トランザクション番号101のトランザクションをアボートするためにストレージ140においてオペレーションを実行することができる。アボート・トランザクション・オペレーションにおいて、ストレージ140内で逆順序で、トランザクション1の行バージョン・レコードのリストのレビュー(例えば、「ウォーク」)が存在し得る。このリストの横断中に、ストレージ140は、訪問する各行バージョン・レコードのキー・バケット・ラッチを取得してもよい。ラッチを保持している間、ストレージ140のデータ構造からのレコードはリンク解除されてもよく、また、行バージョン・レコードに関連する暗黙の行ロックの解放に起因して、任意のブロックされた行レベル・ロッカーがブロック解除され得るか否かの検査が存在してもよい。この場合、トランザクション1を中断することは、プライマリ・キー1の行ロックを解放する。プライマリ・キー1のペンディング・ロックのリストが調査され、トランザクション2がロックに対して次のラインにあると判断されてもよく、トランザクション番号101のブロックされたロックタグ・トランザクション・ロックのウェイクアップが実行されてもよい。アボート・トランザクション・オペレーションは、トランザクション番号101のトランザクション・ヘッダ・レコードを再利用するために解放してもよい。トランザクション番号マネージャ130は、トランザクション1のトランザクション・コンテキスト・スタックをパージ(purge)し、トランザクション(101)のためのロックタグに関してその排他的ロックを解除することができる。ロック・マネージャ125は、ロックタグ・トランザクション(101)がもはや参照されなくなると、「ごみ収集(garbage-collect)」してもよい。
表1Aのライン8に対するロック・マネージャ125の状態は、以下の表8Aに示されている:
表8A
テーブル1Aのライン8に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表8Bに示されている:
表8B
表1Aのライン8に対するログ・マネージャ138の状態は、以下の表8Cに示されている:
表8C
表1Aのライン8に対するトランザクションの状態は、以下の表8Dに示されている:
表8D
表1Aのライン8に対するプライマリ・キーの状態は、以下の表8Eに示されている:
表8E
上表1Aのライン9に示すように、トランザクションは、ライン8におけるトランザクション1のアボート・オペレーション(即ち、ロールバック・オペレーション)によってブロック解除された。ロック・マネージャ125は、ロック解除の通知後に制御を取り戻し、1のプライマリ・キーに対するバケット・ラッチを再取得し、キーに対する現在のロック状態を調べることができる。トランザクション2は、キーにおける「キー非付与(no key granted)」ロックを取得することが可能であるので、トランザクション2のペンディング行バージョン・レコード上のフラグは、trueに設定され(即ち、granted flag=true)、上述の表1Aのライン5からストレージ140にレコードを挿入するブロックされたオペレーションが続き(即ち、スナップショット・バイオレーションは存在せず)、バケット・ラッチが解放され得る。インサートは、ログ・マネージャ138によってログに記録され得る。トランザクション番号マネージャ130は、更新ステートメントのためのトランザクション・コンテキストを検索することができ、コミットを処理するように進行することができる。トランザクション番号マネージャ130を介して、トランザクション・カウンタ番号がトランザクション2(この場合、トランザクション・カウンタ番号は2)に割り当てられ、副次的に、ログ・マネージャ138によりコミット・レコードをログに記録する。コミット・トランザクション・オペレーションは、ストレージ140内のトランザクション2のトランザクション・ヘッダに、2であるトランザクション・カウンタ番号をスタンプするために呼び出され得る。表1Aのこの時点で、トランザクション2のデータはコミットされ、2以上のスナップショット・トランザクション・カウンタ番号を有する任意のトランザクションにとってビジブルである。トランザクション番号マネージャ130は、ロックタグ・トランザクション(102)における排他的ロックを中止し、トランザクション2のトランザクション・コンテキストをパージすることができる。トランザクション2の行バージョン・レコードに、2であるトランザクション・カウンタ番号をスタンプし、トランザクション番号102のトランザクション・ヘッダ・レコードをリリースして、ストレージ140内で再利用するために、ポスト・コミットメント・トランザクションが呼び出されてもよい。トップレベル・コミット又はアボートに関し、通知により行ロックを明示的に解放する必要はないかもしれない。ブロックされたバックエンドは、ロックタグ・トランザクション(102)の排他的ロックが解除されると、自然に目覚め得る。
表1Aのライン9に対するロック・マネージャ125の状態は、以下の表9Aに示されている:
表9A
表1Aのライン9に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表9Bに示されている:
表9B
表1Aのライン9に対するログ・マネージャ138の状態は、以下の表9Cに示されている:
表9C
表1Aのライン9に対するトランザクションの状態は、以下の表9Dに示されている:
表9D
表1Aのライン9に対するプライマリ・キーの状態は、以下の表9Eに示されている:
表9E
上記の表1Aのライン10に示されるように、トランザクション3は、表1Aのライン9に示されるトランザクション2のコミットによってブロック解除され得る。ロック・マネージャ125は、トランザクション3がロックタグ・トランザクション(102)の共有ロックを取得し、共有ロックを解除し、プライマリ・キー1のバケット・ラッチを再取得し、キーの現在のロック状態を検査した後に、制御を取り戻すことができる。トランザクション3は、キー(プライマリ・キー)のNoKeyGrantedロックを取得することができるので、トランザクション3のペンディング行バージョン・レコードのフラグは、trueに設定され(即ち、granted flag=true)、テーブル1Aのライン7からストレージ140にレコードを挿入するためのブロックされたオペレーションが続いてもよい。しかしながら、この場合、スナップショット・バイオレーションが存在する。トランザクション3は、スナップショット・トランザクション・カウンタ番号1において行バージョン・レコードを挿入することを試みている可能性があるが、2であるトランザクション・カウンタ番号2を有するプライマリ・キー1対してコミットされた行バージョン・レコードが存在する。バケット・ラッチが解除され、挿入レコード・オペレーションが、スナップショット・バイオレーションが存在していることを示すエラーを返すことができる。幾つかの実装では、ステートメントはロールバックされ、新しいスナップショット・トランザクション・カウンタ番号で再始動されるかもしれない。トランザクション番号マネージャ130は、LSMトランザクション番号(103,0)でステートメントの開始にログ・マネージャ138によりロールバックを記録し、ストレージ140のロールバック・オペレーションを実行し、プライマリ・キー1のペンディング行バージョン・レコードをパージすることができる。この場合、通知を要するブロックされたウェイタ(waiters)は存在しない。トランザクション番号マネージャ130は、ステートメントのサブトランザクション・コンテキストを検索することができる。
別の例では、上記の表1Aを使用して、オペレーションは、2であるスナップショット・トランザクション・カウンタ番号2を使用して実行されてもよい。トランザクション3は、第1コマンド識別ステートメント(cid=1)を処理するための新しいサブトランザクションを開始してもよい。トランザクション番号マネージャ130は、サブトランザクションのためのLSMトランザクション番号(即ち(103,0))を得るために、サブトランザクション開始オペレーションを実行することができる。このサブトランザクション・コンテキストは、トランザクション番号103のためにトランザクション番号マネージャ130のコンテキスト・スタックにプッシュされ得る。スキャン・オープン・オペレーションが実行され、トランザクション番号102及び1であるスナップショット・トランザクション・カウンタ番号のためのストレージ140内のテーブルの行にわたるスキャンを開始してもよく、そのスキャン・キーは1であるプライマリ・キーを有する行を返す。行バージョン・レコードは、2であるトランザクション・コミット番号を有するコミットされたバージョンとともに返され得る。この行バージョン・レコードはトランザクション3に対してビジブルであってもよく、なぜなら、2であるトランザクション・カウンタ番号が、トランザクション3のスナップショット・トランザクションカウンタ番号以下であるからである。トランザクション3は、3であるx値を有する新しいバージョンの行を記録するために、挿入レコード・オペレーションを実行することにより、更新の処理に進むことができる。ロック・モードは、「キー・アップデートなし(no key update)」であってもよい。ロック・コンフリクトは存在しないかもしれないので、ストレージ140は、トランザクション3の更新のための行バージョン・レコードを作成する一方、1であるプライマリ・キーに対するキー・バケット・ラッチを保持し、フラグをtrueに設定することができる(即ち、granted flag=true)。バケット・ラッチは解放されてもよく、挿入はログ・マネージャ138によってログに記録されてもよい。トランザクション番号マネージャ130は、更新ステートメントのためのトランザクション・コンテキストを検索することができ、コミットを処理するために進むことができる。ログ・マネージャ138がコミット・レコードをログに記録すると、トランザクション番号マネージャ130により、トランザクション・カウンタ番号が、トランザクション3に割り当てられ得る(即ち、この場合、トランザクション・カウンタ番号は3であってもよい)。コミット・トランザクションは、トランザクション3のトランザクション・ヘッダに、3であるトランザクション・カウンタ番号をスタンプするようにストレージ140において実行されてもよい。トランザクション番号マネージャ130は、ロックタグ・トランザクション(103)における排他的ロックを排除し、トランザクション3のトランザクション・コンテキストをパージすることができる。ポスト・コミット・トランザクションは、ストレージ140内のトランザクション3の行バージョン・レコードにトランザクション・カウンタ番号3をスタンプし、トランザクション番号103のトランザクション・ヘッダ・レコードを再利用に備えて解放するために呼び出されてもよい。
表1Aのライン7から始まるロック・マネージャ125のステータスは、2であるスナップショット・トランザクション・カウンタ番号を使用して、以下の表10Aに示されている:
表10A
表1Aのライン7から始まるトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、2であるスナップショット・トランザクション・カウンタ番号を使用して、以下の表10Bに示されている:
表10B
表1Aのライン7から始まるログ・マネージャ138の状態は、2であるスナップショット・トランザクション・カウンタ番号を使用して、以下の表10Cに示されている:
表10C
表1Aのライン7から始まるプライマリ・キーのスナップショット・トランザクション・カウンタ番号2の状態は、2であるスナップショット・トランザクション・カウンタ番号を使用して、以下の表10Dに示されている:
表10D
下記の例は、明示的な行ロックに向けられている。下記の表11Aでは、3つのトランザクション履歴が存在し得る。
表11A
表11Aのライン1に示されるように、3つのトップ・レベルのトランザクション1、トランザクション2、及びトランザクション3が作成される。トランザクション番号マネージャ130は、トランザクション番号を(即ち、この例では、トランザクション番号101、102、及び103をそれぞれ)割り当て、トランザクション・コンテキストを作成し、トランザクション開始オペレーションを(即ち、そのトランザクション番号を有するアクティブなトランザクションが存在することを登録するために)実行することができる。トランザクション開始オペレーションは、トランザクションの開始のトランザクション・シーケンス番号(即ち、シーケンス番号ゼロ)でLSMトランザクション番号値を初期化することができ、LSMトランザクション番号はトランザクション・コンテキストに配置される。更に、トランザクション番号マネージャ130は、ロックタグ・トランザクション(101)、ロックタグ・トランザクション(102)、及びロックタグ・トランザクション(103)のロックタグを有するロック・マネージャ125における排他的ロックを取得する。ログ・レコードは、これらのオペレーションの何れによっても生成されなくてよい。
表11Aのライン1に対するロック・マネージャ125の状態は、下記の表11Bに示されている:
表11B
表11Aのライン1に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表11Cに示されている:
表11C
テーブル11Aのライン1に対するログ・マネージャ138の状態は、以下の表11Dに示されている:
表11D
テーブル11Aのライン1に対するトランザクションの状態は、以下の表11Eに示されている:
表11E
表11Aのライン1に対するプライマリ・キーの状態は、以下の表11Fに示されている:
表11F
上表のライン2に示されるように、トランザクション1は、第1コマンド識別ステートメント(cid=1)を処理するために、新しいサブトランザクションを開始することができる。トランザクション番号マネージャ130は、開始サブトランザクション・オペレーションを実行することができ、サブトランザクションのLSMトランザクション番号値(即ち、(101,0))を取得することができる。このサブトランザクション・コンテキストは、トランザクション番号101のトランザクション番号マネージャ130のコンテキスト・スタックにプッシュされてもよい。「共有用選択」(“select for share”)ステートメントの処理は、1であるプライマリ・キー(p=1)に関する「共有(share)」のロック・モードでロック取得を行うことを含んでもよい。ロック取得オペレーションの中で、ストレージ140は、1のプライマリ・キー(p=1)に対するキー・バケットをラッチし、キーに対する現在のロック状態を調べることができる。グラントされた行ロックがないかもしれないので、行ロック・レコード(即ち、granted=true)がキーのレコード・チェーンに挿入される。バケット・ロックは解除され、ロック取得オペレーションはノーマルの動作状態に戻ることができる。幾つかの実装では、ロック取得のログがないかもしれない。更新オペレーションが完了すると、トランザクション番号マネージャ130は、ステートメントのサブトランザクション・コンテキストを検索することができる。
表11Aのライン2に対するロック・マネージャ125の状態は、下記の表12Aに示されている:
表12A
テーブル11Aのライン2に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表12Bに示されている:
表12B
テーブル11Aのライン2に対するログ・マネージャ138の状態は、以下の表12Cに示されている:
表12C
表11Aのライン2に対するトランザクションの状態は、以下の表12Dに示されている:
表12D
表11Aのライン1に対するプライマリ・キーの状態は、以下の表12Eに示されている:
表12E
上述した表のライン3に示されるように、トランザクション2は、第1コマンド識別ステートメント(cid=1)を処理するための新しいサブトランザクションを開始することができる。トランザクション番号マネージャ130は、開始サブトランザクション・オペレーションを実行することができ、サブトランザクションのLSMトランザクション番号(即ち、(102,0))を取得することができる。このサブトランザクション・コンテキストは、トランザクション番号102のトランザクション番号マネージャ130のコンテキスト・スタックにプッシュされてもよい。「select for share」ステートメントの処理は、1であるプライマリ・キー1(p=1)に関する「share」のロック・モードでのロック取得オペレーションを含む。ロック取得オペレーションの中で、ストレージ140は、1のプライマリ・キー(p=1)に対するキー・バケットをラッチし、キーに対する現在のロック状態を調べることができる。このロック・リクエストは、トランザクション1に付与された「共有」ロックとコンパチブルであり得るため、行ロック・レコード(即ち、granted=true)がキーのレコード・チェーンに挿入される。バケット・ロックは解除され、ロック取得オペレーションはノーマル・オペレーションに戻ることができる。幾つかの実装では、ロック取得のためのログは存在しない。更新オペレーションが完了すると、トランザクション番号マネージャ130は、ステートメントのサブトランザクション・コンテキストを検索することができる。
表11Aのライン3に対するロック・マネージャ125の状態は、下記の表13Aに示されている:
表13A
テーブル11Aのライン3に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表13Bに示されている:
表13B
テーブル11Aのライン3に対するログ・マネージャ138の状態は、以下の表13Cに示されている:
表13C
表11Aのライン3に対するトランザクションの状態は、以下の表13Dに示されている:
表13D
表11Aのライン3に対するプライマリ・キーの状態は、以下の表13Eに示されている:
表13E
上述した表のライン4に示されるように、トランザクション3は第1コマンド識別ステートメント(cid=1)を処理するために新しいサブトランザクションを開始する。トランザクション番号マネージャ130は、開始サブトランザクション・オペレーションを呼び出し及び/又は実行することができ、サブトランザクションのLSMトランザクション番号(即ち(103,0))を取得することができる。このサブトランザクション・コンテキストは、トランザクション番号103に対するトランザクション番号マネージャ130のコンテキスト・スタックにプッシュされてもよい。「アップデート」ステートメントの処理は、x=3の行の新しいバージョンを挿入するために、1のプライマリ・キー(p=1)に対して「キー・アップデートなし(no key update)」のロック・モードで挿入レコード・オペレーションを実行することができる。挿入レコード・オペレーションの中で、ストレージ140は、1というプライマリ・キーに関するキー・バケットをラッチし(p=1)、キーの現在のロック状態を調べることができる。更新リクエストは、トランザクション1及びトランザクション2に付与される共有ロックとコンパチブルではないかもしれないため、行バージョン・レコード(即ちここでは、granted=false)がキーのレコード・チェーンに挿入され、トランザクション3は、ロックタグ・トランザクション(102)ロックに対する共有リクエストにおいてスリープに移行することができる。バケット・ラッチは、スリープ・オペレーションからコールバックを介して解放されてもよい。
表11Aのライン4に対するロック・マネージャ125の状態は、下記の表14Aに示されている:
表14A
表11Aのライン4に対するトランザクション番号マネージャ130の状態(即ち、コンテキストスタックの状態)は、以下の表14Bに示されている:
表14B
表11Aのライン4に対するログ・マネージャ138の状態は、以下の表14Cに示されている:
表14C
表11Aのライン4に対するトランザクションの状態は、以下の表14Dに示されている:
表14D
表11Aのライン4に対するプライマリ・キーの状態は、以下の表14Eに示されている:
表14E
上記の表のライン5は、トランザクション1がアボートになる(即ち、ロールバック・オペレーションが発生する)ことを示す。トランザクション番号マネージャ130は、ログ・マネージャ138でアボートをログに記録し、XID 101のアボート・トランザクションを呼び出すことができる。ストレージ140のアボート・トランザクション・オペレーションにおいて、ストレージ140は、トランザクション1のレコードのリストを、逆順序で横断(即ち、「ウォーク」)し得る。このリスト横断中に、ストレージ140は、訪問する各々の行バージョン・レコード及び/又は行ロック・レコードのキー・バケット・ラッチを取得することができる。ラッチを保持する間、ストレージ140のデータ構造からのレコードはリンク解除されてもよく、また、暗黙的又は明示的な行ロックの解放に起因して、任意のブロックされた行レベル・ロッカーがブロック解除され得るか否かが決定されてもよい。この場合、トランザクション1をアボートすることは、p=1の共有される行ロックを解除する。プライマリ・キー1(即ち、p=1)のペンディング・ロッカーのリストを調べた後、ストレージ140は、トランザクション3がトランザクション2によってブロックされたままであることを決定することができ、従って、トランザクション3はウェイクアップするように通知されない。また、オペレーション中断トランザクションは、トランザクション番号101のトランザクション・ヘッダ・レコードを再利用するために解放することもできる。中断トランザクション・オペレーションから戻ると、トランザクション番号マネージャ130は、トランザクション番号マネージャ130におけるトランザクション1のトランザクション・コンテキスト・スタックをパージし、ロックタグ・トランザクション(101)における排他的ロックを解除することができる。
表11Aのライン5に対するロック・マネージャ138の状態は、下記の表15Aに示されている:
表15A
表11Aのライン5に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表15Bに示されている:
表15B
表11Aのライン5に対するログ・マネージャ138の状態は、以下の表15Cに示されている:
表15C
表11Aのライン5に対するトランザクションの状態は、以下の表15Dに示されている:
表15D
表11Aのライン5に対するプライマリ・キーの状態は、以下の表15Eに示されている:
表15E
上記の表のライン6は、トランザクション2がアボートすること(即ち、ロールバック・オペレーションが発生すること)を示す。トランザクション番号マネージャ130は、ログ・マネージャ138によりアボートをログに記録し、トランザクション番号102のアボート・トランザクション・オペレーションを呼び出すことができる。アボート・トランザクションでは、ストレージ140において逆順序でトランザクション2のレコードのリストを横断することがあり得る。トランザクション1(p=1)をアボートすると、1のプライマリ・キーの共有行ロックを解除する。p=1のためのペンディング・ロッカーのリストを検討した後、ストレージ140は、トランザクション3が行ロックを取得し得ると判断し、ウェイクアップ・オペレーションを呼び出すことによって、トランザクション番号102のためのロックタグ・トランザクション・ロックにおいてブロックされたバックエンドのウェイクアップ・オペレーションを呼び出すことができる。また、アボート・トランザクションは、トランザクション番号102のトランザクション・ヘッダ・レコードを再利用するために解放することもできる。アボート・トランザクションオペレーションから戻ると、トランザクション番号マネージャ130は、トランザクション番号マネージャ130のトランザクション・コンテキスト・スタックをパージし、ロックタグ・トランザクション(102)の排他的ロックを解除することができる。
表11Aのライン6に対するロック・マネージャ125の状態は、下記の表16Aに示されている:
表16A
テーブル11Aのライン6に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表16Bに示されている:
表16B
表11Aのライン6に対するログ・マネージャ138の状態は、以下の表16Cに示されている:
表16C
表11Aのライン6に対するトランザクションの状態は、以下の表16Dに示されている:
表16D
表11Aのライン6に対するプライマリ・キーの状態は、以下の表16Eに示されている:
表16E
上記の表におけるライン行7は、ライン6におけるトランザクション2のアボートによって、トランザクション3がブロック解除されたことを示す。ロック・マネージャ125は、共有ロック・ロックタグ・トランザクション(102)を取得するロック・マネージャ125の試みから「通知されるステータス」によりトランザクション3が呼び起こされた後に制御を取り戻すことができる。ロック・マネージャ125は、1のプライマリ・キー(p=1)のバケット・ラッチを再取得し、キーの現在のロック状態を調べることができる。トランザクション3は、キーに関する「許可キーなし(no key granted)」のロックを取得することができるので、トランザクション3のペンディングの行バージョン・レコードのフラグは、true に設定され(即ち、granted flag=true)、上記の表のライン4からの挿入レコード・オペレーションに対するブロックされたコールが継続してよい。バケット・ラッチは解放されることが可能であり、挿入はログ・マネージャ138によってログに記録されることが可能である。トランザクション番号マネージャ130は、更新ステートメントのためのトランザクション・コンテキストを検索することができ、コミットを処理することができる。トランザクション番号マネージャ130により、トランザクション・カウンタ番号は、トランザクション3に割り当てられ(この場合、トランザクション・カウンタ番号は2であり)、副次的にコミット・レコードを記録する。コミット・トランザクション・オペレーションは、トランザクション3のトランザクション・ヘッダにトランザクション・カウンタ番号2をスタンプするために実行されてもよい。トランザクション番号マネージャ130は、ロックタグ・トランザクション(103)における排他的ロックをドロップし、トランザクション3のトランザクション・コンテキストをパージすることができる。ポスト・コミット・トランザクション・オペレーションは、トランザクション3の行バージョン・レコードに、2であるトランザクション・カウンタ番号をスタンプし、トランザクション番号103に関するトランザクション・ヘッダ・レコードを再利用するために解放するように実行されてもよい。
表11Aのライン7に対するロック・マネージャ125の状態は、下記の表17Aに示されている:
表17A
表11Aのライン7に対するトランザクション番号マネージャ130の状態(即ち、コンテキスト・スタックの状態)は、以下の表17Bに示されている:
表17B
表11Aのライン7に対するログ・マネージャ138の状態は、以下の表17Cに示されている:
表17C
表11Aのライン7に対するトランザクションの状態は、以下の表17Dに示されている:
表17D
表11Aのライン7に対するプライマリ・キーの状態は、以下の表17Eに示されている:
表17E
より一般的には、現在開示している対象事項の様々な実装は、これらのプロセスを実現するためのコンピュータ実装プロセス及び装置の形態を含んでもよく、又はそれらで実現されてもよい。また、実装は、フロッピー・ディスケット、CD-ROM、ハード・ドライブ、USB(ユニバーサル・シリアル・バス)ドライブ、又は任意の他のマシン読み取り可能な記憶媒体のような、非一時的な及び/又は有形の媒体に実装される命令を含むコンピュータ・プログラム・コードを有するコンピュータ・プログラム製品の形態で実現されてもよく、コンピュータ・プログラム・コードがコンピュータにロードされ、実行される場合、コンピュータは、開示された対象事項の実装を実現するための装置となる。また、実装は、例えば、記憶媒体に格納されているか、コンピュータにロードされるか、及び/又はコンピュータによって実行されるか、又は電気配線若しくはケーブル配線を介して、光ファイバを介して、又は電磁放射を介して何らかの伝送媒体によって伝送されるかにかかわらず、コンピュータ・プログラム・コードの形態で実行されてもよく、コンピュータ・プログラム・コードがコンピュータにロードされ、コンピュータによって実行される場合、コンピュータは、開示された対象事項の実装を実現するための装置となる。汎用マイクロプロセッサで実施される場合、コンピュータ・プログラム・コードのセグメントは、特定の論理回路を作り出すようにマイクロプロセッサを構成する。幾つかの構成では、コンピュータ読み取り可能な記憶媒体に保存される一組のコンピュータ読み取り可能な命令は、汎用プロセッサにより実現されてもよく、その命令は、汎用プロセッサ又は汎用プロセッサを含む装置を、命令を実装又は実行するように構成された専用装置に変えることができる。実装は、汎用マイクロプロセッサ及び/又は特定用途向け集積回路等のプロセッサを含むハードウェアを利用して実現されることが可能であり、汎用マイクロプロセッサ等は、ハードウェア及び/又はファームウェアにおいて、開示された対象事項の実装に従う技術の全部又は一部を実施する。プロセッサは、RAM、ROM、フラッシュ・メモリ、ハードディスク、又は電子情報を記憶することができる任意の他の装置などのメモリに結合されてもよい。メモリは、開示される対象事項の実装に従う技術を実行するようにプロセッサによって実行されるように構成される命令を記憶することができる。
上記の説明は、説明の目的で、特定の実装を参照して記述されている。しかしながら、上記の例示的な議論は、網羅的であるように、又は開示された対象事項の実装を、開示された形態どおりに限定するようには意図されていない。上記の教示を考慮して多くの修正及び変形が可能である。実施例は、開示された対象事項の実装の原理及びそれらの実用的応用を説明するために、選択及び説明されており、それによって、想定される特定の用途に適するように、当業者が、これらの実装だけでなく様々な修正を施した様々な実装をも利用できるようにする。
以下、更なる具体例を記載する:
(具体例1)
ソフトウェア・インスタンスに対する複数のテナントのディジタル・データを管理するコンピュータで実現される方法であって、各々のテナントは、アプリケーションのソフトウェア・インスタンスに対する特定の一組の特権を有する共通アクセスを共有するユーザーのグループを含み、各々のインスタンスは、互いに通信するサーバー・システムの複数のインスタンス・ノードのうちの少なくとも1つで実現され、前記管理することは、前記サーバー・システムに通信可能に結合される1つ以上のストレージ・デバイス・ロケーションでレコードとして保存され得る前記ディジタル・データの異なるインスタンスのマルチバージョン同時制御を管理することを含み、各々のレコードはデータベースのテーブルにおける1つ以上の行の識別子を含むキーにより識別され、前記方法は:
トランザクション・カウンタ番号に関するクエリを前記サーバー・システムで受信するステップ;
データを識別するトランザクション・ヘッダが、前記サーバー・システムにおいて、割り当てられたトランザクション・カウンタ番号で更新される場合、更新された前記データを識別するトランザクション・ヘッダを、マルチバージョン同時制御情報のインスタンスとして、受信したクエリにより使用するステップ;
前記サーバー・システムにおいて、前記受信したクエリに基づいて、前記データベースの前記テーブルにおいてキー・ルックアップを実行するステップ;
前記キー・ルックアップが、コミットされていない行に遭遇した場合、前記サーバー・システムに通信可能に結合される1つ以上のストレージ・デバイス・ロケーションにおいて、トランザクション番号がコミットされるか否かを判断するためにデータ・アレイ要素を識別し、対応するトランザクション・カウンタ番号を決定するために、データを識別する対応するトランザクション・ヘッダにアクセスするステップ;及び
前記サーバー・システムにおいて、行バージョン・レコードにトランザクション・カウンタ番号をスタンプするステップ;
を含む方法。
(具体例2)
前記対応するトランザクション・ヘッダにアクセスする前記ステップは:
前記行バージョン・レコード及び行ロック・レコードにおけるトランザクション・ヘッダ・インデックス・フィールドを利用して前記データ・アレイ要素を識別するステップ;
を含む、具体例1に記載の方法。
(具体例3)
トランザクション識別子を有するトランザクションにより影響を受ける各々の行に関し、前記トランザクション・カウンタ番号で、前記トランザクションにより影響を受ける各々の行をスタンプし、任意の行ロックを解放するステップを更に含む具体例1に記載の方法。
(具体例4)
1つ以上の行ルックアップ・レコードがコミットされていない場合に行ルックアップを実行するステップであって、前記1つ以上の行ルックアップ・レコードは、前記トランザクション・カウンタ番号でスタンプされていない場合には、コミットされていない、ステップを更に有する具体例1に記載の方法。
(具体例5)
前記1つ以上のコミットされていないレコードがクエリにとって外的に認識可能でない場合に、前記1つ以上のコミットされていない行ルックアップ・レコードを独立に処理するステップを更に含む具体例4に記載の方法。
(具体例6)
ソフトウェア・インスタンスに対する複数のテナントのディジタル・データを管理するコンピュータで実現される方法であって、各々のテナントは、アプリケーションのソフトウェア・インスタンスに対する特定の一組の特権を有する共通アクセスを共有するユーザーのグループを含み、各々のインスタンスは、互いに通信するサーバー・システムの複数のインスタンス・ノードのうちの少なくとも1つで実現され、前記管理することは、1つ以上のストレージ・デバイス・ロケーションで保存され得る前記ディジタル・データの異なるインスタンスのマルチバージョン同時制御を管理することを含み、トランザクションは1つ以上のクエリにとって当初は認識可能でなく、前記方法は:
前記サーバー・システムにおいて、レコード・チェーンに対するアクセスを制御するために、前記サーバー・システムに保存されるレコードのアップデート各々に関連するトランザクション識別子のためのバケットをラッチし、前記トランザクション識別子をハッシュすることからの任意のハッシュ衝突を解決するステップであって、前記バケットは、前記トランザクション識別子の前記ハッシュを含む、ステップ;
前記サーバー・システムにおいて、データを識別する前記トランザクション・ヘッダにおけるトランザクション・カウンタ番号を、トランザクション番号に設定するステップ;
前記サーバー・システムにおいて前記バケットをアンラッチし、前記サーバー・システムにおいて前記トランザクション・カウンタ番号を更新し、前記サーバー・システムにおいて、前記サーバー・システムにより受信される1つ以上のクエリに対して、前記トランザクションを認識可能にするステップ;及び
前記サーバー・システムにおけるトランザクション・マネージャにより、前記トランザクション番号をアンロックするために前記トランザクション番号におけるトランザクション・ロックを解放し、前記サーバー・システムにおいて、前記サーバー・システムにより受信される1つ以上のクエリに対して認識可能にするステップ;
を含む方法。
(具体例7)
前記トランザクション識別子をハッシュするステップ;
を更に含む具体例6に記載の方法。
(具体例8)
前記トランザクション識別子のダイレクト・ルックアップを実行するステップ;
を更に含む具体例6に記載の方法。
(具体例9)
データを識別する前記トランザクション・ヘッダにおけるトランザクション・カウンタ番号を設定する前記ステップが:
前記トランザクションに関連する全ての行ロックを解放するステップ;
を更に含む、具体例6に記載の方法。
(具体例10)
ソフトウェア・インスタンスに対する複数のテナントのディジタル・データを管理するコンピュータで実現される方法であって、各々のテナントは、アプリケーションのソフトウェア・インスタンスに対する特定の一組の特権を有する共通アクセスを共有するユーザーのグループを含み、各々のインスタンスは、互いに通信するサーバー・システムの複数のインスタンス・ノードのうちの少なくとも1つで実現され、前記管理することは、前記サーバー・システムに通信可能に結合される1つ以上のストレージ・デバイス・ロケーションでレコードとして保存され得る前記ディジタル・データの異なるインスタンスのマルチバージョン同時制御を管理することを含み、各々のレコードはデータベースのテーブルにおける1つ以上の行の識別子を含むキーにより識別され、トランザクションは1つ上のクエリに対して認識可能であり、前記方法は:
前記サーバー・システムにおいて、レコード・チェーンに対するアクセスを制御するために前記サーバー・システムに保存されるレコードのアップデート各々に関連するトランザクション識別子のためのハッシュ・バケットをラッチするステップ;
前記サーバー・システムにおいて、前記レコードのトランザクションに関連するデータを識別するトランザクション・ヘッダにおける現在のキー・ハッシュ値及び現在のシーケンス番号を設定し、前記トランザクション識別子のための前記ハッシュ・バケットをアンラッチするステップであって、前記シーケンス番号は前記レコードの行のシーケンスにおける位置を識別する、ステップ;
前記サーバー・システムにおいて、行ロック・レコード及び行バージョン・レコードから、前記行ロック・レコード及び前記行バージョン・レコードのうち少なくとも1つに行識別子が存在するか否かを判断するステップであって、トランザクション番号は前記トランザクション識別子と同一であり、シーケンス番号は、前記サーバー・システムによりレビューされる現在のシーケンス番号と同一である、ステップ;
前記サーバー・システムにおいて、前記トランザクション・カウンタ番号を前記現在の行バージョン・レコードにスタンプし、そのため、前記トランザクション番号が前記トランザクション識別子と同一であり、前記シーケンス番号が前記現在のシーケンス番号と同一である場合に、前記現在の行バージョン・レコードはコミットされる、ステップ;
を含む方法。
(具体例11)
前記行識別子が前記トランザクション識別子に等しくないトランザクション番号を有する場合、又は前記行識別子が前記トランザクション識別子に等しいトランザクション番号を有し且つ前記シーケンス番号が前記現在のシーケンス番号以上である場合に、前記レコードにおける次の行バージョンに移動するステップを更に含む具体例10に記載の方法。
(具体例12)
前記行ロック・レコードのうちの1つが同時ルックアップ動作によりスタンプされていない場合に、前記スタンプが生じる、具体例10に記載の方法。
(具体例13)
前記トランザクション番号が前記トランザクション識別子と同一であり、前記シーケンス番号が前記行ロック・レコードのうちの1つに対する現在のシーケンス番号と同一である場合に、前記行ロック・レコードのうちの1つを、前記1つ以上のストレージ・デバイス・ロケーションから除外するステップを更に含む具体例10に記載の方法。
(具体例14)
前記行バージョン・レコードのうちの1つは、同時ルックアップ動作によりスタンプされていない、具体例10に記載の方法。
(具体例15)
以前のシーケンス番号が存在するか否かを判断するステップを更に含む具体例10に記載の方法。
(具体例16)
以前のキー・ハッシュ値に前記現在のキー・ハッシュ値を設定するステップ;
前記現在のシーケンス番号を前記以前のシーケンス番号に設定するステップ;及び
キー・バケットをアンラッチするステップ;
を更に含み、前記ラッチは前記レコード・チェーンに対するアクセスを制御する、具体例15に記載の方法。
(具体例17)
前記以前のシーケンス番号が末端値に達した場合に、前記レコード・チェーンのレビューをストップするステップを更に含む具体例15に記載の方法。
(具体例18)
トランザクション識別子をハッシュするステップ;及び
前記トランザクション識別子をハッシュすることからの任意のハッシュ衝突を解決するステップ;
を更に含む具体例10に記載の方法。
(具体例19)
前記トランザクション識別子のダイレクト・ルックアップを実行するステップを更に含む具体例10に記載の方法。
(具体例20)
ソフトウェア・インスタンスに対する複数のテナントのディジタル・データを管理するコンピュータで実現される方法であって、各々のテナントは、アプリケーションのソフトウェア・インスタンスに対する特定の一組の特権を有する共通アクセスを共有するユーザーのグループを含み、各々のインスタンスは、互いに通信するサーバー・システムの複数のインスタンス・ノードのうちの少なくとも1つで実現され、前記管理することは、前記サーバー・システムに通信可能に結合される1つ以上のストレージ・デバイス・ロケーションでレコードとして保存され得る前記ディジタル・データの異なるインスタンスのマルチバージョン同時制御を管理することを含み、各々のレコードはデータベースのテーブルにおける1つ以上の行の識別子を含むキーにより識別され、トランザクションは1つ以上のクエリに対して認識可能であり、前記方法は:
前記サーバー・システムにおいて前記キーをハッシュするステップ;
前記サーバー・システムにおいて、前記キーに対するキー・ハッシュ・バケットをラッチし、ハッシュすることからの任意の衝突を解決するステップ;
前記サーバー・システムにおいて、スナップショット・トランザクション・カウンタ番号、キーの自己識別番号、及びコマンド識別ステートメントに基づいて、最新の認識可能な行バージョン・レコードを決定するために、レコードについてのキーの行バージョン・チェーンをサーチするステップ;
を含み、前記サーチするステップは:
前記サーバー・システムにおいて、レコードの行バージョン・チェーンの行がアンコミットされているか否かを判断するステップ;
前記行がアンコミットされている場合、前記サーバー・システムにおいて、情報を識別する前記トランザクション・ヘッダから、トランザクション・カウンタ番号値を読み込むステップ;及び
前記トランザクション・カウンタ番号と同じ行トランザクション・カウンタを有することにより、前記トランザクション・カウンタ番号が有効である場合に、前記サーバー・システムにおいて、現在の行バージョン・レコードに前記トランザクション・カウンタ番号をスタンプし、前記現在の行バージョン・レコードを、コミットされているものとしてマークするステップ;
を含む方法。
(具体例21)
前記行バージョン・レコードが、マルチバージョン同時制御(MVCC)に対して認識可能であるか否かを判断するステップ;及び
前記行バージョン・レコードが前記MVCCに対して認識可能である場合に、前記サーチをストップするステップ;
を更に含む具体例20に記載の方法。
(具体例22)
前記行バージョン・レコードが、マルチバージョン同時制御(MVCC)に対して認識可能であるか否かを判断するステップ;及び
存在する場合には次の行バージョン・レコードに進み、又は前記サーチをストップするステップ;
を更に含む具体例20に記載の方法。
(具体例23)
ソフトウェア・インスタンスに対する複数のテナントのディジタル・データを管理するサーバー・システムであって、各々のテナントは、アプリケーションのソフトウェア・インスタンスに対する特定の一組の特権を有する共通アクセスを共有するユーザーのグループを含み、各々のインスタンスは、互いに通信するサーバー・システムの複数のインスタンス・ノードのうちの少なくとも1つで実現され、前記管理することは、前記サーバー・システムに通信可能に結合される1つ以上のストレージ・デバイス・ロケーションでレコードとして保存され得る前記ディジタル・データの異なるインスタンスのマルチバージョン同時制御を管理することを含み、各々のレコードはデータベースのテーブルにおける1つ以上の行の識別子を含むキーにより識別され、前記サーバー・システムは:
トランザクション・カウンタ番号に関するクエリを受信するステップ;
前記キー・ルックアップが、前記1つ以上のストレージ・デバイス・ロケーションにおいてトランザクション番号についてコミットされていない行に遭遇した場合に、受信したクエリにより、マルチバージョン同時制御情報のインスタンスとして、データを識別する更新されたトランザクション・ヘッダを利用するステップ;
前記受信したクエリに基づいて、前記データベースの前記テーブルにおいてキー・ルックアップを実行するステップ;
前記キー・ルックアップが、コミットされていない行に遭遇した場合に、前記サーバー・システムが、前記サーバー・システムに通信可能に結合される1つ以上のストレージ・デバイス・ロケーションにおいて、前記1つ以上のストレージ・デバイス・ロケーションにおけるデータ・アレイ要素を識別し、トランザクション番号がコミットされるか否かを判断するために、データを識別する対応するトランザクション・ヘッダにアクセスし、対応するトランザクション・カウンタ番号を決定するステップ;及び
前記1つ以上のストレージ・デバイス・ロケーションにおける行バージョン・レコードに前記トランザクション・カウンタ番号をスタンプするステップ;
を行うシステム。
(具体例24)
前記サーバー・システムは、前記行バージョン・レコード及び行ロック・レコードにおけるトランザクション・ヘッダ・インデックス・フィールドを利用して前記データ・アレイ要素を識別することにより、前記1つ以上のストレージ・デバイス・ロケーションにおける前記対応するトランザクション・ヘッダにアクセスする、具体例23に記載のシステム。
(具体例25)
前記サーバー・システムは、前記トランザクション・カウンタ番号で、前記トランザクションにより影響を受ける各々の行をスタンプし、前記1つ以上のストレージ・デバイス・ロケーションにおいてトランザクション識別子を有するトランザクションにより影響を受ける各々の行について任意の行ロックを解放する、具体例23に記載のシステム。
(具体例26)
前記サーバー・システムは、1つ以上の行ルックアップ・レコードがコミットされていない場合に、前記1つ以上のストレージ・デバイス・ロケーションにおいて行ルックアップを実行し、そのため、前記1つ以上の行ルックアップ・レコードは、前記トランザクション・カウンタ番号でスタンプされていない場合には、コミットされていない、具体例23に記載のシステム。
(具体例27)
前記1つ以上のコミットされていないレコードがクエリにとって外的に認識可能でない場合に、前記1つ以上のストレージ・デバイス・ロケーションの前記1つ以上のコミットされていない行ルックアップ・レコードを独立に処理する、具体例26に記載のシステム。
(具体例28)
ソフトウェア・インスタンスに対する複数のテナントのディジタル・データを管理するサーバー・システムであって、各々のテナントは、アプリケーションのソフトウェア・インスタンスに対する特定の一組の特権を有する共通アクセスを共有するユーザーのグループを含み、各々のインスタンスは、互いに通信するサーバー・システムの複数のインスタンス・ノードのうちの少なくとも1つで実現され、前記管理することは、1つ以上のストレージ・デバイス・ロケーションで保存され得る前記ディジタル・データの異なるインスタンスのマルチバージョン同時制御を管理することを含み、トランザクションは1つ以上のクエリにとって当初は認識可能でなく、前記サーバー・システムは:
前記1つ以上のストレージ・デバイス・ロケーションにおいてレコード・チェーンに対するアクセスを制御するために、前記サーバー・システムに保存されるレコードのアップデート各々に関連するトランザクション識別子のためのバケットをラッチし、前記トランザクション識別子をハッシュすることからの任意のハッシュ衝突を解決するステップであって、前記バケットは、前記トランザクション識別子の前記ハッシュを含む、ステップ;
データを識別する前記トランザクション・ヘッダにおけるトランザクション・カウンタ番号を、前記1つ以上のストレージ・デバイス・ロケーションにおいてトランザクション番号に設定するステップ;
前記バケットをアンラッチし、前記1つ以上のストレージ・デバイス・ロケーションにおいてシステム・リード・トランザクション・カウンタ番号を更新し、前記サーバー・システムにより受信される1つ以上のクエリに対して、前記トランザクションを認識可能にするステップ;及び
前記サーバー・システムのトランザクション・マネージャにより、前記トランザクション番号をアンロックするために前記1つ以上のストレージ・デバイス・ロケーションにおける前記トランザクション番号のトランザクション・ロックを解放し、前記サーバー・システムにより受信される1つ以上のクエリに対して認識可能にするステップ;
を行うシステム。
(具体例29)
前記サーバー・システムは、前記トランザクション識別子をハッシュする、具体例28に記載のシステム。
(具体例30)
前記サーバー・システムは、前記1つ以上のストレージ・デバイス・ロケーションにおいて前記トランザクション識別子のダイレクト・ルックアップを実行する、具体例28に記載のシステム。
(具体例31)
前記サーバー・システムは、前記1つ以上のストレージ・デバイス・ロケーションにおいてデータを識別する前記トランザクション・ヘッダにおける前記トランザクション・カウンタ番号を設定し、前記トランザクションに関連する全ての行ロックを解放する、具体例28に記載のシステム。
(具体例32)
ソフトウェア・インスタンスに対する複数のテナントのディジタル・データを管理するサーバー・システムであって、各々のテナントは、アプリケーションのソフトウェア・インスタンスに対する特定の一組の特権を有する共通アクセスを共有するユーザーのグループを含み、各々のインスタンスは、互いに通信するサーバー・システムの複数のインスタンス・ノードのうちの少なくとも1つで実現され、前記管理することは、前記サーバー・システムに通信可能に結合される1つ以上のストレージ・デバイス・ロケーションでレコードとして保存され得る前記ディジタル・データの異なるインスタンスのマルチバージョン同時制御を管理することを含み、各々のレコードはデータベースのテーブルにおける1つ以上の行の識別子を含むキーにより識別され、トランザクションは1つ上のクエリに対して認識可能であり、前記サーバー・システムは:
前記1つ以上のストレージ・デバイス・ロケーションにおいてレコード・チェーンに対するアクセスを制御するために前記サーバー・システムに保存されるレコードのアップデート各々に関連するトランザクション識別子のためのハッシュ・バケットをラッチするステップ;
前記1つ以上のストレージ・デバイス・ロケーションにおいて、前記レコードのトランザクションに関連するデータを識別するトランザクション・ヘッダにおける現在のキー・ハッシュ値及び現在のシーケンス番号を設定し、前記トランザクション識別子のための前記ハッシュ・バケットをアンラッチするステップであって、前記シーケンス番号は前記レコードの行のシーケンスにおける位置を識別する、ステップ;
行ロック・レコード及び行バージョン・レコードから、前記行ロック・レコード及び前記行バージョン・レコードのうち少なくとも1つに行識別子が存在するか否かを判断するステップであって、トランザクション番号は前記トランザクション識別子と同一であり、シーケンス番号は、前記サーバー・システムによりレビューされる前記1つ以上のストレージ・デバイス・ロケーションにおける現在のシーケンス番号と同一である、ステップ;及び
前記1つ以上のストレージ・デバイス・ロケーションにおいて、前記現在の行バージョン・レコードに前記トランザクション・カウンタ番号をスタンプし、そのため、前記トランザクション番号が前記トランザクション識別子と同一であり、前記シーケンス番号が前記現在のシーケンス番号と同一である場合に、前記現在の行バージョン・レコードはコミットされる、ステップ;
を行うシステム。
(具体例33)
前記行識別子が前記トランザクション識別子に等しくないトランザクション番号を有する場合、又は前記行識別子が前記トランザクション識別子に等しいトランザクション番号を有し且つ前記シーケンス番号が前記現在のシーケンス番号以上である場合に、前記サーバー・システムは前記レコードにおける次の行バージョンに移動する、具体例32に記載のシステム。
(具体例34)
前記少なくとも1つのサーバー・システムにおいて前記行ロック・レコードのうちの1つが同時ルックアップ動作によりスタンプされていない場合に、前記サーバー・システムによる前記スタンプが生じる、具体例32に記載のシステム。
(具体例35)
前記トランザクション番号が前記トランザクション識別子と同一であり、前記シーケンス番号が前記行ロック・レコードのうちの1つに対する現在のシーケンス番号と同一である場合に、前記サーバー・システムは、前記行ロック・レコードのうちの1つを、前記1つ以上のストレージ・デバイス・ロケーションから除外する、具体例32に記載のシステム。
(具体例36)
前記1つ以上のストレージ・デバイス・ロケーションの前記行バージョン・レコードのうちの1つが、同時ルックアップ動作によりスタンプされていない場合に、前記サーバー・システムによる前記スタンプが生じる、具体例32に記載のシステム。
(具体例37)
前記サーバー・システムは、以前のシーケンス番号が存在するか否かを判断する、具体例32に記載のシステム。
(具体例38)
前記サーバー・システムは、以前のキー・ハッシュ値に前記現在のキー・ハッシュ値を設定し、前記現在のシーケンス番号を前記以前のシーケンス番号に設定し、キー・バケットをアンラッチし、前記ラッチは、前記1つ以上のストレージ・デバイス・ロケーションにおける前記レコード・チェーンに対するアクセスを制御する、具体例37に記載のシステム。
(具体例39)
前記以前のシーケンス番号が末端値に達した場合に、前記サーバー・システムは、前記1つ以上のストレージ・デバイス・ロケーションにおける前記レコード・チェーンのレビューをストップする、具体例37に記載のシステム。
(具体例40)
前記サーバー・システムは、トランザクション識別子をハッシュし、前記トランザクション識別子をハッシュすることからの任意のハッシュ衝突を解決する、具体例32に記載のシステム。
(具体例41)
前記サーバー・システムは、前記トランザクション識別子のダイレクト・ルックアップを実行する、具体例32に記載のシステム。
(具体例42)
ソフトウェア・インスタンスに対する複数のテナントのディジタル・データを管理するサーバー・システムであって、各々のテナントは、アプリケーションのソフトウェア・インスタンスに対する特定の一組の特権を有する共通アクセスを共有するユーザーのグループを含み、各々のインスタンスは、互いに通信するサーバー・システムの複数のインスタンス・ノードのうちの少なくとも1つで実現され、前記管理することは、前記サーバー・システムに通信可能に結合される1つ以上のストレージ・デバイス・ロケーションで、データベースのテーブルにおける1つ以上の行の識別子を含むキーにより識別されるレコードとして保存され得る前記ディジタル・データの異なるインスタンスのマルチバージョン同時制御を管理することを含み、トランザクションは1つ以上のクエリに対して認識可能であり、前記サーバー・システムは:
前記キーをハッシュするステップ;
前記キーに対するキー・ハッシュ・バケットをラッチし、ハッシュすることからの任意の衝突を解決するステップ;
スナップショット・トランザクション・カウンタ番号、キーの自己識別番号、及びコマンド識別ステートメントに基づいて、最新の認識可能な行バージョン・レコードを決定するために、前記1つ以上のストレージ・デバイス・ロケーションにおいてレコードについてのキーの行バージョン・チェーンをサーチするステップ;
レコードの行バージョン・チェーンの行がアンコミットされているか否かを判断するステップ;
前記行がアンコミットされている場合、情報を識別する前記トランザクション・ヘッダから、トランザクション・カウンタ番号値を読み込むステップ;及び
前記トランザクション・カウンタ番号と同じ行トランザクション・カウンタを有することにより、前記トランザクション・カウンタ番号が有効である場合に、現在の行バージョン・レコードに前記トランザクション・カウンタ番号をスタンプし、前記現在の行バージョン・レコードを、コミットされているものとしてマークするステップ;
を行うサーバー・システム。
(具体例43)
前記サーバー・システムは、前記行バージョン・レコードがマルチバージョン同時制御(MVCC)に対して認識可能であるか否かを判断し、前記行バージョン・レコードが前記MVCCに対して認識可能である場合に、前記サーチをストップする、具体例42に記載のシステム。
(具体例44)
前記サーバー・システムは、前記行バージョン・レコードがマルチバージョン同時制御(MVCC)に対して認識可能であるか否かを判断し、存在する場合には次の行バージョン・レコードに進み、又は前記サーチをストップする、具体例42に記載のシステム。