(57)【特許請求の範囲】
【請求項１】
アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶するグループ情報記憶部と、
前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶部により記憶されている情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定部と、
前記グループ特定部により特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するとともに、前記ログを更新する際に、ＣＡＳ（Compare and Swap）命令を用いて更新するログ管理部と、
前記ログ管理部により管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新部と、
を備え、
前記ログおよび前記レコードは、物理的に複数の記憶領域から構成されるＫＶＳ（Key-Value Store）に格納される、ことを特徴とするトランザクション処理装置。
【請求項２】
前記データ更新部は、前記レコードを更新する際に、ＣＡＳ命令を用いて更新する、ことを特徴とする請求項１記載のトランザクション処理装置。
【請求項３】
アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶させるグループ情報記憶ステップと、
前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶ステップにおいて記憶された情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定ステップと、
前記グループ特定ステップにおいて特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するとともに、前記ログを更新する際に、ＣＡＳ（Compare and Swap）命令を用いて更新するログ管理ステップと、
前記ログ管理ステップにおいて管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新ステップと、
を含み、
前記ログおよび前記レコードは、物理的に複数の記憶領域から構成されるＫＶＳ（Key-Value Store）に格納される、ことを特徴とするトランザクション処理方法。
【請求項４】
請求項３に記載の各ステップをコンピュータに実行させるためのトランザクション処理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、トランザクション処理装置、トランザクション処理方法およびトランザクション処理プログラムに関する。
【背景技術】
【０００２】
近年、スケーラブルなＷｅｂアプリケーションの実行基盤として、データセンター内の多数のコンピュータを用いる、いわゆるクラウドが注目されている。このクラウドのインフラストラクチャの一つとして、Ｋｅｙ−Ｖａｌｕｅ Ｓｔｏｒｅ(以下、「ＫＶＳ」と記載する)が知られている。ＫＶＳは、キーと値とのペアで構成されるレコードを管理するデータベースである。特許文献１には、ＫＶＳを有するコンピュータシステムが開示されている。このコンピュータシステムでは、ＫＶＳを、サーバにあるデータベースのデータをキャッシュするためのキャッシュ装置として用いている。特許文献２には、ＫＶＳを有するデータベースシステムが開示されている。このデータベースシステムでは、ＫＶＳのデータ間に属性関係を持たせてデータを結合する仕組みが開示されている。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１１−８４５１号公報
【特許文献２】特開２０１１−１３９２３号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
ところで、ＫＶＳでは、単一のレコードに対するデータ操作についてはアトミック性がサポートされている。したがって、ＫＶＳを用いてトランザクション処理を実行する場合に、アトミック性を担保しようとすると、単一のレコードごとにトランザクション処理を実行することになるため、処理効率が低下してしまう。
【０００５】
本発明は、上述した課題を解決するためになされたものであり、キーと値とのペアで構成されるレコードを管理する環境下でトランザクション処理を実行する場合であっても、複数のレコードに対するトランザクション処理を行うことができるトランザクション処理装置、トランザクション処理方法およびトランザクション処理プログラムを提供することを目的の一例とする。
【課題を解決するための手段】
【０００６】
本発明の一側面であるトランザクション処理装置は、アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶するグループ情報記憶部と、前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶部により記憶されている情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定部と、前記グループ特定部により特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するログ管理部と、前記ログ管理部により管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新部と、を備える。
【０００７】
本発明の一側面であるトランザクション処理方法は、アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶させるグループ情報記憶ステップと、前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶ステップにおいて記憶された情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定ステップと、前記グループ特定ステップにおいて特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するログ管理ステップと、前記ログ管理ステップにおいて管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新ステップと、を含む。
【０００８】
本発明の一側面であるトランザクション処理プログラムは、上記トランザクション処理方法に含まれる各ステップをコンピュータに実行させる。
【発明の効果】
【０００９】
本発明によれば、キーと値とのペアで構成されるレコードを管理する環境下でトランザクション処理を実行する場合であっても、複数のレコードに対するトランザクション処理を行うことができる。
【図面の簡単な説明】
【００１０】
【図１】実施形態におけるトランザクション処理装置の構成を例示する図である。
【図２】商品テーブルのデータ構成を例示する図である。
【図３】入札テーブルのデータ構成を例示する図である。
【図４】商品情報テーブルのデータ構成を例示する図である。
【図５】（Ａ）、（Ｂ）、（Ｃ）は、グループ構成の一例を説明するための図である。
【図６】（Ａ）、（Ｂ）、（Ｃ）は、グループ構成の一例を説明するための図である。
【図７】（Ａ）、（Ｂ）、（Ｃ）は、グループ構成の一例を説明するための図である。
【図８】トランザクション処理装置の動作を説明するためのフローチャートである。
【図９】グループ情報を登録する際の動作を説明するためのシーケンスチャートである。
【図１０】トランザクションがＫＶＳのデータを更新する際の動作の一例を説明するためのシーケンスチャートである。
【図１１】トランザクションがＫＶＳのデータを更新する際の動作の一例を説明するためのシーケンスチャートである。
【図１２】トランザクションがＫＶＳのデータを更新する際の動作の一例を説明するためのシーケンスチャートである。
【図１３】トランザクションがＫＶＳのデータを更新する際の動作の一例を説明するためのシーケンスチャートである。
【図１４】トランザクションがＫＶＳのデータを更新する際の動作の一例を説明するためのシーケンスチャートである。
【図１５】変形例におけるトランザクション処理装置の構成を例示する図である。
【発明を実施するための形態】
【００１１】
以下、添付図面を参照して、本発明に係るトランザクション処理装置、トランザクション処理方法およびトランザクション処理プログラムの好適な実施形態について説明する。
【００１２】
実施形態を説明する前に、ＷＡＬ（Write Ahead Logging）について説明する。ＷＡＬは、一般的なリレーショナルデータベースシステムにおけるトランザクション処理手法の一つであり、データベースに対してデータを変更する前に、変更内容をログ（トランザクションログ）に書き出す手法である。ＷＡＬは、アトミック性を確保して実行され、ログを永続的な記憶装置に書き込むという特徴を有する。このようなＷＡＬをトランザクション処理に採用することで、トランザクションのＡＣＩＤ（Atomicity Consistency Isolation Durability）特性のうち、“Ａ（Atomicity）”と“Ｄ（Durability）”とを実現できる。ＷＡＬを採用するトランザクション処理では、２種類のデータを更新することになる。一つはログの更新であり、もう一つは実データの更新である。これら２種類のデータは、永続的な記憶装置に書き込まれるタイミングが異なる。ログは、トランザクションのコミット時に書き込まれ、実データは、チェックポイント時に書き込まれる。実データをチェックポイント時に書き込むことで、永続的な記憶装置として一般的に用いられる低速なハードディスクへのアクセス回数を減らすことができる。
【００１３】
本願発明は、このようなＷＡＬを、ＫＶＳを用いてトランザクション処理を行う環境に採用し、以下に記載する各種の仕組みを加えることで、複数のレコードに対するトランザクション処理を可能とした。以下に、このような特徴を有する本願発明の実施形態について説明する。
【００１４】
まず、図１を参照して、実施形態におけるトランザクション処理装置の機能構成について説明する。トランザクション処理装置１０は、機能的には、例えば、グループ生成部１１と、トランザクション処理部１２と、データ更新部１３とを有する。
【００１５】
ここで、トランザクション処理装置１０は、物理的には、例えば、ＣＰＵ（Central Processing Unit）と、記憶装置と、入出力インターフェースとを含んで構成される。記憶装置には、例えば、ＣＰＵで処理されるプログラムおよびデータを記憶するＲＯＭ（Read Only Memory）やＨＤＤ（Hard Disk Drive）、主として制御処理のための各種作業領域として使用されるＲＡＭ（Random Access Memory）等が含まれる。これらの要素は、互いにバスを介して接続されている。ＣＰＵが、ＲＯＭに記憶されたプログラムを実行し、入出力インターフェースを介して受信される命令や、ＲＡＭに展開されるデータを処理することで、トランザクション処理装置１０における各部の機能を実現することができる。
【００１６】
図１に示すグループ生成部１１は、アプリケーションにより実行される一または複数のトランザクションごとに、トランザクションで使用されるレコードを論理的にまとめることで、グループを生成する。より詳細には、以下のようにしてグループを生成する。
【００１７】
最初に、グループ生成部１１は、アプリケーションからトランザクションに関する情報を受信する。続いて、グループ生成部１１は、トランザクションに関する情報およびシステムカタログ１８に記憶されている情報を参照し、対象トランザクションで使用される全てのレコードに共通するユニークキーを選定する。続いて、グループ生成部１１は、選定したユニークキーの属性値別にレコードを論理的にまとめることで、グループを生成する。システムカタログ１８には、ＫＶＳ２０に格納されているデータのメタ情報が記憶されている。ＫＶＳ２０は、単一レコードに対する操作のアトミック性と、単一レコードに対するＣＡＳ（Compare and Swap）命令とを備えるデータベースである。ＫＶＳ２０は、複数のサーバ装置に分散して構築される。
【００１８】
グループ生成部１１は、生成したグループに関する情報と、受信したトランザクションに関する情報とを含むグループ情報を、グループ情報記憶部１９に登録する。グループ情報記憶部１９は、トランザクションに関する情報とグループに関する情報とを対応付けて記憶する。
【００１９】
グループに関する情報は、必ずしもグループに属する各レコードの値を含む必要はなく、例えば、ユニークキーの属性値と、グループを構成するテーブルのメタ情報とが含まれていればよい。ユニークキーの属性値とテーブルのメタ情報とが得られれば、ＫＶＳ２０から対象となるレコードを抽出することができるためである。
【００２０】
図２〜図７を参照して、グループ生成部１１が生成するグループについて具体的に説明する。
【００２１】
ここでは、トランザクションとして、以下のトランザクション１とトランザクション２とを用いて説明する。トランザクション１は、「ユーザが新たに入札を行ったときに、商品テーブルおよび入札テーブルのデータを更新する」処理を実行する。トランザクション２は、「商品が売却されたときに、在庫数を更新する」処理を実行する。また、トランザクションで使用されるデータを格納するテーブルとして、図２に示す商品テーブルＴ１と、図３に示す入札テーブルＴ２と、図４に示す商品情報テーブルＴ３とを用いて説明する。
【００２２】
グループ生成部１１は、トランザクション１に対応するグループを以下のように生成する。最初に、グループ生成部１１は、トランザクション１で使用されるデータが、商品テーブルＴ１および入札テーブルＴ２に格納されているデータであることを特定する。続いて、グループ生成部１１は、各データを含むレコードに共通するユニークキーとして、商品ＩＤを選定する。続いて、グループ生成部１１は、各レコードを商品ＩＤの属性値別に論理的にまとめる。この結果、グループ生成部１１は、図５（Ａ）〜（Ｃ）に示す三つのグループＧ１〜Ｇ３を生成する。なお、トランザクション１は、三つのグループＧ１〜Ｇ３のいずれか一つのグループのみにアクセスし、同時に複数のグループにアクセスすることはない。
【００２３】
グループ生成部１１は、トランザクション２に対応するグループを以下のように生成する。最初に、グループ生成部１１は、トランザクション２で使用されるデータが、商品テーブルＴ１および商品情報テーブルＴ３に格納されているデータであることを特定する。続いて、グループ生成部１１は、各データを含むレコードに共通するユニークキーとして、商品ＩＤを選定する。続いて、グループ生成部１１は、各レコードを商品ＩＤの属性値別に論理的にまとめる。この結果、グループ生成部１１は、図６（Ａ）〜（Ｃ）に示す三つのグループＧ４〜Ｇ６を生成する。なお、トランザクション２は、三つのグループＧ４〜Ｇ６のいずれか一つのグループのみにアクセスし、同時に複数のグループにアクセスすることはない。
【００２４】
ここで、グループＧ１とグループＧ４、グループＧ２とグループＧ５、グループＧ３とグループＧ６には、それぞれ同一のレコードが含まれている。このような場合に、トランザクション１とトランザクション２とが同時に実行されると、データ更新時にデータの不整合が生じ得る。この不整合を回避するためには、トランザクション１とトランザクション２との双方で使用されるデータを同じグループにまとめる必要がある。
【００２５】
具体的に、グループ生成部１１は、トランザクション１およびトランザクション２の双方に対応するグループとして、図７（Ａ）〜（Ｃ）に示す三つのグループＧ７〜Ｇ９を生成する。つまり、グループ生成部１１は、各グループ間でレコードが重複することがないように、商品ＩＤの属性値別にグループを生成する。なお、トランザクション１およびトランザクション２は、三つのグループＧ７〜Ｇ９のいずれか一つのグループのみにアクセスし、同時に複数のグループにアクセスすることはない。
【００２６】
ここで、本実施形態におけるログは、同一グループに属する各レコードの最新の内容を保持し、実際のレコードとは別にＫＶＳ２０に格納される。ＫＶＳ２０は、複数のサーバ装置に分散して構築されるが、一つのログは、その内容が複数のサーバ装置に分散して格納されるのではなく、いずれか一つのサーバ装置にまとめて格納される。つまり、グループ単位に生成されるログは、その内容の全てをまとめて物理的に同一の記憶領域内に格納される。
【００２７】
ログは、実際のレコードと同様に、キーと値とのペアで構成される。例えば、図５に示すグループＧ１に対応するログは、以下のように生成される。
【００２８】
ＷＡＬ１ ＝ （ｋｅｙ， ｖａｌｕｅ） ＝ （ＷＡＬ_ｉ１， ［｛ｉ１，ＡＡＡ，１０，５，１００００｝，｛ｂ１，ｉ１，ｕ３，９０００｝，｛ｂ２，ｉ１，ｕ１，１００００｝，ｖｅｒｓｉｏｎ］）
【００２９】
ここで、“ＷＡＬ１”は、ログを一意に特定する識別コードである。“ＷＡＬ１”の“ｋｅｙ”を構成する“ＷＡＬ_ｉ１”は、ＷＡＬのログであることを示す識別子に、ユニークキー（商品ＩＤ）の属性値である“ｉ１”を付加して表したものである。“ＷＡＬ１”の“ｖａｌｕｅ”を構成する“｛ｉ１，ＡＡＡ，１０，５，１００００｝，｛ｂ１，ｉ１，ｕ３，９０００｝，｛ｂ２，ｉ１，ｕ１，１００００｝”は、グループＧ１に含まれる各レコードの値である。“ＷＡＬ１”の“ｖａｌｕｅ”を構成する“ｖｅｒｓｉｏｎ”には、現在の“ＷＡＬ１”のバージョンを示す値が格納される。ログを新たに生成したときに、“ｖｅｒｓｉｏｎ”に“１”が格納される。ログを更新したときに、“ｖｅｒｓｉｏｎ”に格納されている値がインクリメントされる。
【００３０】
同様にして、図５に示すグループＧ２およびＧ３に対応するログは、それぞれ以下のように生成される。
【００３１】
ＷＡＬ２ ＝ （ｋｅｙ， ｖａｌｕｅ） ＝ （ＷＡＬ_ｉ２， ［｛ｉ２，ＢＢＢ，３，７，８０００｝，｛ｂ４，ｉ２，ｕ１，８０００｝，ｖｅｒｓｉｏｎ］）
【００３２】
ＷＡＬ３ ＝ （ｋｅｙ， ｖａｌｕｅ） ＝ （ＷＡＬ_ｉ３， ［｛ｉ３，ＣＣＣ，５，３，３０００｝，｛ｂ３，ｉ３，ｕ２，３０００｝，｛ｂ５，ｉ３，ｕ３，２５００｝，ｖｅｒｓｉｏｎ］）
【００３３】
図１に示すトランザクション処理部１２は、アプリケーションから受信する処理要求にしたがって処理を実行する。処理要求には、例えば、クエリが含まれる。トランザクション処理部１２は、グループ特定部１２１と、ログ管理部１２２とを含む。
【００３４】
グループ特定部１２１は、アプリケーションからクエリを受信した場合に、クエリに対応するトランザクションに基づいてグループ情報記憶部１９を参照し、そのトランザクションに対応するグループを特定する。上記クエリに対応するトランザクションは、クエリによる一連の処理がどのトランザクションに属しているのかを特定することで得られる。
【００３５】
ログ管理部１２２は、グループ特定部１２１により特定されたグループのログを、ｇｅｔ命令やＣＡＳ命令等のＫＶＳコマンドを実行して管理する。以下に、具体的に説明する。
【００３６】
ログ管理部１２２は、トランザクション処理を開始するためのｂｅｇｉｎ命令をアプリケーションから受信した場合には、トランザクションで使用されるレコードのログを取得するためのｇｅｔ命令をＫＶＳ２０に送信し、ログを取得する。ログ管理部１２２は、取得したログに含まれる“ｖｅｒｓｉｏｎ”の値を一時的に記憶する。ここで、トランザクションで使用されるレコードのログがＫＶＳ２０に存在しない場合に、ログ管理部１２２は、以下の処理を実行する。
【００３７】
最初に、ログ管理部１２２は、トランザクションで使用されるレコードを取得するためのｇｅｔ命令をＫＶＳ２０に送信し、レコードを取得する。続いて、ログ管理部１２２は、取得したレコードに対応するログを生成するためのｃｒｅａｔｅ命令をＫＶＳ２０に送信し、ＫＶＳ２０にログを生成する。続いて、ログ管理部１２２は、トランザクションで使用されるレコードのログを取得するためのｇｅｔ命令をＫＶＳ２０に送信し、ログを取得する。続いて、ログ管理部１２２は、取得したログに含まれる“ｖｅｒｓｉｏｎ”の値を一時的に記憶する。
【００３８】
なお、ＫＶＳ２０にログを生成する際に、他のトランザクションによって既にログが生成されている場合には、ログの生成を失敗とし、他のトランザクションによって生成されたログを取得し直せばよい。
【００３９】
ログ管理部１２２は、クエリをアプリケーションから受信した場合には、ＫＶＳ２０から取得したログに含まれる各レコードの値を、クエリの内容に応じて更新する。ログ管理部１２２は、各レコードの更新が終了した後に、ログに含まれる“ｖｅｒｓｉｏｎ”の値をインクリメントする。ログ管理部１２２は、更新処理の結果をアプリケーションに応答する。
【００４０】
ログ管理部１２２は、更新を確定するためのｃｏｍｍｉｔ命令をアプリケーションから受信した場合には、ＣＡＳ命令を用いてＫＶＳ２０のログを更新する。ＣＡＳ命令による更新は、以下の手順で実行される。
【００４１】
最初に、ログ管理部１２２は、ＫＶＳ２０に記憶されているログの“ｖｅｒｓｉｏｎ”の値と、上記一時的に記憶した“ｖｅｒｓｉｏｎ”の値とを比較する。続いて、ログ管理部１２２は、比較した“ｖｅｒｓｉｏｎ”の値が同じである場合に、ＫＶＳ２０のログを更新し、ログの書き込みを成功とする。一方、ログ管理部１２２は、比較した“ｖｅｒｓｉｏｎ”の値が異なる場合には、ＫＶＳ２０のログを更新せずに、ログの書き込みを失敗とする。ログ管理部１２２は、ＣＡＳ命令の結果をアプリケーションに応答する。
【００４２】
ログを更新する際にＣＡＳ命令を用いることで、以下の理由により、ログデータの一貫性を保持することができる。まず、比較した“ｖｅｒｓｉｏｎ”の値が同じである場合には、他のトランザクションがそのログを更新していないことを意味する。したがって、この場合には、ログを更新してもデータの一貫性が保持されることになる。一方、比較した“ｖｅｒｓｉｏｎ”の値が異なる場合には、そのトランザクションがレコードを更新している間に他のトランザクションがログを更新したことを意味する。したがって、この場合には、ログの更新を中止することでデータの一貫性が保持されることになる。
【００４３】
ログ管理部１２２は、トランザクション処理を終了するためのｅｎｄ命令をアプリケーションから受信した場合には、ログの内容をレコードに反映させるためのｒｅｆｌｅｃｔ命令をデータ更新部１３に送信する。このｒｅｆｌｅｃｔ命令には、ログの“ｋｅｙ”の値と、ログ管理部１２２がそのログを更新したときの“ｖｅｒｓｉｏｎ”の値とが含まれる。
【００４４】
データ更新部１３は、ｒｅｆｌｅｃｔ命令を受信した場合に、ＣＡＳ命令を用いてＫＶＳ２０のレコードをＫＶＳ２０のログの内容で更新するとともに、そのログをＫＶＳ２０から削除する。より詳細には、以下のように更新する。
【００４５】
最初に、データ更新部１３は、ｒｅｆｌｅｃｔ命令に含まれる“ｋｅｙ”の値に対応するログをＫＶＳ２０から取得する。続いて、データ更新部１３は、取得したログに含まれる“ｖｅｒｓｉｏｎ”の値と、ｒｅｆｌｅｃｔ命令に含まれる“ｖｅｒｓｉｏｎ”の値とを比較する。続いて、データ更新部１３は、比較した“ｖｅｒｓｉｏｎ”の値が同じである場合には、ログに含まれる各レコードの値を、対応するＫＶＳ２０の各レコードに反映して更新する。そして、データ更新部１３は、そのログをＫＶＳ２０から削除する。一方、データ更新部１３は、比較した“ｖｅｒｓｉｏｎ”の値が異なる場合には、ログの反映を実行しない。
【００４６】
レコードを更新する際にＣＡＳ命令を用いることで、以下の理由により、データの一貫性を保持することができる。まず、比較した“ｖｅｒｓｉｏｎ”の値が同じである場合には、他のトランザクションがそのログを更新していないことを意味する。したがって、この場合には、そのログでレコードを更新してもデータの一貫性が保持されることになる。一方、比較した“ｖｅｒｓｉｏｎ”の値が異なる場合には、そのトランザクションが終了してからレコードを更新するまでの間に、他のトランザクションがログを更新したことを意味する。したがって、この場合には、ログの反映を中止することでデータの一貫性が保持されることになる。この場合には、他のトランザクションの動作シーケンスでログの反映および削除を実行すればよい。
【００４７】
次に、図８を参照して、トランザクション処理装置１０の動作について説明する。
【００４８】
システムが稼動する前に、アプリケーションからトランザクションに関する情報が入力されると、グループ生成部１１は、各トランザクションで使用されるレコードをユニークキーの属性値別に論理的にまとめてグループを生成する（ステップＳ１０１）。
【００４９】
続いて、グループ生成部１１は、グループに関する情報とトランザクションに関する情報とを含むグループ情報をグループ情報記憶部１９に登録する（ステップＳ１０２）。
【００５０】
その後、システムが稼動した後に、トランザクション処理部１２は、アプリケーションからクエリを受信する（ステップＳ１０３）。
【００５１】
続いて、グループ特定部１２１は、受信したクエリに対応するトランザクションに基づいて、グループ情報記憶部１９を参照し、処理対象となるグループを特定する（ステップＳ１０４）。
【００５２】
続いて、ログ管理部１２２は、特定したグループに対応するログがＫＶＳ２０に存在するか否かを判定する（ステップＳ１０５）。この判定がＮＯである場合（ステップＳ１０５；ＮＯ）に、ログ管理部１２２は、グループに対応するレコードをＫＶＳ２０から取得し、取得したレコードでログを生成し、ＫＶＳ２０に書き込む（ステップＳ１０６）。そして、処理を後述するステップＳ１０７に移行する。
【００５３】
一方、上記ステップＳ１０５の判定でグループに対応するログがＫＶＳ２０に存在すると判定された場合（ステップＳ１０５；ＹＥＳ）に、ログ管理部１２２は、そのログをＫＶＳ２０から取得する（ステップＳ１０７）。
【００５４】
続いて、ログ管理部１２２は、取得したログの“ｖｅｒｓｉｏｎ”の値を一時的に記憶し、ログに含まれる各レコードの値をクエリに応じて更新し、“ｖｅｒｓｉｏｎ”の値をインクリメントしてからログをＫＶＳ２０に書き込む（ステップＳ１０８）。
【００５５】
続いて、ログ管理部１２２は、ログの書き込みが成功したか否かを判定する（ステップＳ１０９）。この判定がＮＯである場合（ステップＳ１０９；ＮＯ）には、本動作を終了する。
【００５６】
一方、上記ステップＳ１０９の判定でログの書き込みが成功したと判定された場合（ステップＳ１０９；ＹＥＳ）に、データ更新部１３は、ログの内容を実データであるＫＶＳ２０のレコードに反映し（ステップＳ１１０）、そのログをＫＶＳ２０から削除する。そして、本動作を終了する。
【００５７】
なお、この動作例では、説明の便宜上、グループ情報を生成して登録する処理（ステップＳ１０１〜ステップＳ１０２）を一連の動作に組み込んで説明している。しかしながら、グループ情報を生成して登録するのは、システムの稼働前に一回実行すれば足りる。したがって、実際の運用上は、システム稼働後に、上記ステップＳ１０３〜ステップＳ１１０までの各処理を一連の動作として繰り返し実行することとなる。
【００５８】
次に、図９を参照して、グループ情報を登録する際の動作について説明する。
【００５９】
最初に、アプリケーションがトランザクションに関する情報をグループ生成部１１に送信する（ステップＳ２０１）。
【００６０】
続いて、グループ生成部１１は、トランザクションに関する情報と、システムカタログ１８に記憶されているデータのメタ情報とに基づいて、グループを生成する（ステップＳ２０２）。
【００６１】
続いて、グループ生成部１１は、生成したグループに関する情報とトランザクションに関する情報とを含むグループ情報を、グループ情報記憶部１９に登録する（ステップＳ２０３）。
【００６２】
続いて、グループ生成部１１は、処理が成功したことを示す応答をアプリケーションに送信する（ステップＳ２０４）。
【００６３】
次に、図１０〜図１４を参照して、トランザクションがＫＶＳ２０のデータを更新する際の各種動作例について説明する。これらの動作例では、実行されるトランザクションが、ＫＶＳ２０に格納されているＲｅｃｏｒｄ１とＲｅｃｏｒｄ２とを更新するトランザクションである場合について説明する。
【００６４】
まず、図１０および図１１を参照して、Ｒｅｃｏｒｄ１およびＲｅｃｏｒｄ２のログが、既にＫＶＳ２０に生成されている場合の動作例について説明する。
【００６５】
最初に、アプリケーションは、トランザクション処理を開始するために、ｂｅｇｉｎ命令をトランザクション処理部１２に送信する（ステップＳ３０１）。
【００６６】
続いて、トランザクション処理部１２は、ｇｅｔ命令をＫＶＳ２０に送信し（ステップＳ３０２）、ＫＶＳ２０からログを取得する（ステップＳ３０３）。
【００６７】
続いて、トランザクション処理部１２は、取得したログに含まれる各レコードの値をクエリに応じてｕｐｄａｔｅする（ステップＳ３０４）。そして、トランザクション処理部１２は、ｕｐｄａｔｅが成功したことを示す応答をアプリケーションに送信する（ステップＳ３０５）。
【００６８】
続いて、アプリケーションは、更新を確定するために、ｃｏｍｍｉｔ命令をトランザクション処理部１２に送信する（ステップＳ３０６）。
【００６９】
続いて、トランザクション処理部１２は、ＣＡＳ命令を用いてログを更新する（ステップＳ３０７）。ＣＡＳ命令が成功する（ステップＳ３０８）と、トランザクション処理部１２は、更新が成功したことを示す応答をアプリケーションに送信する（ステップＳ３０９）。
【００７０】
続いて、アプリケーションは、トランザクション処理を終了するために、ｅｎｄ命令をトランザクション処理部１２に送信する（ステップＳ４０１）。
【００７１】
続いて、トランザクション処理部１２は、ログの内容をレコードに反映させるために、ｒｅｆｌｅｃｔ命令をデータ更新部１３に送信する（ステップＳ４０２）。
【００７２】
続いて、データ更新部１３は、ｇｅｔ命令をＫＶＳ２０に送信し（ステップＳ４０３）、ＫＶＳ２０からログを取得する（ステップＳ４０４）。
【００７３】
続いて、データ更新部１３は、トランザクション処理部１２から受信したｒｅｆｌｅｃｔ命令に含まれる“ｖｅｒｓｉｏｎ”の値と、ＫＶＳ２０から取得したログに含まれる“ｖｅｒｓｉｏｎ”の値とを比較する（ステップＳ４０５）。
【００７４】
続いて、比較した“ｖｅｒｓｉｏｎ”の値が同じである場合に、データ更新部１３は、Ｒｅｃｏｒｄ１を更新するために、ｓｅｔ命令をＫＶＳ２０に送信し（ステップＳ４０６）、ＫＶＳ２０から成功したことを示す応答を受信する（ステップＳ４０７）。
【００７５】
続いて、データ更新部１３は、Ｒｅｃｏｒｄ２を更新するために、ｓｅｔ命令をＫＶＳ２０に送信し（ステップＳ４０８）、ＫＶＳ２０から成功したことを示す応答を受信する（ステップＳ４０９）。
【００７６】
続いて、データ更新部１３は、ログを削除するために、ｄｅｌｅｔｅ命令をＫＶＳ２０に送信し（ステップＳ４１０）、ＫＶＳ２０から成功したことを示す応答を受信する（ステップＳ４１１）。
【００７７】
続いて、データ更新部１３は、レコードへの反映が成功したことを示す応答をトランザクション処理部１２に送信する（ステップＳ４１２）。そして、トランザクション処理部１２は、処理が成功したことを示す応答をアプリケーションに送信する（ステップＳ４１３）。
【００７８】
次に、図１２および図１１を参照して、Ｒｅｃｏｒｄ１およびＲｅｃｏｒｄ２のログが、ＫＶＳ２０に生成されていない場合の動作例について説明する。
【００７９】
本動作例が、上述したＲｅｃｏｒｄ１およびＲｅｃｏｒｄ２のログが既にＫＶＳ２０に生成されている場合の動作例（図１０および図１１）と異なるのは、図１０に示すステップＳ３０１の処理とステップＳ３０２の処理との間に、図１２に示すステップＳ５０２〜ステップＳ５０６までの処理が追加される点である。以下においては、主に追加した処理について説明する。
【００８０】
最初に、アプリケーションは、トランザクション処理を開始するために、ｂｅｇｉｎ命令をトランザクション処理部１２に送信する（ステップＳ５０１）。
【００８１】
続いて、トランザクション処理部１２は、ｇｅｔ命令をＫＶＳ２０に送信し（ステップＳ５０２）、ＫＶＳ２０からＲｅｃｏｒｄ１を取得する（ステップＳ５０３）。
【００８２】
続いて、トランザクション処理部１２は、ｇｅｔ命令をＫＶＳ２０に送信し（ステップＳ５０４）、ＫＶＳ２０からＲｅｃｏｒｄ２を取得する（ステップＳ５０５）。
【００８３】
続いて、トランザクション処理部１２は、Ｒｅｃｏｒｄ１およびＲｅｃｏｒｄ２のログを生成するために、ｃｒｅａｔｅ命令をＫＶＳ２０に送信する（ステップＳ５０６）。
【００８４】
続いて、トランザクション処理部１２は、ｇｅｔ命令をＫＶＳ２０に送信し（ステップＳ５０７）、ＫＶＳ２０からログを取得する（ステップＳ５０８）。
【００８５】
続いて、トランザクション処理部１２は、取得したログに含まれる各レコードの値をクエリに応じてｕｐｄａｔｅする（ステップＳ５０９）。そして、ログ管理部１２２は、ｕｐｄａｔｅが成功したことを示す応答をアプリケーションに送信する（ステップＳ５１０）。
【００８６】
これ以降のステップＳ５１１〜ステップＳ５１４までの各処理は、上述した図１０のステップＳ３０６〜ステップＳ３０９までの各処理と同様であるため、説明を省略する。また、ステップＳ５１４に続いて行われる、図１１のステップＳ４０１〜ステップＳ４１３までの各処理については、既に上記で説明した通りであるため、説明を省略する。
【００８７】
次に、図１３を参照して、ｃｏｍｍｉｔ命令が失敗した場合の動作例について説明する。なお、ステップＳ６０１〜ステップＳ６０５までの各処理については、上述した図１０に示すステップＳ３０１〜ステップＳ３０５までの各処理と同様であるため、説明を省略する。
【００８８】
ステップＳ６０５でｕｐｄａｔｅが成功すると、アプリケーションは、更新を確定するために、ｃｏｍｍｉｔ命令をトランザクション処理部１２に送信する（ステップＳ６０６）。
【００８９】
続いて、トランザクション処理部１２は、ＣＡＳ命令を用いてログを更新する（ステップＳ６０７）。ＣＡＳ命令が失敗する（ステップＳ６０８）と、トランザクション処理部１２は、更新が失敗したことを示す応答をアプリケーションに送信する（ステップＳ６０９）。
【００９０】
次に、図１４を参照して、ログの実データへの反映が失敗した場合の動作例について説明する。なお、ステップＳ７０１〜ステップＳ７０９までの各処理については、上述した図１０に示すステップＳ３０１〜ステップＳ３０９までの各処理と同様であるため、説明を省略する。
【００９１】
ステップＳ７０９でｃｏｍｍｉｔが成功すると、アプリケーションは、トランザクション処理を終了するために、ｅｎｄ命令をトランザクション処理部１２に送信する（ステップＳ７１０）。
【００９２】
続いて、トランザクション処理部１２は、ログの内容をレコードに反映させるために、ｒｅｆｌｅｃｔ命令をデータ更新部１３に送信する（ステップＳ７１１）。
【００９３】
続いて、データ更新部１３は、ｇｅｔ命令をＫＶＳ２０に送信し（ステップＳ７１２）、ＫＶＳ２０からログを取得する（ステップＳ７１３）。
【００９４】
続いて、データ更新部１３は、トランザクション処理部１２から受信したｒｅｆｌｅｃｔ命令に含まれる“ｖｅｒｓｉｏｎ”の値と、ＫＶＳ２０から取得したログに含まれる“ｖｅｒｓｉｏｎ”の値とを比較する（ステップＳ７１４）。
【００９５】
続いて、比較した“ｖｅｒｓｉｏｎ”の値が異なる場合に、データ更新部１３は、レコードへの反映が失敗したことを示す応答をトランザクション処理部１２に送信する（ステップＳ７１５）。そして、トランザクション処理部１２は、処理が失敗したことを示す応答をアプリケーションに送信する（ステップＳ７１６）。
【００９６】
上述したように、実施形態におけるトランザクション処理装置１０によれば、トランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値ごとに論理的にまとめてグループを生成することができる。また、実行されたトランザクションに対応する同一グループに属するレコードのログを、重複することなく物理的に同一の記憶領域内にまとめて格納して管理することができる。さらに、管理されているログの内容を、物理的に分散する記憶領域内に格納されているレコードに反映して実データを更新することができる。
【００９７】
それゆえに、ＫＶＳを用いてトランザクション処理を実行する場合であっても、複数のレコードに対するトランザクション処理を行うことができる。
【００９８】
なお、上述した実施形態は、単なる例示に過ぎず、実施形態に明示していない種々の変形や技術の適用を排除するものではない。すなわち、本発明は、その趣旨を逸脱しない範囲で様々な形態に変形して実施することができる。
【００９９】
例えば、上述した実施形態におけるトランザクション処理装置１０（図１参照）は、グループ生成部１１およびシステムカタログ１８を備えているが、これに限定されない。図１５に示すように、トランザクション処理装置１０は、トランザクション処理部１２、データ更新部１３およびグループ情報記憶部１９を備えることとしてもよい。この場合には、外部装置で生成されたグループ情報が、グループ情報記憶部１９に格納されていればよい。
【０１００】
また、上述した実施形態の一部または全部は、以下の付記のようにも記載され得るが、本発明は以下に限定されない。
【０１０１】
（付記１）  アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶するグループ情報記憶部と、前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶部により記憶されている情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定部と、前記グループ特定部により特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するログ管理部と、前記ログ管理部により管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新部と、を備えることを特徴とするトランザクション処理装置。
【０１０２】
（付記２）  前記ログおよび前記レコードは、物理的に複数の記憶領域から構成されるＫＶＳ（Key-Value Store）に格納される、ことを特徴とする請求項１記載のトランザクション処理装置。
【０１０３】
（付記３）  前記ログ管理部は、前記ログを更新する際に、ＣＡＳ（Compare and Swap）命令を用いて更新する、ことを特徴とする請求項２記載のトランザクション処理装置。
【０１０４】
（付記４）  前記データ更新部は、前記レコードを更新する際に、ＣＡＳ命令を用いて更新する、ことを特徴とする請求項３記載のトランザクション処理装置。
【０１０５】
（付記５）  アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶させるグループ情報記憶ステップと、前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶ステップにおいて記憶された情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定ステップと、前記グループ特定ステップにおいて特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するログ管理ステップと、前記ログ管理ステップにおいて管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新ステップと、を含むことを特徴とするトランザクション処理方法。
【０１０６】
（付記６）  請求項５に記載の各ステップをコンピュータに実行させるためのトランザクション処理プログラム。
【符号の説明】
【０１０７】
１０…トランザクション処理装置、１１…グループ生成部、１２…トランザクション処理部、１３…データ更新部、１８…システムカタログ、１９…グループ情報記憶部、１２１…グループ特定部、１２２…ログ管理部。
【図１】
0005807777.tif 000002
【図２】
0005807777.tif 000003
【図３】
0005807777.tif 000004
【図４】
0005807777.tif 000005
【図５】
0005807777.tif 000006
【図６】
0005807777.tif 000007
【図７】
0005807777.tif 000008
【図８】
0005807777.tif 000009
【図９】
0005807777.tif 000010
【図１０】
0005807777.tif 000011
【図１１】
0005807777.tif 000012
【図１２】
0005807777.tif 000013
【図１３】
0005807777.tif 000014
【図１４】
0005807777.tif 000015
【図１５】
0005807777.tif 000016