(58)【調査した分野】(Int.Cl.,DB名)
アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶するグループ情報記憶部と、
前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶部により記憶されている情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定部と、
前記グループ特定部により特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するとともに、前記ログを更新する際に、CAS(Compare and Swap)命令を用いて更新するログ管理部と、
前記ログ管理部により管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新部と、
を備え、
前記ログおよび前記レコードは、物理的に複数の記憶領域から構成されるKVS(Key-Value Store)に格納される、ことを特徴とするトランザクション処理装置。
アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶させるグループ情報記憶ステップと、
前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶ステップにおいて記憶された情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定ステップと、
前記グループ特定ステップにおいて特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するとともに、前記ログを更新する際に、CAS(Compare and Swap)命令を用いて更新するログ管理ステップと、
前記ログ管理ステップにおいて管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新ステップと、
を含み、
前記ログおよび前記レコードは、物理的に複数の記憶領域から構成されるKVS(Key-Value Store)に格納される、ことを特徴とするトランザクション処理方法。
【発明を実施するための形態】
【0011】
以下、添付図面を参照して、本発明に係るトランザクション処理装置、トランザクション処理方法およびトランザクション処理プログラムの好適な実施形態について説明する。
【0012】
実施形態を説明する前に、WAL(Write Ahead Logging)について説明する。WALは、一般的なリレーショナルデータベースシステムにおけるトランザクション処理手法の一つであり、データベースに対してデータを変更する前に、変更内容をログ(トランザクションログ)に書き出す手法である。WALは、アトミック性を確保して実行され、ログを永続的な記憶装置に書き込むという特徴を有する。このようなWALをトランザクション処理に採用することで、トランザクションのACID(Atomicity Consistency Isolation Durability)特性のうち、“A(Atomicity)”と“D(Durability)”とを実現できる。WALを採用するトランザクション処理では、2種類のデータを更新することになる。一つはログの更新であり、もう一つは実データの更新である。これら2種類のデータは、永続的な記憶装置に書き込まれるタイミングが異なる。ログは、トランザクションのコミット時に書き込まれ、実データは、チェックポイント時に書き込まれる。実データをチェックポイント時に書き込むことで、永続的な記憶装置として一般的に用いられる低速なハードディスクへのアクセス回数を減らすことができる。
【0013】
本願発明は、このようなWALを、KVSを用いてトランザクション処理を行う環境に採用し、以下に記載する各種の仕組みを加えることで、複数のレコードに対するトランザクション処理を可能とした。以下に、このような特徴を有する本願発明の実施形態について説明する。
【0014】
まず、
図1を参照して、実施形態におけるトランザクション処理装置の機能構成について説明する。トランザクション処理装置10は、機能的には、例えば、グループ生成部11と、トランザクション処理部12と、データ更新部13とを有する。
【0015】
ここで、トランザクション処理装置10は、物理的には、例えば、CPU(Central Processing Unit)と、記憶装置と、入出力インターフェースとを含んで構成される。記憶装置には、例えば、CPUで処理されるプログラムおよびデータを記憶するROM(Read Only Memory)やHDD(Hard Disk Drive)、主として制御処理のための各種作業領域として使用されるRAM(Random Access Memory)等が含まれる。これらの要素は、互いにバスを介して接続されている。CPUが、ROMに記憶されたプログラムを実行し、入出力インターフェースを介して受信される命令や、RAMに展開されるデータを処理することで、トランザクション処理装置10における各部の機能を実現することができる。
【0016】
図1に示すグループ生成部11は、アプリケーションにより実行される一または複数のトランザクションごとに、トランザクションで使用されるレコードを論理的にまとめることで、グループを生成する。より詳細には、以下のようにしてグループを生成する。
【0017】
最初に、グループ生成部11は、アプリケーションからトランザクションに関する情報を受信する。続いて、グループ生成部11は、トランザクションに関する情報およびシステムカタログ18に記憶されている情報を参照し、対象トランザクションで使用される全てのレコードに共通するユニークキーを選定する。続いて、グループ生成部11は、選定したユニークキーの属性値別にレコードを論理的にまとめることで、グループを生成する。システムカタログ18には、KVS20に格納されているデータのメタ情報が記憶されている。KVS20は、単一レコードに対する操作のアトミック性と、単一レコードに対するCAS(Compare and Swap)命令とを備えるデータベースである。KVS20は、複数のサーバ装置に分散して構築される。
【0018】
グループ生成部11は、生成したグループに関する情報と、受信したトランザクションに関する情報とを含むグループ情報を、グループ情報記憶部19に登録する。グループ情報記憶部19は、トランザクションに関する情報とグループに関する情報とを対応付けて記憶する。
【0019】
グループに関する情報は、必ずしもグループに属する各レコードの値を含む必要はなく、例えば、ユニークキーの属性値と、グループを構成するテーブルのメタ情報とが含まれていればよい。ユニークキーの属性値とテーブルのメタ情報とが得られれば、KVS20から対象となるレコードを抽出することができるためである。
【0020】
図2〜
図7を参照して、グループ生成部11が生成するグループについて具体的に説明する。
【0021】
ここでは、トランザクションとして、以下のトランザクション1とトランザクション2とを用いて説明する。トランザクション1は、「ユーザが新たに入札を行ったときに、商品テーブルおよび入札テーブルのデータを更新する」処理を実行する。トランザクション2は、「商品が売却されたときに、在庫数を更新する」処理を実行する。また、トランザクションで使用されるデータを格納するテーブルとして、
図2に示す商品テーブルT1と、
図3に示す入札テーブルT2と、
図4に示す商品情報テーブルT3とを用いて説明する。
【0022】
グループ生成部11は、トランザクション1に対応するグループを以下のように生成する。最初に、グループ生成部11は、トランザクション1で使用されるデータが、商品テーブルT1および入札テーブルT2に格納されているデータであることを特定する。続いて、グループ生成部11は、各データを含むレコードに共通するユニークキーとして、商品IDを選定する。続いて、グループ生成部11は、各レコードを商品IDの属性値別に論理的にまとめる。この結果、グループ生成部11は、
図5(A)〜(C)に示す三つのグループG1〜G3を生成する。なお、トランザクション1は、三つのグループG1〜G3のいずれか一つのグループのみにアクセスし、同時に複数のグループにアクセスすることはない。
【0023】
グループ生成部11は、トランザクション2に対応するグループを以下のように生成する。最初に、グループ生成部11は、トランザクション2で使用されるデータが、商品テーブルT1および商品情報テーブルT3に格納されているデータであることを特定する。続いて、グループ生成部11は、各データを含むレコードに共通するユニークキーとして、商品IDを選定する。続いて、グループ生成部11は、各レコードを商品IDの属性値別に論理的にまとめる。この結果、グループ生成部11は、
図6(A)〜(C)に示す三つのグループG4〜G6を生成する。なお、トランザクション2は、三つのグループG4〜G6のいずれか一つのグループのみにアクセスし、同時に複数のグループにアクセスすることはない。
【0024】
ここで、グループG1とグループG4、グループG2とグループG5、グループG3とグループG6には、それぞれ同一のレコードが含まれている。このような場合に、トランザクション1とトランザクション2とが同時に実行されると、データ更新時にデータの不整合が生じ得る。この不整合を回避するためには、トランザクション1とトランザクション2との双方で使用されるデータを同じグループにまとめる必要がある。
【0025】
具体的に、グループ生成部11は、トランザクション1およびトランザクション2の双方に対応するグループとして、
図7(A)〜(C)に示す三つのグループG7〜G9を生成する。つまり、グループ生成部11は、各グループ間でレコードが重複することがないように、商品IDの属性値別にグループを生成する。なお、トランザクション1およびトランザクション2は、三つのグループG7〜G9のいずれか一つのグループのみにアクセスし、同時に複数のグループにアクセスすることはない。
【0026】
ここで、本実施形態におけるログは、同一グループに属する各レコードの最新の内容を保持し、実際のレコードとは別にKVS20に格納される。KVS20は、複数のサーバ装置に分散して構築されるが、一つのログは、その内容が複数のサーバ装置に分散して格納されるのではなく、いずれか一つのサーバ装置にまとめて格納される。つまり、グループ単位に生成されるログは、その内容の全てをまとめて物理的に同一の記憶領域内に格納される。
【0027】
ログは、実際のレコードと同様に、キーと値とのペアで構成される。例えば、
図5に示すグループG1に対応するログは、以下のように生成される。
【0028】
WAL1 = (key, value) = (WAL_i1, [{i1,AAA,10,5,10000},{b1,i1,u3,9000},{b2,i1,u1,10000},version])
【0029】
ここで、“WAL1”は、ログを一意に特定する識別コードである。“WAL1”の“key”を構成する“WAL_i1”は、WALのログであることを示す識別子に、ユニークキー(商品ID)の属性値である“i1”を付加して表したものである。“WAL1”の“value”を構成する“{i1,AAA,10,5,10000},{b1,i1,u3,9000},{b2,i1,u1,10000}”は、グループG1に含まれる各レコードの値である。“WAL1”の“value”を構成する“version”には、現在の“WAL1”のバージョンを示す値が格納される。ログを新たに生成したときに、“version”に“1”が格納される。ログを更新したときに、“version”に格納されている値がインクリメントされる。
【0030】
同様にして、
図5に示すグループG2およびG3に対応するログは、それぞれ以下のように生成される。
【0031】
WAL2 = (key, value) = (WAL_i2, [{i2,BBB,3,7,8000},{b4,i2,u1,8000},version])
【0032】
WAL3 = (key, value) = (WAL_i3, [{i3,CCC,5,3,3000},{b3,i3,u2,3000},{b5,i3,u3,2500},version])
【0033】
図1に示すトランザクション処理部12は、アプリケーションから受信する処理要求にしたがって処理を実行する。処理要求には、例えば、クエリが含まれる。トランザクション処理部12は、グループ特定部121と、ログ管理部122とを含む。
【0034】
グループ特定部121は、アプリケーションからクエリを受信した場合に、クエリに対応するトランザクションに基づいてグループ情報記憶部19を参照し、そのトランザクションに対応するグループを特定する。上記クエリに対応するトランザクションは、クエリによる一連の処理がどのトランザクションに属しているのかを特定することで得られる。
【0035】
ログ管理部122は、グループ特定部121により特定されたグループのログを、get命令やCAS命令等のKVSコマンドを実行して管理する。以下に、具体的に説明する。
【0036】
ログ管理部122は、トランザクション処理を開始するためのbegin命令をアプリケーションから受信した場合には、トランザクションで使用されるレコードのログを取得するためのget命令をKVS20に送信し、ログを取得する。ログ管理部122は、取得したログに含まれる“version”の値を一時的に記憶する。ここで、トランザクションで使用されるレコードのログがKVS20に存在しない場合に、ログ管理部122は、以下の処理を実行する。
【0037】
最初に、ログ管理部122は、トランザクションで使用されるレコードを取得するためのget命令をKVS20に送信し、レコードを取得する。続いて、ログ管理部122は、取得したレコードに対応するログを生成するためのcreate命令をKVS20に送信し、KVS20にログを生成する。続いて、ログ管理部122は、トランザクションで使用されるレコードのログを取得するためのget命令をKVS20に送信し、ログを取得する。続いて、ログ管理部122は、取得したログに含まれる“version”の値を一時的に記憶する。
【0038】
なお、KVS20にログを生成する際に、他のトランザクションによって既にログが生成されている場合には、ログの生成を失敗とし、他のトランザクションによって生成されたログを取得し直せばよい。
【0039】
ログ管理部122は、クエリをアプリケーションから受信した場合には、KVS20から取得したログに含まれる各レコードの値を、クエリの内容に応じて更新する。ログ管理部122は、各レコードの更新が終了した後に、ログに含まれる“version”の値をインクリメントする。ログ管理部122は、更新処理の結果をアプリケーションに応答する。
【0040】
ログ管理部122は、更新を確定するためのcommit命令をアプリケーションから受信した場合には、CAS命令を用いてKVS20のログを更新する。CAS命令による更新は、以下の手順で実行される。
【0041】
最初に、ログ管理部122は、KVS20に記憶されているログの“version”の値と、上記一時的に記憶した“version”の値とを比較する。続いて、ログ管理部122は、比較した“version”の値が同じである場合に、KVS20のログを更新し、ログの書き込みを成功とする。一方、ログ管理部122は、比較した“version”の値が異なる場合には、KVS20のログを更新せずに、ログの書き込みを失敗とする。ログ管理部122は、CAS命令の結果をアプリケーションに応答する。
【0042】
ログを更新する際にCAS命令を用いることで、以下の理由により、ログデータの一貫性を保持することができる。まず、比較した“version”の値が同じである場合には、他のトランザクションがそのログを更新していないことを意味する。したがって、この場合には、ログを更新してもデータの一貫性が保持されることになる。一方、比較した“version”の値が異なる場合には、そのトランザクションがレコードを更新している間に他のトランザクションがログを更新したことを意味する。したがって、この場合には、ログの更新を中止することでデータの一貫性が保持されることになる。
【0043】
ログ管理部122は、トランザクション処理を終了するためのend命令をアプリケーションから受信した場合には、ログの内容をレコードに反映させるためのreflect命令をデータ更新部13に送信する。このreflect命令には、ログの“key”の値と、ログ管理部122がそのログを更新したときの“version”の値とが含まれる。
【0044】
データ更新部13は、reflect命令を受信した場合に、CAS命令を用いてKVS20のレコードをKVS20のログの内容で更新するとともに、そのログをKVS20から削除する。より詳細には、以下のように更新する。
【0045】
最初に、データ更新部13は、reflect命令に含まれる“key”の値に対応するログをKVS20から取得する。続いて、データ更新部13は、取得したログに含まれる“version”の値と、reflect命令に含まれる“version”の値とを比較する。続いて、データ更新部13は、比較した“version”の値が同じである場合には、ログに含まれる各レコードの値を、対応するKVS20の各レコードに反映して更新する。そして、データ更新部13は、そのログをKVS20から削除する。一方、データ更新部13は、比較した“version”の値が異なる場合には、ログの反映を実行しない。
【0046】
レコードを更新する際にCAS命令を用いることで、以下の理由により、データの一貫性を保持することができる。まず、比較した“version”の値が同じである場合には、他のトランザクションがそのログを更新していないことを意味する。したがって、この場合には、そのログでレコードを更新してもデータの一貫性が保持されることになる。一方、比較した“version”の値が異なる場合には、そのトランザクションが終了してからレコードを更新するまでの間に、他のトランザクションがログを更新したことを意味する。したがって、この場合には、ログの反映を中止することでデータの一貫性が保持されることになる。この場合には、他のトランザクションの動作シーケンスでログの反映および削除を実行すればよい。
【0047】
次に、
図8を参照して、トランザクション処理装置10の動作について説明する。
【0048】
システムが稼動する前に、アプリケーションからトランザクションに関する情報が入力されると、グループ生成部11は、各トランザクションで使用されるレコードをユニークキーの属性値別に論理的にまとめてグループを生成する(ステップS101)。
【0049】
続いて、グループ生成部11は、グループに関する情報とトランザクションに関する情報とを含むグループ情報をグループ情報記憶部19に登録する(ステップS102)。
【0050】
その後、システムが稼動した後に、トランザクション処理部12は、アプリケーションからクエリを受信する(ステップS103)。
【0051】
続いて、グループ特定部121は、受信したクエリに対応するトランザクションに基づいて、グループ情報記憶部19を参照し、処理対象となるグループを特定する(ステップS104)。
【0052】
続いて、ログ管理部122は、特定したグループに対応するログがKVS20に存在するか否かを判定する(ステップS105)。この判定がNOである場合(ステップS105;NO)に、ログ管理部122は、グループに対応するレコードをKVS20から取得し、取得したレコードでログを生成し、KVS20に書き込む(ステップS106)。そして、処理を後述するステップS107に移行する。
【0053】
一方、上記ステップS105の判定でグループに対応するログがKVS20に存在すると判定された場合(ステップS105;YES)に、ログ管理部122は、そのログをKVS20から取得する(ステップS107)。
【0054】
続いて、ログ管理部122は、取得したログの“version”の値を一時的に記憶し、ログに含まれる各レコードの値をクエリに応じて更新し、“version”の値をインクリメントしてからログをKVS20に書き込む(ステップS108)。
【0055】
続いて、ログ管理部122は、ログの書き込みが成功したか否かを判定する(ステップS109)。この判定がNOである場合(ステップS109;NO)には、本動作を終了する。
【0056】
一方、上記ステップS109の判定でログの書き込みが成功したと判定された場合(ステップS109;YES)に、データ更新部13は、ログの内容を実データであるKVS20のレコードに反映し(ステップS110)、そのログをKVS20から削除する。そして、本動作を終了する。
【0057】
なお、この動作例では、説明の便宜上、グループ情報を生成して登録する処理(ステップS101〜ステップS102)を一連の動作に組み込んで説明している。しかしながら、グループ情報を生成して登録するのは、システムの稼働前に一回実行すれば足りる。したがって、実際の運用上は、システム稼働後に、上記ステップS103〜ステップS110までの各処理を一連の動作として繰り返し実行することとなる。
【0058】
次に、
図9を参照して、グループ情報を登録する際の動作について説明する。
【0059】
最初に、アプリケーションがトランザクションに関する情報をグループ生成部11に送信する(ステップS201)。
【0060】
続いて、グループ生成部11は、トランザクションに関する情報と、システムカタログ18に記憶されているデータのメタ情報とに基づいて、グループを生成する(ステップS202)。
【0061】
続いて、グループ生成部11は、生成したグループに関する情報とトランザクションに関する情報とを含むグループ情報を、グループ情報記憶部19に登録する(ステップS203)。
【0062】
続いて、グループ生成部11は、処理が成功したことを示す応答をアプリケーションに送信する(ステップS204)。
【0063】
次に、
図10〜
図14を参照して、トランザクションがKVS20のデータを更新する際の各種動作例について説明する。これらの動作例では、実行されるトランザクションが、KVS20に格納されているRecord1とRecord2とを更新するトランザクションである場合について説明する。
【0064】
まず、
図10および
図11を参照して、Record1およびRecord2のログが、既にKVS20に生成されている場合の動作例について説明する。
【0065】
最初に、アプリケーションは、トランザクション処理を開始するために、begin命令をトランザクション処理部12に送信する(ステップS301)。
【0066】
続いて、トランザクション処理部12は、get命令をKVS20に送信し(ステップS302)、KVS20からログを取得する(ステップS303)。
【0067】
続いて、トランザクション処理部12は、取得したログに含まれる各レコードの値をクエリに応じてupdateする(ステップS304)。そして、トランザクション処理部12は、updateが成功したことを示す応答をアプリケーションに送信する(ステップS305)。
【0068】
続いて、アプリケーションは、更新を確定するために、commit命令をトランザクション処理部12に送信する(ステップS306)。
【0069】
続いて、トランザクション処理部12は、CAS命令を用いてログを更新する(ステップS307)。CAS命令が成功する(ステップS308)と、トランザクション処理部12は、更新が成功したことを示す応答をアプリケーションに送信する(ステップS309)。
【0070】
続いて、アプリケーションは、トランザクション処理を終了するために、end命令をトランザクション処理部12に送信する(ステップS401)。
【0071】
続いて、トランザクション処理部12は、ログの内容をレコードに反映させるために、reflect命令をデータ更新部13に送信する(ステップS402)。
【0072】
続いて、データ更新部13は、get命令をKVS20に送信し(ステップS403)、KVS20からログを取得する(ステップS404)。
【0073】
続いて、データ更新部13は、トランザクション処理部12から受信したreflect命令に含まれる“version”の値と、KVS20から取得したログに含まれる“version”の値とを比較する(ステップS405)。
【0074】
続いて、比較した“version”の値が同じである場合に、データ更新部13は、Record1を更新するために、set命令をKVS20に送信し(ステップS406)、KVS20から成功したことを示す応答を受信する(ステップS407)。
【0075】
続いて、データ更新部13は、Record2を更新するために、set命令をKVS20に送信し(ステップS408)、KVS20から成功したことを示す応答を受信する(ステップS409)。
【0076】
続いて、データ更新部13は、ログを削除するために、delete命令をKVS20に送信し(ステップS410)、KVS20から成功したことを示す応答を受信する(ステップS411)。
【0077】
続いて、データ更新部13は、レコードへの反映が成功したことを示す応答をトランザクション処理部12に送信する(ステップS412)。そして、トランザクション処理部12は、処理が成功したことを示す応答をアプリケーションに送信する(ステップS413)。
【0078】
次に、
図12および
図11を参照して、Record1およびRecord2のログが、KVS20に生成されていない場合の動作例について説明する。
【0079】
本動作例が、上述したRecord1およびRecord2のログが既にKVS20に生成されている場合の動作例(
図10および
図11)と異なるのは、
図10に示すステップS301の処理とステップS302の処理との間に、
図12に示すステップS502〜ステップS506までの処理が追加される点である。以下においては、主に追加した処理について説明する。
【0080】
最初に、アプリケーションは、トランザクション処理を開始するために、begin命令をトランザクション処理部12に送信する(ステップS501)。
【0081】
続いて、トランザクション処理部12は、get命令をKVS20に送信し(ステップS502)、KVS20からRecord1を取得する(ステップS503)。
【0082】
続いて、トランザクション処理部12は、get命令をKVS20に送信し(ステップS504)、KVS20からRecord2を取得する(ステップS505)。
【0083】
続いて、トランザクション処理部12は、Record1およびRecord2のログを生成するために、create命令をKVS20に送信する(ステップS506)。
【0084】
続いて、トランザクション処理部12は、get命令をKVS20に送信し(ステップS507)、KVS20からログを取得する(ステップS508)。
【0085】
続いて、トランザクション処理部12は、取得したログに含まれる各レコードの値をクエリに応じてupdateする(ステップS509)。そして、ログ管理部122は、updateが成功したことを示す応答をアプリケーションに送信する(ステップS510)。
【0086】
これ以降のステップS511〜ステップS514までの各処理は、上述した
図10のステップS306〜ステップS309までの各処理と同様であるため、説明を省略する。また、ステップS514に続いて行われる、
図11のステップS401〜ステップS413までの各処理については、既に上記で説明した通りであるため、説明を省略する。
【0087】
次に、
図13を参照して、commit命令が失敗した場合の動作例について説明する。なお、ステップS601〜ステップS605までの各処理については、上述した
図10に示すステップS301〜ステップS305までの各処理と同様であるため、説明を省略する。
【0088】
ステップS605でupdateが成功すると、アプリケーションは、更新を確定するために、commit命令をトランザクション処理部12に送信する(ステップS606)。
【0089】
続いて、トランザクション処理部12は、CAS命令を用いてログを更新する(ステップS607)。CAS命令が失敗する(ステップS608)と、トランザクション処理部12は、更新が失敗したことを示す応答をアプリケーションに送信する(ステップS609)。
【0090】
次に、
図14を参照して、ログの実データへの反映が失敗した場合の動作例について説明する。なお、ステップS701〜ステップS709までの各処理については、上述した
図10に示すステップS301〜ステップS309までの各処理と同様であるため、説明を省略する。
【0091】
ステップS709でcommitが成功すると、アプリケーションは、トランザクション処理を終了するために、end命令をトランザクション処理部12に送信する(ステップS710)。
【0092】
続いて、トランザクション処理部12は、ログの内容をレコードに反映させるために、reflect命令をデータ更新部13に送信する(ステップS711)。
【0093】
続いて、データ更新部13は、get命令をKVS20に送信し(ステップS712)、KVS20からログを取得する(ステップS713)。
【0094】
続いて、データ更新部13は、トランザクション処理部12から受信したreflect命令に含まれる“version”の値と、KVS20から取得したログに含まれる“version”の値とを比較する(ステップS714)。
【0095】
続いて、比較した“version”の値が異なる場合に、データ更新部13は、レコードへの反映が失敗したことを示す応答をトランザクション処理部12に送信する(ステップS715)。そして、トランザクション処理部12は、処理が失敗したことを示す応答をアプリケーションに送信する(ステップS716)。
【0096】
上述したように、実施形態におけるトランザクション処理装置10によれば、トランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値ごとに論理的にまとめてグループを生成することができる。また、実行されたトランザクションに対応する同一グループに属するレコードのログを、重複することなく物理的に同一の記憶領域内にまとめて格納して管理することができる。さらに、管理されているログの内容を、物理的に分散する記憶領域内に格納されているレコードに反映して実データを更新することができる。
【0097】
それゆえに、KVSを用いてトランザクション処理を実行する場合であっても、複数のレコードに対するトランザクション処理を行うことができる。
【0098】
なお、上述した実施形態は、単なる例示に過ぎず、実施形態に明示していない種々の変形や技術の適用を排除するものではない。すなわち、本発明は、その趣旨を逸脱しない範囲で様々な形態に変形して実施することができる。
【0099】
例えば、上述した実施形態におけるトランザクション処理装置10(
図1参照)は、グループ生成部11およびシステムカタログ18を備えているが、これに限定されない。
図15に示すように、トランザクション処理装置10は、トランザクション処理部12、データ更新部13およびグループ情報記憶部19を備えることとしてもよい。この場合には、外部装置で生成されたグループ情報が、グループ情報記憶部19に格納されていればよい。
【0100】
また、上述した実施形態の一部または全部は、以下の付記のようにも記載され得るが、本発明は以下に限定されない。
【0101】
(付記1) アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶するグループ情報記憶部と、前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶部により記憶されている情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定部と、前記グループ特定部により特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するログ管理部と、前記ログ管理部により管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新部と、を備えることを特徴とするトランザクション処理装置。
【0102】
(付記2) 前記ログおよび前記レコードは、物理的に複数の記憶領域から構成されるKVS(Key-Value Store)に格納される、ことを特徴とする請求項1記載のトランザクション処理装置。
【0103】
(付記3) 前記ログ管理部は、前記ログを更新する際に、CAS(Compare and Swap)命令を用いて更新する、ことを特徴とする請求項2記載のトランザクション処理装置。
【0104】
(付記4) 前記データ更新部は、前記レコードを更新する際に、CAS命令を用いて更新する、ことを特徴とする請求項3記載のトランザクション処理装置。
【0105】
(付記5) アプリケーションにより実行される一または複数のトランザクションで使用されるレコードを、当該レコードに共通するユニークキーの属性値別に論理的にまとめて生成したグループに関する情報と、前記トランザクションに関する情報とを対応付けて記憶させるグループ情報記憶ステップと、前記アプリケーションから処理要求を受信した場合に、当該処理要求に対応する前記トランザクションに基づいて、前記グループ情報記憶ステップにおいて記憶された情報を参照し、当該トランザクションに対応する前記グループを特定するグループ特定ステップと、前記グループ特定ステップにおいて特定された前記グループに含まれる前記レコードのログを、当該ログの内容の全てをまとめて物理的に同一の記憶領域内に格納して管理するログ管理ステップと、前記ログ管理ステップにおいて管理される前記ログの内容を、前記ログに対応する前記レコードに反映させて、実データを更新するデータ更新ステップと、を含むことを特徴とするトランザクション処理方法。
【0106】
(付記6) 請求項5に記載の各ステップをコンピュータに実行させるためのトランザクション処理プログラム。