(57)【要約】    【課題】      世代番号を指定するような規定がなされていないクエリを用いて世代管理型データベースにアクセスし、ひいては、世代管理型データベースに対して一トランザクション内で参照、変更を複数回行うこと。    【解決手段】  クライアントインタフェース部１２２は、クライアント１１０からのＳＱＬなどで記述されたクエリを受け付けたり、クライアント１１０に対してＪＤＢＣなどのインタフェースを提供する。クエリ変換部１２４は、クライアントインタフェース部１２２を通じてクライアント１１０から得たクエリを、世代管理型データベースネイティブのクエリに変換する。トランザクション管理部１２６は、クライアント１１０からの一連のクエリを一トランザクションとして管理するためのトランザクション管理テーブル１２８と、トランザクション内の各クエリに関連付けるべき世代番号を管理するための世代管理テーブル１３０とを有する。  【選択図】      図１
2006040064.tif 000002
【特許請求の範囲】
【請求項１】
クライアントからのクエリを受け付けるとともに、クライアントに対してデータベースアクセスを行うためのインタフェースを提供するクライアントインタフェース部と、
前記クライアントインタフェース部から得たクエリを世代管理型データベースのネイティブ形式のクエリに変換するクエリ変換部と、
を有することを特徴とするデータベースアクセス装置。
【請求項２】
クライアントごとに発行された一連のクエリを一トランザクションとして管理するためのトランザクション管理テーブルと、
各トランザクションを構成する各クエリに関連付けるべき世代番号、当該クエリにより適応される変更情報、および当該トランザクションのコミット状態を管理する世代管理テーブルと、
を有するトランザクション管理部をさらに有し、
クライアントごとにトランザクションを構成する、
ことを特徴とする請求項１記載のデータベースアクセス装置。
【請求項３】
前記クライアントインタフェース部から得たクエリが検索操作であり、その際に当該クライアントに対応付けられたトランザクションが直列化可能に設定されていた場合には、
前記トランザクション管理部は、
前記世代管理テーブル中の当該クライアントに関して直近に登録されたレコードと、前記世代管理テーブルのレコードの中で当該トランザクションの開始以降のレコードから前記直近に登録されたレコードの間に登録され、当該トランザクション以外のレコードからなるレコード集合とを求め、前記直近に登録されたレコードが示す世代番号から前記レコード集合が示す更新情報を差し引いた世代演算式を算出し、
前記クエリ変換部は、
前記トランザクション管理部によって算出された世代演算式を変換後のクエリに付与する、
ことを特徴とする請求項２記載のデータベースアクセス装置。
【請求項４】
前記クライアントインタフェース部から得たクエリが検索操作であり、その際に当該クライアントに対応付けられたトランザクションが非コミット読み取りに設定されていた場合には、
前記クエリ変換部は、
検索操作時点における世代管理型データベース上で最新の世代番号を変換後のクエリに付与する、
ことを特徴とする請求項２記載のデータベースアクセス装置。
【請求項５】
前記クライアントインタフェース部から得たクエリが検索操作であり、その際に当該クライアントに対応付けられたトランザクションがコミット読み取りに設定されていた場合には、
前記トランザクション管理部は、
検索操作時点における世代管理型データベース上で最新の世代番号を取得し、また、前記世代管理テーブルのレコードの中から当該トランザクション以外であり未コミット状態のレコード集合を求め、前記最新の世代番号から前記レコード集合が示す更新情報を差し引いた世代演算式を算出し、
前記クエリ変換部は、
前記トランザクション管理部によって算出された世代演算式を変換後のクエリに付与する、
ことを特徴とする請求項２記載のデータベースアクセス装置。
【請求項６】
前記クライアントインタフェース部から得たクエリが検索操作であり、その際に当該クライアントに対応付けられたトランザクションが再読み込み可能読み取りに設定されていた場合には、
前記トランザクション管理部は、
前記世代管理テーブル中の当該クライアントに関して直近に登録されたレコードと、前記世代管理テーブルのレコードの中で前記直近に登録されたレコード以降で、当該トランザクション以外でありコミット状態のレコード集合とを求め、前記直近に登録されたレコードが示す世代番号と、前記レコード集合が示す更新情報とを加えた世代演算式を算出し、
前記クエリ変換部は、
前記トランザクション管理部によって算出された世代演算式を変換後のクエリに付与する、
ことを特徴とする請求項２記載のデータベースアクセス装置。
【請求項７】
前記クライアントインタフェース部から得たクエリがロールバック操作である場合には、
前記トランザクション管理部は、
検索操作時点における世代管理型データベース上で最新の世代番号を取得し、また、前記世代管理テーブルのレコードの中から当該トランザクションで未コミット状態のレコード集合を求め、前記最新の世代番号から前記レコード集合が示す更新情報を差し引いた世代演算式を算出し、
前記クエリ変換部は、
前記トランザクション管理部によって算出された世代演算式を付与したクエリを発行する、
ことを特徴とする請求項２記載のデータベースアクセス装置。
【請求項８】
前記世代管理型データベースが世代間の差分処理を行わず、また、前記クライアントインタフェース部から得たクエリが変更操作のうち更新操作である場合には、更新操作により影響を受けるレコードの更新前状態を取得し、さらには、前記更新操作がロールバックされた場合に、前記更新前状態の内容を更新する変更操作を前記世代管理型データベースに行う、ことを特徴とする請求項２から請求項７のいずれかに記載のデータベースアクセス装置。
【請求項９】
前記世代管理型データベースが世代間の差分処理を行わず、また、前記クライアントインタフェース部から得たクエリが変更操作のうち削除操作である場合には、削除操作により影響を受けるレコードの削除前状態を取得し、さらには、前期削除操作がロールバックされた場合に、前記削除前状態の内容を追加する変更操作を前記世代管理型データベースに行う、ことを特徴とする請求項２から請求項７のいずれかに記載のデータベースアクセス装置。
【請求項１０】
前記世代管理型データベースが世代間の差分処理を行わず、また、前記クライアントインタフェース部から得たクエリが変更操作のうち追加操作である場合には、追加操作に含まれる変更情報の中から追加される新規レコードのレコード識別フィールドの集合であるレコード識別フィールドリストを取得し、さらには、前期追加操作がロールバックされた場合に、前記レコード識別フィールドリスト中に含まれるレコード識別フィールドを持つレコードを削除する変更操作を前記世代管理型データベースに行う、ことを特徴とする請求項２から請求項７のいずれかに記載のデータベースアクセス装置。
【請求項１１】
前記トランザクション管理部は、
前記世代管理型データベースが世代間の差分処理を行わない場合には、前記世代演算式において、すべての項について、正（加算）の項となっている変更情報に関しては、加工する前の変更情報を持つクエリをデータベースに対して発行し、負（減算）の項となっている変更情報に関しては、該当する項に対応する変更情報に含まれる前記ロールバックされた際に用いるクエリを発行した後、その時点での最新の世代番号を新たな世代演算式として算出する、
ことを特徴とする請求項２から請求項７のいずれかに記載のデータベースアクセス装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データベースアクセス装置に関し、特に、世代や版といった単位でデータ管理を行うデータベースに対して、データの参照や更新などのアクセスを行うための装置に関する。
【背景技術】
【０００２】
図２１（Ａ）および図２１（Ｂ）は、データベースアクセスの概念を説明するための図である。
【０００３】
図２１（Ａ）に示すように、データベース１に接続されたクライアント３からデータベース１に対してデータの参照を行う問い合わせ（クエリ）を発行すると、データベース１は、クエリで示された条件に合致するデータを問い合わせの結果としてクライアント３に返信する。
【０００４】
また、図２１（Ｂ）に示すように、データベース１に対してデータの更新、追加、削除のようなデータの変更を行うクエリを発行すると、データベース１は、クエリに示された条件に合致するデータの更新、追加、削除を行い、問い合わせの結果をクライアント３に返信する。このとき、データベース１が世代や版といった単位でデータ管理を行うデータベース（世代管理型データベース）の場合、データの変更を行うクエリをデータベース１が受け付けることにより、変更後の新たなデータベース状態を示すための「世代」と呼ばれる情報が作成される。
【０００５】
より詳細に説明すると、世代管理型データベースでは、任意の時点のデータベース状態は、その管理単位である世代の番号（世代番号）により指定することができる。世代番号の指定は、クエリに世代番号を付与することで可能である。たとえば、データ変更を行うクエリを受け付ける前のデータベース状態を示す世代に対して、当該世代を示す世代番号を指定して検索を行った場合は、当然ながら変更内容を反映したデータベース状態での問い合わせ結果を得ることはできない。一方、変更後のデータベース状態を示す世代を示す世代番号を指定して検索を行った場合は、データの変更内容を反映したデータベース状態での問い合わせ結果を得ることができる。クエリに世代番号を付与することは、世代管理型データベースの実装にもよるが、クエリに世代番号を付与しなかった場合は、通常、現在の最新世代を示す世代番号が指定されたものと同じ作用をする。
【０００６】
このように、世代管理型データベースでは、クエリに世代番号を指定することで、その世代番号が示すデータベース状態に対してクエリを発行することができる。すなわち、任意のデータベース状態に対する参照（検索）、任意のデータベース状態に対する変更（更新、追加、削除）が可能である。特に、変更の場合は、変更後のデータベース状態を示す新たな世代およびその状態を示す世代番号が作成される。
【０００７】
さらに、世代管理型データベースには、世代間の差分に対して問い合わせを行うクエリを発行できるものも多い。たとえば、一日の終わりに「本日の売り上げ」を集計するためには、集計時の状態（最新世代番号）と本日の開始時点の状態（開店直後の世代番号）の２つの世代の差に対して、売り上げ情報を問い合わせるようなクエリを発行すればよい。
【０００８】
このような世代管理型データベースに対し、非世代管理型のデータベース（リレーショナルデータベース管理システム：ＲＤＢＭＳ（Relational Data Base Management System））があり、データベース市場で大きなシェアを有している。加えて、データベースに対するクエリ記述言語として構造化問い合わせ言語（ＳＱＬ：Structured Query Language）が業界標準として広く普及しており（非特許文献１）、また、ＳＱＬを用いるためのリソースも数多く存在する。ほかにも、Ｊａｖａ（登録商標）アプリケーションからデータベースを操作するＡＰＩ（Application Programming Interface）として、ＪＤＢＣ（Java Database Connectivity）なども広く用いられている（非特許文献２）。
【０００９】
ＲＤＢＭＳには、複数のユーザーが同時にデータベース操作を行う際に、データベースに対する複数の操作（参照、更新、追加、削除など）を実行している途中でエラーなどが発生したとしても、データの不整合が起きないことを保証するための「トランザクション」と呼ばれるメカニズムが存在する。また、ＳＱＬやＪＤＢＣなどは、その規格として、自分のトランザクションと他のトランザクションとの隔離性（アイソレーションレベル：Isolation Level）を設定することができる。
【００１０】
これらトランザクション機構やアイソレーションレベルの概念により、ＲＤＢＭＳは安全性、信頼性、柔軟性、高速性を兼ね備えたものとなっている。
【非特許文献１】Martin Gruber, "SQL 92/99標準リファレンスブック", 株式会社ドキュメントシステム
【非特許文献２】"Java(TM) JDBC(TM) Data Access API Specification ("Specification")", Version 3.0, page 63-64
【発明の開示】
【発明が解決しようとする課題】
【００１１】
しかしながら、ＳＱＬやＪＤＢＣなどは、非世代管理型データベースであるＲＤＢＭＳを基準に規格化されているため、上記のように世代番号を指定するような規定がなされていない。一方、世代管理型データベースは、上記のようにクエリに世代番号を付与することが必要になるために、クエリに関するＡＰＩ仕様が独自性の高いものとなっている。また、ＲＤＢＭＳで基本として使用されているトランザクション機構も概念的として存在しない。
【００１２】
そのため、世代管理型データベースでは、データベースシステムの構築などの際に、ＲＤＢＭＳで豊富に存在するリソースの活用、他システムとの結合や連携が容易ではなかった。
【００１３】
本発明は、かかる点に鑑みてなされたものであり、ＳＱＬやＪＤＢＣなどのように、世代番号を指定するような規定がなされていないクエリを用いて世代管理型データベースにアクセスし、ひいては、世代管理型データベースに対して一トランザクション内で参照、変更を複数回行うことができるトランザクション機構を備えたデータベースアクセス装置を提供することを目的とする。
【課題を解決するための手段】
【００１４】
本発明に係るデータベースアクセス装置は、クライアントからのクエリ（たとえば、ＳＱＬなどで記述された）を受け付けるとともに、クライアントに対してデータベースアクセスを行うためのインタフェース（たとえば、ＪＤＢＣなど）を提供するクライアントインタフェース部と、前記クライアントインタフェース部から得たクエリを世代管理型データベースのネイティブ形式のクエリに変換するクエリ変換部と、を有する構成を採る。好ましくは、当該データベースアクセス装置は、クライアントごとに発行された一連のクエリを一トランザクションとして管理するためのトランザクション管理テーブルと、各トランザクションを構成する各クエリに関連付けるべき世代番号、当該クエリにより適応される変更情報、および当該トランザクションのコミット状態を管理する世代管理テーブルとを有するトランザクション管理部をさらに有し、クライアントごとにトランザクションを構成することを可能にしている。すなわち、トランザクション管理部は、各クエリの発行前後のそれぞれにおけるデータベースの最新世代番号を把握し、クエリ変換部におけるネイティブ形式へのクエリ変換の際に付与すべき世代番号をクエリ変換部に提示する。また、好ましくは、トランザクション管理部は、クエリ変換部に提示すべき世代番号を、トランザクションごとに設定されているアイソレーションレベルに応じて行う。
【発明の効果】
【００１５】
本発明によれば、ＳＱＬやＪＤＢＣなどのように、世代番号を指定するような規定がなされていないクエリを用いて世代管理型データベースにアクセスし、ひいては、世代管理型データベースに対して一トランザクション内で参照、更新を複数回行うことができる。また、トランザクションごとにアイソレーションレベルを設定することが可能となる。さらには、従来の世代管理型データベースに対して、安全性、信頼性、柔軟性、高速性を兼ね備えることが可能となる。
【発明を実施するための最良の形態】
【００１６】
以下、本発明の実施の形態について、図面を参照して詳細に説明する。
【００１７】
（実施の形態１）
図１は、本発明の実施の形態１に係るデータベースアクセス装置を含むデータベースシステムの構成を示すブロック図である。
【００１８】
図１に示すデータベースシステム１００は、大別して、クライアント１１０、データベースアクセス装置１２０、およびデータベース１４０を有する。
【００１９】
クライアント１１０は、ＳＱＬなどの問い合わせ言語を用いて表記されたクエリの発行や、ＪＤＢＣなどのＡＰＩ呼び出しを行い、データベースアクセス装置１２０を経由してデータベース１４０にアクセスする。データベース１４０では、クエリの内容に従った処理を行い、結果をクライアント１１０に返す。データベース１４０は、世代管理型データベースである。データベースアクセス装置１２０は、クライアントインタフェース部１２２、クエリ変換部１２４、およびトランザクション管理部１２６を有する。トランザクション管理部１２６には、トランザクション管理テーブル１２８と世代管理テーブル１３０が設けられている。
【００２０】
ここで、図２（Ａ）〜図２（Ｃ）を用いて、本実施の形態におけるクライアント、データベースアクセス装置、およびデータベースの構成例を示す。
【００２１】
図２（Ａ）において、データベースアクセス装置１２０は、アプリケーションソフトウェア１５０がデータベース１４０にアクセスを行うためのドライバソフトウェアとして実装されており、クライアント１１０ａにドライバソフトウェアのインストールを行うことにより動作する。アプリケーションソフトウェア１５０は、データベース１４０内の情報を利用したアプリケーションロジックを有し、必要に応じてドライバソフトウェアのインタフェースを呼び出すことによりデータベース１４０にアクセスし、必要な情報を取得する。
【００２２】
図２（Ｂ）において、データベースアクセス装置１２０は、Ｗｅｂサーバ１５２上で動作するサーブレットと呼ばれるアプリケーションソフトウェア１５４から呼び出されるライブラリとして実装されている。クライアント１１０ｂ上ではＷｅｂサーバ１５２にアクセスを行うためのブラウザ１５６が動作しており、必要に応じてサーブレット１５４を呼び出す（またはサーブレット１５４を呼び出すためのＵＲＬをＷｅｂサーバ１５２に対して発行する）。サーブレット１５４は、データベース１４０内の情報を利用したアプリケーションロジックを有し、必要に応じてライブラリであるデータベースアクセス装置１２０のインタフェースを呼び出すことによりデータベース１４０にアクセスし、必要な情報を取得する。
【００２３】
図２（Ｃ）において、データベースアクセス装置１２０は、データベース１４０ａ上で動作するデーモンプロセスのようなソフトウェアとして実装されており、データベース１４０ａ上にデーモンプロセスソフトウェアのインストールを行うことにより動作する。アプリケーションソフトウェア１５８は、データベース１４０ａ内の情報を利用したアプリケーションロジックを有し、必要に応じてデーモンプロセスに接続するためのＡＰＩを呼び出すことによりデータベース１４０ａにアクセスし、必要な情報を取得する。
【００２４】
なお、本実施の形態では、データベースアクセス装置１２０をソフトウェアとして構成した場合を示したが、これに限られるわけではなく、クライアント１１０、Ｗｅｂサーバ１５２、データベース１４０などに装着するハードウェアボードのようなハードウェアとして構成してもよい。
【００２５】
図１において、クライアントインタフェース部１２２は、図２（Ａ）〜図２（Ｃ）におけるアプリケーションソフトウェア１５０、１５４、１５８からＳＱＬなどの問い合わせ言語を用いて表記されたクエリを受け付けたり、アプリケーションソフトウェアに対してＪＤＢＣなどのインタフェースの提供を行ったりする。また、データベース１４０の処理結果をアプリケーションソフトウェアに返すためのインタフェースも提供する。クライアントインタフェース部１２２は、受け付けたクエリやインタフェース経由で取得した情報（付属情報）をクエリ変換部１２４に渡す。クライアントインタフェース部１２２は、複数のクライアントからのクエリを受け付けることができ、これらのクエリはそれぞれ固有のクライアントＩＤという値で識別することが可能である。クライアントインタフェース部１２２を含む、データベースアクセス装置１２０を構成するすべての要素１２２〜１２６、および、各要素間のインタフェースは、それぞれ、クライアントＩＤを処理したり伝達させることが可能であり、必要に応じてクライアントＩＤごとに要素および要素間インタフェースの構成数を増減することが可能である。
【００２６】
クエリ変換部１２４は、クライアントインタフェース部１２２から受けたクエリおよび付属情報を、世代管理型データベースであるデータベース１４０のネイティブな記述をされたクエリに変換する。クライアントインタフェース部１２２から受けた変換前のクエリ等には、世代番号などの世代管理型データベース固有の情報は含まれていない。一方、変換後のクエリは、変換前のクエリと意味的に等価で、世代番号などの世代管理型データベース固有の情報が付与されたものとなる。
【００２７】
トランザクション管理部１２６は、クライアントＩＤごとに発行された一連のクエリを一トランザクションとして管理するためのトランザクション管理テーブル１２８と、各トランザクションを構成する各クエリに関連付けるべき世代番号などを管理する世代管理テーブル１３０とを有する。クエリ変換部１２４は、クエリの変換に際し、トランザクション管理部１２６に対して、クエリに付与すべき世代番号などの情報の要求を行う。この要求に対し、トランザクション管理部１２６は、トランザクション管理テーブル１２８および世代管理テーブル１３０を参照し、クエリに付与するために必要な世代番号などの情報をクエリ変換部１２４に返す。
【００２８】
クエリ変換部１２４によりデータベース１４０のネイティブな記述に変換されたクエリは、データベース１４０に渡される。データベース１４０では、データベースの基幹部分である検索処理部１４２が動作しており、クエリの内容に応じた処理（検索、更新、追加、削除など）を行う。この処理の結果はクエリ変換部１２４に渡される。この処理結果には、検索の結果となるレコード集合や処理成否のほか、データベースが提供する情報（ログ、統計情報、頻度情報、関連度情報、データベースステータス、処理前後のデータベース上の世代番号など）を含むことができる。
【００２９】
なお、クエリ変換部１２４は、クライアント１１０からの１つのクエリに対して、必ずしも１つの変換後クエリをデータベース１４０に渡すわけではなく、必要に応じて任意のタイミングで、データベース１４０に対して独自のクエリを作成し、処理結果を得るようにしてもよい。たとえば、データベース１４０上の最新世代番号の場合は、最新世代番号を取得するための、データベース１４０にネイティブなクエリを作成し、これにより、データベース１４０から最新世代番号を取得することが可能である。
【００３０】
クエリ変換部１２４は、検索処理部１４２から受け取った処理結果を、世代番号などの世代管理型データベース固有の情報を取り除いた形式に変換し、クライアントインタフェース部１２２を経由して、クエリ発行元であるアプリケーションソフトウェア１５０、１５４、１５８に返す。
【００３１】
以下、各部の動作を詳細に説明する。
【００３２】
まず、アイソレーションレベルが「SERIALIZABLE（直列化可能）」の場合を説明する。アイソレーションレベルの指定は、クライアントインタフェース部１２２に対して、たとえば、図３で示すような入力を行えばよい。図３は、ＳＱＬおよびＪＤＢＣによるアイソレーションレベルの設定記述例を示す図である。
【００３３】
図３に示すように、ＳＱＬおよびＪＤＢＣには「SERIALIZABLE（直列化可能）」、「READ UNCOMMITED（非コミット読み取り）」、「READ COMMITED（コミット済読み取り）」、「REPEATABLE_READ（再読み込み可能読み取り）」の４種類のアイソレーションレベルが存在する。
【００３４】
それぞれのアイソレーションレベルが意味するところは、図３中の表に示す「Dirty Read」、「Non-Repeatable Read」、「Phantom Read」の３種類の読み込み状態がそれぞれ発生する（「あり」と表記）か発生しない（「なし」と表記）かの組み合わせである。
【００３５】
「Dirty Read」とは、あるトランザクションがテーブルに書き込みを行っている最中に別のトランザクションが同じテーブルから読み込みを行うと、後者のトランザクションはまだ確定（コミット）されていない内容を読み込む可能性があることを示す。
【００３６】
「Non-Repeatable Read」とは、あるトランザクションがテーブルから読み込んだ後に別のトランザクションが同じテーブルの内容を更新してコミットを行うと、前者のトランザクションが再度同じテーブルを読み込んだ際、最初とは異なる内容を読み込む可能性があることを示す。
【００３７】
「Phantom Read」とは、あるトランザクションがテーブルから読み込んだ後に別のトランザクションが、同じテーブルについて前者のトランザクションがテーブルを読み込んだ際の条件に符合するような行を変更・挿入・削除を行うと、前者のトランザクションが再度同じテーブルを読み込むと予期せぬ見せ掛けだけの内容を読み込む可能性があることを示す。
【００３８】
上記のように、複数のクライアントまたはアプリケーションソフトウェアは、クライアントＩＤによりそれぞれ一意に識別可能である。クライアントＩＤの例として、たとえば、ＩＤアドレスやポート番号、サーブレットコンテナが発行管理するセッションＩＤ、クライアントから別途送られた認証情報により得られる認証情報などがある。本実施の形態では、あるクライアントにおいて１つのアプリケーションソフトウェアが動作し、そのアプリケーションソフトウェアに対して１つのクライアントＩＤが割り当てられている場合について説明するが、実際の実装はこれに限定されない。
【００３９】
クライアントインタフェース部１２２を経由して指定されたアイソレーションレベルは、クエリ変換部１２４を経由してトランザクション管理部１２６に設定される。
【００４０】
図４は、本実施の形態におけるトランザクション管理テーブル１２８の詳細構成およびトランザクション管理テーブル１２８への登録方法を示す図である。
【００４１】
トランザクション管理部１２６は、トランザクション管理テーブル１２８のクライアントＩＤの中に、アプリケーションソフトウェアと対応付けられたクライアントＩＤがあるかを探す。図４の例では、クライアントＩＤが「Ａ」と「Ｂ」の場合が存在するため、一致したクライアントＩＤに対応するアイソレーションレベルの値を指定されたアイソレーションレベルに設定する。新規クライアント（クライアントＩＤ＝Ｃ）の場合は、トランザクション管理テーブル１２８には該当するクライアントＩＤが存在しないため、新規にトランザクション管理テーブル１２８にレコードを追加する。この際、追加レコードのクライアントＩＤには新規クライアントのクライアントＩＤである「Ｃ」を、アイソレーションレベルにはデフォルトである「READ_COMMITED」をそれぞれ設定する。当然のことながら、アイソレーションレベルのほかにも、クライアントＩＤと１対１に対応可能な情報をトランザクション管理テーブル１２８に追加して管理するようにしてもよい。また、アイソレーションレベルのデフォルトの値は「READ_COMMITED」に限定されるわけではない。以上の動作によって、トランザクション管理部１２６は、クライアントＩＤとトランザクションとの対応、および、各トランザクションとアイソレーションレベルとの対応をそれぞれ管理することができる。
【００４２】
次に、クライアントインタフェース部１２２に対して検索、更新、追加、変更を示す操作が行われた場合について説明する。
【００４３】
図５は、本実施の形態におけるデータベースアクセスの第１の操作例を示す図である。
まず、時刻Ｔ００において、データベース１４０上の最新の世代番号は０１である。
【００４４】
そして、時刻Ｔ０１において、クライアントＩＤ＝Ａから検索操作を行う。
【００４５】
そして、時刻Ｔ０２において、クライアントＩＤ＝ＢからＢ１を変更する操作を行い、その結果、最新の世代番号が０２になる。ここで、「Ｂ１」とは、世代０１のデータベースを変更するための具体的な変更内容を示している。
【００４６】
そして、時刻Ｔ０３において、クライアントＩＤ＝ＣからＣ１を変更する操作を行い、その結果、最新の世代番号が０３になる。ここで、「Ｃ１」とは、世代０２のデータベースを変更するための具体的な変更内容を示している。
【００４７】
そして、時刻Ｔ０４において、クライアントＩＤ＝Ｂから検索操作を行う。
【００４８】
そして、時刻Ｔ０５において、クライアントＩＤ＝ＢからＢ２を変更する操作を行い、その結果、最新の世代番号が０４になる。ここで、「Ｂ２」とは、世代０３のデータベースを変更するための具体的な変更内容を示している。
【００４９】
そして、時刻Ｔ０６において、クライアントＩＤ＝ＣからＣ２を変更する操作を行い、その結果、最新の世代番号が０５になる。ここで、「Ｃ２」とは、世代０４のデータベースを変更するための具体的な変更内容を示している。さらに、クライアントＩＤ＝Ｃはコミット操作を行う。ここで、「コミット操作」とは、この時刻（Ｔ０６）以前にＩＤ＝Ｃのクライアントが行ったデータベースへの変更内容（Ｃ１、Ｃ２）について、データベースへの反映を確定するための操作をいう。
【００５０】
そして、時刻Ｔ０７において、クライアントＩＤ＝ＡからＡ１を変更する操作を行う。ここで、「Ａ１」とは、世代０５のデータベースを変更するための具体的な変更内容を示している。その結果、最新の世代番号が０６になる。さらに、クライアントＩＤ＝Ａはコミット操作を行う。
【００５１】
そして、時刻Ｔ０８において、クライアントＩＤ＝ＢからＢ３を変更する操作を行う。ここで、Ｂ３とは、世代０６のデータベースを変更するための具体的な変更内容を示している。その結果、最新の世代番号が０７になる。
【００５２】
そして、時刻Ｔ０９において、クライアントＩＤ＝Ｂがロールバック操作を行う。ここで、「ロールバック操作」とは、該当トランザクションで行ったデータベースに対する一連の操作を取り消すことを意味する。
【００５３】
トランザクションは、最初のアクセスまたは前回のトランザクション終了後の次のアクセスから開始し、コミットまたはロールバックにより終了する。したがって、クライアントＩＤ＝ＡはＴ０１からＴ０７まで、クライアントＩＤ＝ＢはＴ０２からＴ０９まで、クライアントＩＤ＝ＣはＴ０３からＴ０６までをそれぞれ一トランザクションとして持つ。
【００５４】
変更操作によりデータベース１４０上の最新の世代番号は上記のように遷移するため、各変更操作で使用した変更情報は、それぞれ、Ｂ１は「０２−０１」、Ｃ１は「０３−０２」、Ｂ２は「０４−０３」、Ｃ２は「０５−０４」、Ａ１は「０６−０５」、Ｂ３は「０７−０６」として世代番号の演算を行うことにより求めることができる。ここで、例えば、「０２―０１」とは、世代０２のデータベースの内容から世代０１のデータベースの内容を差し引いた差分内容を意味する。一方、検索操作の場合は、検索の前後で最新の世代番号は変化しない。
【００５５】
図６は、本実施の形態におけるクエリ変換部１２４およびトランザクション管理部１２６の動作の一例（「SERIALIZABLE」の場合）を示すフローチャートである。また、図７（Ａ）〜図７（Ｃ）は、本実施の形態における世代管理テーブル１３０の一例を示す図である。図７（Ａ）は、図５の時刻Ｔ００の時点における世代管理テーブル１３０の内容を示す図であり、テーブル内のレコード（テーブルの各行を意味する）が空であることを示している。世代管理テーブル１３０のレコードは、レコードに関連付けられているとトランザクション（クライアントＩＤで識別可能）と、変更操作を行う際の変更情報と、検索操作や変更操作などの操作の処理を行う前後におけるデータベース１４０上の最新の世代番号と、当該レコードに対応する操作がコミット済みであるかを示すフラグとを保持している。図７（Ｂ）は、図５の時刻Ｔ０４の時点における世代管理テーブル１３０の内容を示す図であり、図７（Ｃ）は、図５の時刻Ｔ０９の時点における世代管理テーブル１３０の内容を示す図である。
【００５６】
以下、図６および図７（Ａ）〜図７（Ｃ）を用いて、世代管理テーブル１３０の制御方法も含めて、クエリ変換部１２４およびトランザクション管理部１２６の動作について説明する。
【００５７】
まず、図６を用いて、クエリ変換部１２４およびトランザクション管理部１２６の動作について説明する。
【００５８】
ステップＳ１０００では、クエリ変換部１２４は、クライアントインタフェース部１２２から受けたクエリおよび付属情報を解析し、操作種別が検索操作、変更操作（更新、追加、削除）、その他の操作（ロールバック、コミットなど）のいずれであるかを判別する。
【００５９】
そして、ステップＳ１１００では、ステップＳ１０００の判定結果がロールバック操作であるか否かを判断する。この判断の結果としてロールバック操作である場合は（Ｓ１０００：ＹＥＳ）、ステップＳ１２００に進み、ロールバック操作でない場合は（Ｓ１０００：ＮＯ）、ステップＳ１５００に進む。
【００６０】
ステップＳ１２００では、トランザクション管理部１２６は、データベース１４０に対して、その時点での最新の世代番号を取得するような操作を発行する。
【００６１】
そして、ステップＳ１３００では、ロールバック用の世代演算式を算出する。ロールバック用世代演算式は、たとえば、
世代演算式＝（最新の世代番号）−（自トランザクションの未コミット分）
で与えられる。
【００６２】
そして、ステップＳ１４００では、クエリ変換部１２４は、ステップＳ１３００で算出されたロールバック用世代演算式を付与したクエリをデータベース１４０に対して発行した後、ステップＳ１６００に進む。
【００６３】
一方、ステップＳ１５００では、ステップＳ１０００の判定結果がコミット操作であるか否かを判断する。この判断の結果としてコミット操作である場合は（Ｓ１５００：ＹＥＳ）、ステップＳ１６００に進み、コミット操作でない場合は（Ｓ１５００：ＮＯ）、ステップＳ１８００に進む。コミット操作でない場合は、検索操作と変更操作のいずれかである。
【００６４】
ステップＳ１６００では、ロールバック操作またはコミット操作を行ったクライアントＩＤをトランザクション管理部１２６に送信した後、クエリ変換部１２４は、動作を終了する。
【００６５】
そして、ステップＳ１７００では、トランザクション管理部１２６は、世代管理テーブル１３０の中から、クエリ変換部１２４から渡されたクライアントＩＤを持つ全レコードについて、コミット済フラグのフィールドの値を「Ｙｅｓ」にする。このようにコミット済フラグフィールドの値を「Ｙｅｓ」にすることは、当該クライアントＩＤのトランザクションを終了させるという意味を持つ。
【００６６】
一方、ステップＳ１８００では、クエリ変換部１２４は、ステップＳ１０００の判定結果が検索操作であるか否かを判断する。この判断の結果として検索操作である場合は（Ｓ１８００：ＹＥＳ）、ステップＳ１９００に進み、検索操作でない場合、つまり、変更操作である場合は（Ｓ１８００：ＮＯ）、ステップＳ２１００に進む。
【００６７】
ステップＳ１９００では、トランザクション管理部１２６は、当該クライアントＩＤが世代管理テーブル１３０に存在するか否かを判断する。この判断の結果として、当該クライアントＩＤが世代管理テーブル１３０に存在する場合は（Ｓ１９００：ＹＥＳ）、ステップＳ２０００に進み、当該クライアントＩＤが世代管理テーブル１３０に存在しない場合は（Ｓ１９００：ＮＯ）、ステップＳ２１００に進む。
【００６８】
ステップＳ２０００では、検索操作用の世代演算式を算出する。この算出は、たとえば、次の３つの段階をとる。まず、第一段階として、世代管理テーブル１３０から、当該クライアントＩＤに関して直近に登録された世代番号を取得する。次に、第二段階として、当該トランザクションの開始以降のレコードから、上記直近に登録されたレコードの間で、当該トランザクション以外のレコードを求める。そして、最後の第三段階で、第一段階で求めた世代番号のデータベースの内容から第二段階で求めた各レコードの変更情報を差し引いたものを算出し、これを検索操作用の世代演算式とする。検索操作用世代演算式の算出が終了すると、ステップＳ２３００に進む。
【００６９】
一方、ステップＳ２１００では、データベース１４０に対して、その時点での最新の世代番号を取得するような操作を発行する。
【００７０】
そして、ステップＳ２２００では、データベース１４０から取得した世代管理番号を世代管理テーブル１３０に登録した後、ステップＳ２３００に進む。ここで、ステップＳ２１００およびステップＳ２２００における一連の処理は、当該クライアントＩＤに対応するトランザクションの開始時におけるデータベース１４０上の最新世代番号を記録するという意味を持つ。
【００７１】
ステップＳ２３００では、クエリ変換部１２４は、クライアントインタフェース部１２２から受けたクエリの変換を行う。このとき、ステップＳ２０００で算出された世代演算式またはステップＳ２１００で取得した世代番号を変換後のクエリに付与するように処理を行う。
【００７２】
そして、ステップＳ２４００では、ステップＳ１８００の判断結果として変更操作であったか否かを判断する。この判断の結果として変更操作であった場合は（Ｓ２４００：ＹＥＳ）、ステップＳ２５００に進み、変更操作でなかった場合、つまり、検索操作であった場合は（Ｓ２４００：ＮＯ）、ただちに動作を終了する。
【００７３】
ステップＳ２５００では、トランザクション管理部１２６は、ステップＳ２１００と同様に、データベース１４０から、その時点での最新世代番号を取得する。
【００７４】
そして、ステップＳ２６００では、ステップＳ２２００で登録したレコードの処理後の世代番号のフィールドに、ステップＳ２５００で取得した世代管理番号を記録する。そして、一連の動作がすべて終了する。
【００７５】
次いで、図５および図７（Ａ）〜図７（Ｃ）を用いて具体的な動作の一例を説明する。
【００７６】
クエリ変換部１２４は、クライアントインタフェース部１２２から受けたクエリおよび付属情報を解析し、操作種別が検索操作、変更操作（更新、追加、削除）、その他の操作（ロールバック、コミットなど）のいずれであるかを判別する（Ｓ１０００）。
【００７７】
図５の時刻Ｔ０１では、クライアントＩＤ＝Ａから検索操作が行われているため、ステップＳ１８００の判定で「ＹＥＳ」の方に、つまり、ステップＳ１９００に進む。
【００７８】
ステップＳ１９００では、世代管理テーブル１３０にクライアントＩＤ＝Ａ、かつ、コミット済フラグ＝「Ｎｏ」を満たすものが存在するかをチェックする。存在する場合には「ＹＥＳ」の方に進むが、現時点では、図７（Ａ）に示すように、世代管理テーブル１３０は空であるため、ステップＳ１９００の判定で「ＮＯ」の方に、つまり、ステップＳ２１００に進む。
【００７９】
ステップＳ２１００では、トランザクション管理部１２６は、データベース１４０に対して、その時点での最新の世代番号を取得するような操作を発行する。そして、ステップＳ２２００では、データベース１４０から取得した世代管理番号を世代管理テーブル１３０に登録する（図７（Ｂ）：（１））。ステップＳ２２００の時点では、世代管理テーブル１３０の処理後世代番号フィールドには「ｎｕｌｌ」を設定する。同様に、検索操作の場合は、変更情報も存在しないため、変更情報フィールドにも「ｎｕｌｌ」を設定する。これらステップＳ２１００およびステップＳ２２００における一連の処理は、クライアントＩＤ＝Ａに対応するトランザクションの開始時におけるデータベース１４０の最新世代番号を記録するという意味を持つ。
【００８０】
その後、ステップＳ２３００では、クエリ変換部１２４は、クライアントインタフェース部１２２から受けたクエリの変換を行う。この際、ステップＳ２１００で取得した世代番号を変換後のクエリに付与するように処理を行う。これにより、時刻Ｔ０１の検索操作に対して、データベース１４０上の現在の世代番号に対する検索を適切に行うことが可能になる。
【００８１】
次に、図５の時刻Ｔ０２では、クライアントＩＤ＝Ｂから変更操作が行われているため、ステップＳ１８００の判定で「ＮＯ」の方に、つまり、ただちにステップＳ２１００に進む。変更操作の場合は、ステップＳ２１００およびステップＳ２２００にて最新の世代番号を取得して、世代管理テーブル１３０に登録する（図７（Ｂ）：（２））。この場合のステップＳ２１００およびステップＳ２２００における一連の処理は、変更操作を行う前段階におけるデータベース１４０上の最新世代番号を記録するという意味を持つ。加えて、時刻Ｔ０２の場合、クライアントＩＤ＝Ｂがまだ世代管理テーブル１３０には存在しないため、クライアントＩＤ（＝Ｂ）に対応するトランザクションの開始時におけるデータベース１３０上の最新世代番号を記録するという意味を兼ねている。
【００８２】
その後、ステップＳ２３００では、時刻Ｔ０１の検索操作の場合と同様に、ステップＳ２１００で取得した世代番号を変更操作クエリに付与し、データベース１４０に対して変換後クエリを発行する。
【００８３】
そして、ステップＳ２４００では、変更操作であるために「ＹＥＳ」の方に、つまり、ステップＳ２５００に進む。ステップＳ２５００では、ステップＳ２１００と同様に、データベース１４０からその時点での最新世代番号を取得する。そして、ステップＳ２６００にて、ステップＳ２２００で登録したレコード（図７（Ｂ）：（２））の処理後の世代番号のフィールドに、ステップＳ２５００で取得した世代番号を記録する。
【００８４】
次に、図５の時刻Ｔ０３の場合も、クライアントＩＤ＝Ｃについて、時刻Ｔ０２の場合と同様の処理を行い、世代管理テーブル１３０に登録する（図７（Ｂ）：（３））。
【００８５】
次に、図５の時刻Ｔ０４では、クライアントＩＤ＝Ｂから検索操作が行われているため、ステップＳ１８００の判定で「ＹＥＳ」の方に、つまり、ステップＳ１９００に進む。また、クライアントＩＤ＝Ｂはすでに世代管理テーブル１３０に存在し、かつ、コミット済フラグ＝「Ｎｏ」である（図７（Ｂ）：（２））ため、ステップＳ１９００の判定で「ＹＥＳ」の方に、つまり、ステップＳ２０００に進む。
【００８６】
ステップＳ２０００では、ステップＳ２３００においてクエリ変換部１２４が変換後のクエリに付与すべき検索操作用の世代演算式を算出する。算出は、第一段階として、世代管理テーブル１３０から、当該クライアントＩＤ＝Ｂに関して直近に登録された世代番号を取得する。たとえば、時刻Ｔ０４では、図７（Ｂ）の（２）のレコードが直近に登録されたレコードである。このとき、当該レコードの処理前世代番号および処理後世代番号の各フィールドのうち、処理後世代番号が「ｎｕｌｌ」でない場合は、処理後世代番号を取得する。一方、処理後世代番号が「ｎｕｌｌ」の場合は、当該レコードの処理前世代番号を取得する。したがって、ステップＳ２０００では、まず図７（Ｂ）の（２）の処理後世代番号＝０２を取得する。次に、第二段階として、当該トランザクションの開始以降のレコードから、上記直近に登録されたレコードの間で、当該トランザクション以外のレコードを求める。先の例では、クライアントＩＤ＝Ｂからのトランザクションの開始レコードは図７の（２）であり、直近に登録されたレコードも図７（Ｂ）の（２）であるため、その間のクライアントＩＤ＝Ｂ以外のレコードは存在しない。そして、最後の第三段階で、第一段階で求めた世代番号（０２）のデータベースの内容から第二段階で求めた各レコードの変更情報（ｎｕｌｌ）を差し引いたものを算出し、これを検索操作用の世代演算式とする。先の例では、検索操作用の世代演算式は世代番号０２であり、ステップＳ２３００ではこの世代番号０２をクエリに付与することになる。
【００８７】
仮に図５の時刻Ｔ０８で、クライアントＩＤ＝ＢがＢ３の変更操作の代わりに検索操作を行った場合には、上記第一段階で求められるレコードは図７（Ｃ）の（４）のレコードとなり、直近に登録された世代番号は０４となる。次に、上記第二段階で求められるクライアントＩＤ＝Ｂからのトランザクションの開始レコードは図７（Ｃ）の（２）となり、直近に登録されたレコードは図７（Ｃ）の（４）となり、その間の他のレコードは図７（Ｃ）の（３）となる。図７（Ｃ）の（３）は変更情報Ｃ１を使用した変更操作であるため、検索操作用の世代演算式は、
世代演算式＝０４−Ｃ１
＝０４−（０３−０２）
となる。
【００８８】
各クライアントＩＤに対応するトランザクションがどのアイソレーションレベルに設定されているかは、トランザクション管理テーブル１２８を参照することによりわかる。図４から、クライアントＩＤ＝Ｂのトランザクションのアイソレーションレベルは、「SERIALIZABLE（直列化可能）」であるとわかる。時刻Ｔ０４の場合、クライアントＩＤ＝Ｂから、クライアントＩＤ＝Ｃが行ったＣ１の変更は見えてはならないが、以上のような処理を行うことにより、世代０２を付与した検索クエリを発行することになり、アイソレーションレベルを考慮した検索を行うことが可能となる。同様に、時刻Ｔ０８で検索操作を行った場合、Ｂ２更新直後の世代０４からクライアントＩＤ＝Ｃが行ったＣ２の変更が見えないような世代演算式を求めているため、適切な検索を行うことが可能となる。
【００８９】
次に、図５の時刻Ｔ０６および時刻Ｔ０７のように、コミット操作が行われている場合には、ステップＳ１５００の判定で「ＹＥＳ」の方に進む。その後、クエリ変換部１２４は、コミット操作を行ったクライアントＩＤをトランザクション管理部１２６へ渡す（Ｓ１６００）。トランザクション管理部１２６は、世代管理テーブル１３０の中から、渡されたクライアントＩＤを持つレコードのすべてのコミット済フラグフィールドの値を「Ｙｅｓ」にすることで、当該レコードに関連する操作がコミットされたことを保持する（Ｓ１７００）。ステップＳ１７００においてコミット済フラグフィールドの値を「Ｙｅｓ」にすることは、当該クライアントＩＤのトランザクションを終了させるという意味を持つ。
【００９０】
次に、図５の時刻Ｔ０９のように、クライアントＩＤ＝Ｂにおいてロールバック操作が行われた場合には、ステップＳ１１００の判定で「ＹＥＳ」の方に、つまり、ステップＳ１２００に進む。ステップＳ１２００では、トランザクション管理部１２６は、データベース１４０に対して、その時点での最新の世代番号を取得するような操作を発行する。
【００９１】
そして、ステップＳ１３００で、トランザクション管理部１２６は、世代管理テーブル１３０の中から、渡されたクライアントＩＤを持ち、変更情報フィールドが「ｎｕｌｌ」でなく、かつ、コミット済フラグが「Ｎｏ」であるレコードを探す。時刻Ｔ０９の時点では、世代管理テーブル１３０の内容は図７（Ｃ）のようになっているため、該当するレコードは図７（Ｃ）の（２）、（４）、（７）となる。ここで、ステップＳ１２００で取得したロールバック時点（時刻Ｔ０９）での最新世代番号（世代０７）から、クライアントＩＤ＝Ｂの変更分（Ｂ１、Ｂ２、Ｂ３）を除けば、適切なロールバックを行うことになる。各レコードの変更情報は、「Ｂ１＝０２−０１」、「Ｂ２＝０４−０３」、「Ｂ３＝０７−０６」として算出可能であるため、ステップＳ１３００で求められるロールバック用の世代演算式は、
世代演算式＝（最新の世代番号）−（自トランザクションの未コミット分）
＝０７−（Ｂ１＋Ｂ２＋Ｂ３）
＝０７＋０１−０２＋０３−０４＋０６−０７
となる。
【００９２】
そして、ステップＳ１４００では、上記ロールバック用世代演算式を付与したクエリをデータベース１４０に対して発行する。データベース１４０は、クライアントＩＤ＝Ｂのトランザクションによる一連の変更操作（Ｂ１、Ｂ２、Ｂ３）を取り除いた最新世代番号＝０８を作成することになる。ロールバック操作により一連のトランザクションは終了することになるため、ステップＳ１６００およびステップＳ１７００を行うことにより、当該クライアントＩＤのトランザクションが終了した状態になるように世代管理テーブル１３０の内容を変更する。具体的には、該当するクライアントＩＤのレコードを削除する（Ｓ１７００）。
【００９３】
以上のように構成することで、世代管理型データベースに対して、アイソレーションレベルが「SERIALIZABLE（直列化可能）」となるような世代番号を付与したクエリを生成することが可能となり、さらには、ＳＱＬやＪＤＢＣなどのように、世代番号を指定するような規定がなされていないクエリ言語等を用いて世代管理型データベースにアクセスすることが可能となる。また、世代管理型データベースに対して、トランザクション機構を備えたデータベースアクセス方式およびアクセス装置を提供することが可能となる。また、従来の非世代管理型データベースで「SERIALIZABLE（直列化可能）」を実現する際に行っていたロック機構（排他制御）が不要となる。
【００９４】
次いで、アイソレーションレベルが「READ UNCOMMITED（非コミット読み取り）」の場合について説明する。これまでの説明と共通する部分については、同一の記号と参照番号を使用し、その説明を省略する。
【００９５】
アイソレーションレベルが「READ UNCOMMITED（非コミット読み取り）」の場合は、他のトランザクションでコミットをしていない状態のものも読み込むことになる。たとえば、図５の時刻Ｔ０４では、クライアントＩＤ＝ＢからクライアントＩＤ＝Ｃが行ったＣ１の変更は見えることになる。
【００９６】
このためには、検索操作時において、常に最新の状態を示す世代番号をクエリに付与するようにクエリ変換部１２４が動作すればよい。
【００９７】
図８は、本実施の形態におけるクエリ変換部１２４およびトランザクション管理部１２６の動作の他の例（「READ UNCOMMITED」の場合)を示すフローチャートである。ここでは、図８のステップＳ２０１０において、データベース１４０から最新の世代番号を取得するようにし、この世代番号をもってステップＳ２３００で変換されたクエリによる検索操作を行うように構成している。より具体的には、その時点での世代管理テーブル１３０の最下欄の「処理後世代番号」を取得することにより、最新の世代のデータベースで検索することが可能になる。
【００９８】
以上のように構成することで、世代管理型データベースに対して、アイソレーションレベルが「READ UNCOMMITED（非コミット読み取り）」となるような世代番号を付与したクエリを生成することが可能となる。
【００９９】
次いで、アイソレーションレベルが「READ COMMITED（コミット済読み取り）」の場合について説明する。これまでの説明と共通する部分については、同一の記号と参照番号を使用し、その説明を省略する。
【０１００】
アイソレーションレベルが「READ COMMITED（コミット済読み取り）」の場合は、他のトランザクションでコミット済みのものであれば読み込みが行われることになる。たとえば、図５の時刻Ｔ０７で、クライアントＩＤ＝ＡがＡ１の変更操作およびコミット操作を行う代わりに検索操作を行ったとする。この場合、クライアントＩＤ＝Ａからは、クライアントＩＤ＝Ｃにより行われたＣ１、Ｃ２の変更は、コミット操作済であるため、クライアントＩＤ＝Ａからは見えることになるが、クライアントＩＤ＝Ｂにより行われたＢ１、Ｂ２は、コミット操作がまだ行われていないため、見えない。
【０１０１】
このためには、検索操作時において、その時点におけるデータベース１４０の最新状態（最新の世代番号）から、自トランザクション以外で未コミットの変更分を差し引いた状態に対して検索処理を行うようにし、そのような世代演算式をクエリに付与するようにクエリ変換部１２４が動作すればよい。
【０１０２】
図９は、本実施の形態における世代管理テーブル１３０の他の例を示す図である。図９は、時刻Ｔ０７での世代管理テーブル１３０の内容を示している。図９に示すように、世代管理テーブル１３０の変更情報フィールドが「ｎｕｌｌ」でなく、自トランザクション（クライアントＩＤ＝Ａ）以外のもので、かつ、コミット済フラグフィールドの値が「Ｎｏ」であるのは、図９の（２）、（４）のレコードで示される。すなわち、先の例では、自トランザクション以外で未コミットの変更分となる変更情報は、図９の（２）のＢ１、図９の（４）のＢ２となる。また、時刻Ｔ０７の時点での最新の世代番号は世代０５である。
【０１０３】
したがって、時刻Ｔ０７でアイソレーションレベルが「READ COMMITED（コミット済読み取り）」として設定されたクライアントＩＤ＝Ａが検索操作を行う場合、クエリ変換部１２４が変換後のクエリに付与すべき世代演算式は、
世代演算式＝（最新の世代番号）−（他トランザクションの未コミット分）
＝０５−（Ｂ１＋Ｂ２）
＝０５＋０１−０２＋０３−０４
となる。
【０１０４】
図１０は、本実施の形態におけるクエリ変換部１２４およびトランザクション管理部１２６の動作のさらに他の例（「READ COMMITED」の場合）を示すフローチャートである。ここでは、図１０のステップＳ２０２０において、トランザクション管理部１２６が上記のようにして世代演算式を算出するようにし、この世代演算式をもってステップＳ２３００で変換されたクエリによる検索操作を行うように構成している。
【０１０５】
以上のように構成することで、世代管理型データベースに対して、アイソレーションレベルが「READ COMMITED（コミット済読み取り）」となるような世代番号を付与したクエリを生成することが可能となる。
【０１０６】
次いで、アイソレーションレベルが「REPEATABLE READ（再読み込み可能読み取り）」の場合について説明する。これまでの説明と共通する部分については、同一の記号と参照番号を使用し、その説明を省略する。
【０１０７】
アイソレーションレベルが「REPEATABLE READ（再読み込み可能読み取り）」の場合は、アイソレーションレベルが「SERIALIZABLE（直列化可能）」の場合に対して「PHANTOM READ」が行われることになる。ここで、「PHANTOM READ」とは、自トランザクションで検索により読み込んだ（１回目）後に、他のトランザクションが上記検索条件に合致するデータを挿入してコミットすると、再度自トランザクションが読み込んだ（２回目）時に上記コミットされたデータが反映されて読み込まれることを示す。
【０１０８】
図１１は、本実施の形態におけるクエリ変換部１２４およびトランザクション管理部１２６の動作のさらに他の例（「REPEATABLE READ」の場合）を示すフローチャートである。ここでは、図１１のステップＳ２０３０において、トランザクション管理部１２６が上記のようにして世代演算式を算出するようにし、この世代演算式をもってステップＳ２３００で変換されたクエリによる検索操作を行うように構成している。
【０１０９】
このときの、ステップＳ２０３０における処理について、図５の時刻Ｔ０８で、クライアントＩＤ＝ＢがＢ３の変更操作の代わりに検索操作を行った場合を例にとって説明する。
【０１１０】
まず、第一段階として、世代管理テーブル１３０から、当該クライアントＩＤ＝Ｂに関して直近に登録された世代番号を取得する。すなわち、図７（Ｃ）の（４）のレコードから世代０４が得られる。次に、第二段階として、上記直近に登録されたレコード（図７（Ｃ）の（４））以降のレコードのうち、トランザクションフィールドの値が当該クライアントＩＤ以外であり、かつ、コミット済フラグフィールドの値が「Ｙｅｓ」となっているレコードを求める。先の例では図７（Ｃ）の（５）、（６）となる。最後の第三段階では、第一段階で求めた世代番号に第二段階で求めた各レコードの変更情報を加えたものを算出し、これを検索操作用の世代演算式とする。先の例では、検索操作用の世代演算式は
世代演算式＝０４＋（Ａ１＋Ｃ２）
＝０４＋（０６−０５＋０５−０４）
＝０６
となる。
【０１１１】
以上のように構成することで、世代管理型データベースに対して、アイソレーションレベルが「REPEATABLE READ（再読み込み可能読み取り）」となるような世代番号を付与したクエリを生成することが可能となる。
【０１１２】
（実施の形態２）
実施の形態２では、世代管理型データベースが世代間の差分処理を行わない場合について説明する。なお、実施の形態１と共通する部分については、同一の記号と参照番号を使用し、その説明を省略する。
【０１１３】
世代管理型データベースのみならず、一般にデータベースは、表構造をしたテーブルでデータを管理している。テーブルのそれぞれの行はレコードと呼ばれ、これが１件のデータとなる。テーブルには主キーを設定したフィールドが存在し、この主キーにより各レコードを一意に識別できるようになっている。また、テーブルには、データベースが各レコードへアクセスするために各レコードの記憶アドレスを擬似フィールドとして持ち、この擬似フィールドにより各レコードを一意に識別することもできる。本実施の形態では、主キーや擬似フィールドにより各レコードを一意に識別できるフィールドを「レコード識別フィールド」と呼ぶことにする。
【０１１４】
図１２は、本発明の実施の形態２における世代管理型データベース上のテーブルの一例（テーブル名：Ｔ＿ＤＯＣ）を示す図である。図１２において、レコードはＣＯＬ０からＣＯＬ３の４つのフィールドからなり、データとして５つのレコードがテーブルＴ＿ＤＯＣに登録されている。また、ＣＯＬ０がレコード識別フィールドとなっており、各レコードのＣＯＬ０の値ｖａｌ０１からｖａｌ０５はそれぞれ異なる値である。
【０１１５】
本実施の形態では、クライアントＩＤ＝Ｂの場合について、図５で示す操作を行った場合を例にとって説明する。ただし、ここでは、図５において、
時刻Ｔ０２のＢ１は更新（Update）を行う変更操作であり、
時刻Ｔ０５のＢ２は削除（Delete）を行う変更操作であり、
時刻Ｔ０８のＢ３は追加（Insert）を行う変更操作であるとする。
【０１１６】
図１３（Ａ）〜図１３（Ｃ）は、各時刻でクライアントＩＤ＝Ｂが行う本実施の形態における変更操作の一例を示す図である。ここでは、更新操作Ｂ１は図１３（Ａ）、削除操作Ｂ２は図１３（Ｂ）、追加操作Ｂ３は図１３（Ｃ）にそれぞれ示すＳＱＬ式により定義されている。
【０１１７】
図１４は、図６に示す実施の形態１におけるクエリ変換部１２４およびトランザクション管理部１２６の「SERIALIZABLE（直列化可能）」の場合の動作フローに対し、本実施の形態における世代間の差分処理を行わない場合で「SERIALIZABLE（直列化可能）」を実現するための動作フローを示す図である。ここで、図１４の動作フローが図６の動作フローと異なる点は、クエリ変換部１２４が、ステップＳ１８００にてクライアントインタフェース部１２２から受けたクエリが変更操作であると判定した場合、追加のステップＳ１８５０で変更情報の加工を行う点である。
【０１１８】
図１５は、図１４の変更情報加工処理の内容を示すフローチャートである。
【０１１９】
まず、時刻Ｔ０２の変更操作Ｂ１では、Ｂ１が更新操作（Update）であるため、ステップＳ１８５２の判定で「ＹＥＳ」の方に、つまり、ステップＳ１８５８に進む。ステップＳ１８５８では、Ｂ１による更新操作により影響を受けるレコードの更新前の状態を取得する。この更新前の状態は、Ｂ１の更新操作がロールバックにより取り消された場合に、データベースの内容を元に戻すために使用される。したがって、ステップＳ１８５８は、データベース１４０が特定操作の状態を復元できるような機能を有していれば省略可能である。
【０１２０】
図１６（Ａ）〜図１６（Ｃ）は、図１５のステップＳ１８５８における更新前状態取得の一例を示す図である。ここで、図１６（Ａ）は、更新前の状態を取得するための一般式であり、＜ｔａｂｌｅ＞には更新（Update）文で指定されたテーブルを、＜ｃｏｎｄｉｔｉｏｎ＞には、必要に応じて、更新（Update）文で指定された「Ｗｈｅｒｅ」節を記述する。図１６（Ｂ）は、Ｂ１の場合の一例であり、これにより、Ｂ１により更新されるレコードの全フィールドを取得可能である。また、全フィールドではなく、図１６（Ｃ）の場合のように、Ｂ１により更新されるフィールド（ＣＯＬ２、ＣＯＬ３）とレコード識別フィールド（ＣＯＬ０）だけを取得することにより、最小限の状態だけを取得することができ、サーバリソースの軽減や通信量の削減を図ることが可能である。
【０１２１】
図１７は、Ｂ１による更新前のテーブルの状態を示す図である。図１７には、更新操作Ｂ１により変更される２つのレコードが列挙されている。また、更新操作により影響を受けるレコードのレコード識別フィールドリストは、｛ｖａｌ０２，ｖａｌ０４｝であることがわかる。
【０１２２】
なお、更新操作がロールバックされた場合には、更新前状態を更新（Update）する変更操作をデータベース１４０に対して行えばよい。図１８は、Ｂ１による更新操作がロールバックされた場合のクエリの一例を示している。
【０１２３】
以上のようにして、クエリ変換部１２４はクライアントインタフェース部１２２から受けたクエリに含まれる変更情報の加工を行う。加工により新たに生成されトランザクション管理部１２６に渡される変更情報は、レコード識別フィールドリスト、ならびに、図１７に示す更新前のテーブル状態と、図１８に示すロールバックされた際に復元するためのクエリのいずれか一方またはその両方である。
【０１２４】
次いで、時刻Ｔ０５の変更操作Ｂ２では、Ｂ２が削除操作であるため、図１５のステップＳ１８５４の判定で「ＹＥＳ」の方に、つまり、ステップＳ１８５８に進む。ステップＳ１８５８では、上記更新操作の場合と同様に、Ｂ２による削除操作により影響を受けるレコードの削除前の状態を取得する。削除操作の場合は、条件に合致するレコードの全フィールドが削除されるため、図１６（Ｂ）に示すように、「ＳＥＬＥＣＴ」文の取得フィールドには、「＊」のように、該当するレコードの全フィールドの状態を取得するようなクエリを発行することが望ましい。
【０１２５】
なお、削除操作がロールバックされた場合には、削除前状態を追加（Insert）する変更操作をデータベース１４０に対して行えばよい。
【０１２６】
本実施の形態におけるＢ２の場合、上記クエリ（図１６（Ｂ））により削除前の状態として図１７と同じ状態を取得することができる。削除操作がロールバックされた際にデータベースの状態を復元するためのクエリの一例を図１９に示す。図１９は、本実施の形態におけるＢ２による削除操作がロールバックされた場合のクエリの一例を示す図である。また、同様に、レコード識別フィールドリストは｛ｖａｌ０２，ｖａｌ０４｝となる。
【０１２７】
以上のようにして、クエリ変換部１２４は加工により新たに生成した変更情報をトランザクション管理部１２６に渡す。
【０１２８】
次いで、時刻Ｔ０８の変更操作Ｂ３では、Ｂ３が追加操作であるため、図１５のステップＳ１８５６の判定で「ＹＥＳ」の方に、つまり、ステップＳ１８６０に進む。ステップＳ１８６０では、Ｂ３による追加操作により追加されるレコードのレコード識別フィールドのリストを取得する。追加されるレコードのレコード識別フィールドのリストは、追加操作中の追加データの値から取得する。たとえば、本実施の形態では、Ｂ３は図１３（Ｃ）に示すクエリで示され、また、レコード識別フィールドはＣＯＬ０であるため、レコード識別フィールドリストは｛１０，１１，１２｝の３件であることがわかる。
【０１２９】
なお、追加操作がロールバックされた場合には、上記レコード識別フィールドリストを持つレコードを削除（Delete）する削除操作をデータベース１４０に対して行えばよい。図２０は、本実施の形態におけるＢ３による追加操作がロールバックされた場合のクエリの一例を示す図である。
【０１３０】
以上のようにして、クエリ変換部１２４は加工により新たに生成した変更情報をトランザクション管理部１２６に渡す。
【０１３１】
トランザクション管理部１２６で世代演算式を算出する場合、実施の形態１で示した世代演算式において、正（加算）の項となっている変更情報に関しては、一旦加工する前の変更情報を持つクエリをデータベース１４０に対して発行し、負（減算）の項となっている変更情報に関しては、該当項に対応する変更情報に含まれる上記ロールバックされた場合のクエリを一旦発行する。そして、実施の形態１で示した世代演算式を構成するすべての項について上記クエリを発行した後、その時点での最新の世代番号を世代演算式とする。この世代番号は、実施の形態１で説明した世代演算式適用後のデータベース状態と同じ状態を示している。
【０１３２】
以上のように構成することで、世代管理型データベースが世代間の差分処理を行わない場合でも、トランザクション管理部１２６の内部で、実施の形態１で説明した世代演算式適用後のデータベース状態と同じ状態を示す世代番号を生成することができ、実施の形態１と同様の効果を得ることができる。
【０１３３】
なお、上記各実施の形態におけるデータベースアクセス装置は、上記のように、クライアントにインストールされるドライバソフトウェアとして利用可能である。また、Ｗｅｂサーバ、アプリケーションサーバ上などで動作しサーブレットエンジンライブラリとしても利用可能である。さらには、データベース上のデーモンプロセスとしても利用可能である。また、ソフトウェアのみならず、本データベースアクセス方式を実装したハードウェアボードとして、クライアントやサーバ、データベースなどに搭載した利用も可能である。
【０１３４】
また、本発明が適用される世代管理型データベースは、世代番号などでデータを管理するものであればどのようなものでもよく、たとえば、プログラムソースコードのバージョン管理システムや、ドラマのような複数の話から構成されたコンテンツの管理配信システムなどへも適用可能である。
【産業上の利用可能性】
【０１３５】
本発明に係るデータベースアクセス装置は、ＳＱＬやＪＤＢＣなどのように、世代番号を指定するような規定がなされていないクエリを用いて世代管理型データベースにアクセスし、ひいては、世代管理型データベースに対して一トランザクション内で参照、変更を複数回行うことができるトランザクション機構を備えたデータベースアクセス装置として有用である。
【図面の簡単な説明】
【０１３６】
【図１】本発明の実施の形態１に係るデータベースアクセス装置を含むデータベースシステムの構成を示すブロック図
【図２】（Ａ）クライアント、データベースアクセス装置、およびデータベースの装置構成の一例を示す図、（Ｂ）クライアント、データベースアクセス装置、およびデータベースの装置構成の他の例を示す図、（Ｃ）クライアント、データベースアクセス装置、およびデータベースの装置構成のさらに他の例を示す図
【図３】ＳＱＬおよびＪＤＢＣによるアイソレーションレベルの設定記述例を示す図
【図４】本実施の形態におけるトランザクション管理テーブルの詳細構成およびトランザクション管理テーブルへの登録方法を示す図
【図５】本実施の形態におけるデータベースアクセスの第１の操作例を示す図
【図６】本実施の形態におけるクエリ変換部およびトランザクション管理部の動作の一例（「SERIALIZABLE」の場合）を示すフローチャート
【図７】（Ａ）本実施の形態における世代管理テーブルの一例を示す図であって図５の時刻Ｔ００の時点における世代管理テーブルの内容を示す図、（Ｂ）図５の時刻Ｔ０４の時点における世代管理テーブルの内容を示す図、（Ｃ）図５の時刻Ｔ０９の時点における世代管理テーブルの内容を示す図
【図８】本実施の形態におけるクエリ変換部およびトランザクション管理部の動作の他の例（「READ UNCOMMITED」の場合)を示すフローチャート
【図９】本実施の形態における世代管理テーブルの他の例を示す図であって図５の時刻Ｔ０７での世代管理テーブルの内容を示す図
【図１０】本実施の形態におけるクエリ変換部およびトランザクション管理部の動作のさらに他の例（「READ COMMITED」の場合）を示すフローチャート
【図１１】本実施の形態におけるクエリ変換部およびトランザクション管理部の動作のさらに他の例（「REPEATABLE READ」の場合）を示すフローチャート
【図１２】本発明の実施の形態２に係るデータベースアクセス装置における世代管理型データベース上のテーブルの一例を示す図
【図１３】（Ａ）実施の形態における変更操作の一例を示す図であって更新操作の場合を示す図、（Ｂ）削除操作の場合を示す図、（Ｃ）追加操作の場合を示す図
【図１４】本実施の形態における世代間の差分処理を行わない場合におけるクエリ変換部およびトランザクション管理部の動作の一例（「SERIALIZABLE」の場合）を示すフローチャート
【図１５】図１４の変更情報加工処理の内容を示すフローチャート
【図１６】（Ａ）図１５のステップＳ１８５８における更新前状態取得の一例を示す図であって更新前の状態を取得するための一般式を示す図、（Ｂ）変更操作Ｂ１の場合の一例を示す図、（Ｃ）変更操作Ｂ１の場合の他の例を示す図
【図１７】本実施の形態における変更操作Ｂ１による更新前のテーブルの状態を示す図
【図１８】本実施の形態における変更操作Ｂ１による更新操作がロールバックされた場合のクエリの一例を示す図
【図１９】本実施の形態における変更操作Ｂ２による削除操作がロールバックされた場合のクエリの一例を示す図
【図２０】本実施の形態における変更操作Ｂ３による追加操作がロールバックされた場合のクエリの一例を示す図
【図２１】（Ａ）データベースアクセスの概念を説明するための図であって参照のクエリが発行された場合を示す図、（Ｂ）変更のクエリが発行された場合を示す図
【符号の説明】
【０１３７】
１００  データベースシステム
１１０  クライアント
１２０  データベースアクセス装置
１２２  クライアントインタフェース部
１２４  クエリ変換部
１２６  トランザクション管理部
１２８  トランザクション管理テーブル
１３０  世代管理テーブル
１４０  データベース
１４２  検索処理部
【図１】
2006040064.tif 000003
【図２】
2006040064.tif 000004
【図３】
2006040064.tif 000005
【図４】
2006040064.tif 000006
【図５】
2006040064.tif 000007
【図６】
2006040064.tif 000008
【図７】
2006040064.tif 000009
【図８】
2006040064.tif 000010
【図９】
2006040064.tif 000011
【図１０】
2006040064.tif 000012
【図１１】
2006040064.tif 000013
【図１２】
2006040064.tif 000014
【図１３】
2006040064.tif 000015
【図１４】
2006040064.tif 000016
【図１５】
2006040064.tif 000017
【図１６】
2006040064.tif 000018
【図１７】
2006040064.tif 000019
【図１８】
2006040064.tif 000020
【図１９】
2006040064.tif 000021
【図２０】
2006040064.tif 000022
【図２１】
2006040064.tif 000023