(57)【要約】【課題】トランザクションを分散処理する際に高度な分離性を可能とする。【解決手段】  コミットログ６３は、過去にコミットしたトランザクションにおいて操作されたレコードのコミット前の値をバックアップする。また、ＣＰＵによるトランザクション演算部４１は、ＲＡＭ内のコミットログ６３にアクセス可能であり、かつストレージ２にアクセス可能であって、あるレコードを読み出す場合に、ストレージ２におけるレコードの値よりコミットログ６３におけるレコードの値を優先して使用しトランザクションを実行する。【選択図】  図２
2008176687.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータにより少なくとも１つのレコードを有するストレージに対してアクセス可能なデータ処理装置において、
前記コンピュータ内でトランザクションを実行する処理装置と、
前記コンピュータ内で前記処理装置に接続され前記ストレージにアクセスするアクセス手段と、
前記コンピュータ内で前記処理装置に接続されたメモリと、
を備え、
前記メモリは、過去にコミットしたトランザクションにおいて操作されたレコードのコミット前の値をバックアップするコミットログを格納し、
前記処理装置は、前記メモリにアクセス可能であり、かつ前記アクセス手段を介して前記ストレージにアクセス可能であって、あるレコードを読み出す場合に、前記ストレージにおけるレコードの値より前記コミットログにおけるレコードの値を優先して使用しトランザクションを実行すること、
を特徴とするデータ処理装置。
【請求項２】
前記メモリは、トランザクションにおいて操作されたレコードの操作後の値を有する個別ログを格納し、
前記処理装置は、あるレコードを読み出す場合に、前記ストレージおよび前記コミットログにおけるレコードの値より前記個別ログにおけるレコードの値を優先して使用しトランザクションを実行すること、
を特徴とする請求項１記載のデータ処理装置。
【請求項３】
前記メモリは、トランザクションにおいて操作されたレコードの操作後の値を有する個別ログを格納し、
前記処理装置は、コミット時に、前記個別ログに値を格納されたレコードに対応する前記ストレージのレコードを読み出し、前記ストレージのレコードの値を前記コミットログとして格納した後に、前記個別ログにおける値を前記ストレージのレコードへ反映させること、
を特徴とする請求項１記載のデータ処理装置。
【請求項４】
前記処理装置は、複数のトランザクションを並行して実行し、コミットするトランザクションにおいて操作されたレコードのコミット前の値を前記コミットログへバックアップするバックアップ処理の間、他のトランザクションのコミットを禁止することを特徴とする請求項１記載のデータ処理装置。
【請求項５】
前記処理装置は、前記バックアップ処理の間、前記他のトランザクションについて、前記ストレージまたは前記コミットログからレコードの読み出しを実行可能であることを特徴とする請求項４記載のデータ処理装置。
【請求項６】
前記処理装置は、トランザクション毎に個別ログを生成し、コミットしたトランザクションの個別ログを消去し、
前記メモリは、トランザクション毎に個別ログを格納すること、
を特徴とする請求項４記載のデータ処理装置。
【請求項７】
前記処理装置は、あるトランザクションのコミットを実行しているときに、他のトランザクションについて、前記ストレージ、前記コミットログおよび前記他のトランザクションの個別ログからレコードの読み出しを実行可能であることを特徴とする請求項６記載のデータ処理装置。
【請求項８】
前記コミットログは、時系列に沿って順番に前記メモリに格納され、
前記処理装置は、あるトランザクションについてレコードの読み出しを行う場合、そのトランザクションの開始時点より後の前記コミットログを参照し、そのレコードについての前記コミットログが存在すれば、前記コミットログからそのレコードの値を取得すること、
を特徴とする請求項１記載のデータ処理装置。
【請求項９】
少なくとも１つのレコードを有するストレージに対してアクセス可能なデータ処理装置において、
過去にコミットしたトランザクションにおいて操作されたレコードのコミット前の値をバックアップするコミットログと、
前記ストレージおよび前記コミットログにアクセス可能であって、あるレコードを読み出す場合に、前記ストレージにおけるレコードの値より前記コミットログにおけるレコードの値を優先して使用しトランザクションを実行するトランザクション処理手段と、
を備えることを特徴とするデータ処理装置。
【請求項１０】
トランザクションにおいて操作されたレコードの操作後の値を有する個別ログと、
前記個別ログに値を格納されたレコードに対応する前記ストレージのレコードを読み出し、前記ストレージのレコードの値を前記コミットログに格納した後に、前記個別ログにおける値を前記ストレージのレコードへ反映させるコミット処理手段とを備え、
前記トランザクション処理手段は、あるレコードを読み出す場合に、前記ストレージおよび前記コミットログにおけるレコードの値より前記個別ログにおけるレコードの値を優先して使用しトランザクションを実行すること、
を特徴とする請求項９記載のデータ処理装置。
【請求項１１】
トランザクションを実行する処理装置と前記処理装置に接続されたメモリとを有するコンピュータを使用して、ストレージにおける少なくとも１つのレコードを操作してトランザクションを実行するトランザクション実行方法において、
前記処理装置により、トランザクションをコミットする際に、そのトランザクションにおいて操作されたレコードのコミット前の値を前記ストレージから読み出してコミットログとして前記メモリに格納し、
前記処理装置により、トランザクションにおいてあるレコードを読み出す場合に、前記ストレージにおけるレコードの値より前記コミットログにおけるレコードの値を優先して使用すること、
を特徴とするトランザクション実行方法。
【請求項１２】
前記処理装置により、複数のトランザクションを並行して実行し、コミットするトランザクションにおいて操作されたレコードのコミット前の値を前記コミットログへバックアップするバックアップ処理の間、他のトランザクションのコミットを禁止することを特徴とする請求項１１記載のトランザクション実行方法。
【請求項１３】
前記処理装置により、トランザクション毎に個別ログを生成し、
前記処理装置により、コミットしたトランザクションの個別ログを消去し、
前記メモリに、トランザクション毎に個別ログを格納すること、
を特徴とする請求項１２記載のトランザクション実行方法。
【請求項１４】
前記コミットログを、時系列に沿って順番に前記メモリに格納し、
あるトランザクションについてレコードの読み出しを行う場合、そのトランザクションの開始時点より後の前記コミットログを参照し、
そのレコードについての前記コミットログが存在すれば、前記コミットログからそのレコードの値を取得すること、
を特徴とする請求項１１記載のトランザクション実行方法。
【請求項１５】
ストレージにおける少なくとも１つのレコードを操作してトランザクションを実行するトランザクション実行方法において、
トランザクションをコミットする際に、そのトランザクションにおいて操作されたレコードのコミット前の値をコミットログにバックアップするステップと、
トランザクションにおいてあるレコードを読み出す場合に、そのレコードの値が前記コミットログにあれば、前記コミットログにおけるレコードの値を使用し、そのレコードの値が前記コミットログになければ、前記ストレージから読み出されたレコードの値を使用するステップと、
を備えることを特徴とするトランザクション実行方法。
【請求項１６】
トランザクションを実行する処理装置と前記処理装置に接続されたメモリとを有するコンピュータに、
前記処理装置により、トランザクションをコミットする際に、そのトランザクションにおいて操作されたレコードのコミット前の値をストレージから読み出してコミットログとして前記メモリに格納させ、
前記処理装置により、トランザクションにおいてあるレコードを読み出す場合に、前記ストレージにおけるレコードの値より前記コミットログにおけるレコードの値を優先して使用させること、
を特徴とするトランザクション実行プログラム。
【請求項１７】
複数のトランザクションを並行して実行させ、コミットするトランザクションにおいて操作されたレコードのコミット前の値を前記コミットログへバックアップするバックアップ処理の間、他のトランザクションのコミットを禁止させることを特徴とする請求項１６記載のトランザクション実行プログラム。
【請求項１８】
トランザクション毎に個別ログを生成させ、
コミットしたトランザクションの個別ログを消去させ、
前記メモリに、トランザクション毎に個別ログを格納させること、
を特徴とする請求項１７記載のトランザクション実行プログラム。
【請求項１９】
前記コミットログを、時系列に沿って順番に前記メモリに格納させ、
あるトランザクションについてレコードの読み出しを行う場合、そのトランザクションの開始時点より後の前記コミットログを参照させ、
そのレコードについての前記コミットログが存在すれば、前記コミットログからそのレコードの値を取得させること、
を特徴とする請求項１６記載のトランザクション実行プログラム。
【請求項２０】
コンピュータに、ストレージにおける少なくとも１つのレコードを操作してトランザクションを実行させるトランザクション実行プログラムにおいて、
トランザクションをコミットする際に、そのトランザクションにおいて操作されたレコードのコミット前の値をコミットログにバックアップするステップと、
トランザクションにおいてあるレコードを読み出す場合に、そのレコードの値が前記コミットログにあれば、前記コミットログにおけるレコードの値を使用し、そのレコードの値が前記コミットログになければ、前記ストレージから読み出されたレコードの値を使用するステップと、
を実行させることを特徴とするトランザクション実行プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、データベースのトランザクション処理に関するものである。
【背景技術】
【０００２】
トランザクションとは、データベースに対して１作業単位として実行される一連の操作である。トランザクションが実行される場合には、原子性、一貫性、分離性および持続性が確保される必要がある。
【０００３】
原子性とは、一連の操作がすべて実行されるか、全く実行されないかのいずれかのみが許されることをいう。
【０００４】
一貫性とは、トランザクション完了時に、すべてのデータの整合が維持されることをいう。
【０００５】
分離性とは、複数のトランザクションがそれぞれ独立してデータを取り扱うことをいう。分離性には、シリアライザブル、反復可能読み込みなどといった複数の分離レベルが存在する。
【０００６】
持続性とは、トランザクションの結果がデータベース内で維持されることをいう。
【０００７】
トランザクションを実行する装置としては、例えば特許文献１に記載のものがある。この装置では、トランザクション実行時、書き込みはトランザクションログに対して行われ、読み込みはデータベースから行われる。トランザクションログは、データベースのあるディスクストレージに書き込まれる。そして、コミット時に、トランザクションログの内容がデータベースへ反映される。コミット時、読み込みは、トランザクションログから行われる。
【０００８】
【特許文献１】米国特許第６４１８４５５号
【発明の開示】
【発明が解決しようとする課題】
【０００９】
上記のシステムでは、ある程度の分離性は維持されるものの、あるトランザクションがコミットすると、データベース内で、そのトランザクションにより操作されたレコードの値が変わってしまう。そのため、上記のシステムでは、高度な分離性を維持することが困難である。
【００１０】
例えば、同時に開始された２つのトランザクションの一方がコミットされた後に、他方のトランザクションでレコードの読み出しが行われた場合、そのレコードはトランザクション開始時の値を維持していない可能性がある。
【００１１】
また、例えば、同時に開始された２つのトランザクションのうちの、トランザクション＃１がコミットされる前にトランザクション＃２でレコードの読み出しが行われ、トランザクション＃１がコミットされた後にトランザクション＃２で同じレコードが再度読み出された場合、異なる値が読み出される可能性がある。
【００１２】
本発明は、トランザクションを分散処理する際に高度な分離性を可能とすることを目的とする。
【課題を解決するための手段】
【００１３】
上記の課題を解決するために、本発明では以下のようにした。
【００１４】
本発明に係るデータ処理装置の１つは、コンピュータ内でトランザクションを実行する処理装置と、コンピュータ内で処理装置に接続されストレージにアクセスするアクセス手段と、コンピュータ内で処理装置に接続されたメモリとを備える。そして、メモリは、コミットログを格納する。コミットログは、過去にコミットしたトランザクションにおいて操作されたレコードのコミット前の値をバックアップするデータである。また、処理装置は、メモリにアクセス可能であり、かつアクセス手段を介してストレージにアクセス可能であって、あるレコードを読み出す場合に、ストレージにおけるレコードの値よりコミットログにおけるレコードの値を優先して使用しトランザクションを実行する。
【００１５】
これにより、他のトランザクションがコミットした後でも、トランザクション開始時のレコード値をメモリ上のコミットログから取得することができる。このため、トランザクションを分散処理する際に高度な分離性を維持することができる。
【００１６】
また、本発明に係るデータ処理装置は、上記のデータ処理装置に加え、次のようにしてもよい。つまり、その場合、メモリは、個別ログを格納する。個別ログは、トランザクションにおいて操作されたレコードの操作後の値を有する。そして、処理装置は、あるレコードを読み出す場合に、ストレージおよびコミットログにおけるレコードの値より個別ログにおけるレコードの値を優先して使用しトランザクションを実行する。
【００１７】
これにより、自己のトランザクションの実行によりレコード値が変更した場合には、メモリ上の個別ログからレコード値が読み出される。このため、ストレージにアクセスする頻度が減り、高速にトランザクションを実行することができる。
【００１８】
また、本発明に係るデータ処理装置は、上記のデータ処理装置のいずれかに加え、次のようにしてもよい。つまり、その場合、メモリは、個別ログを格納する。個別ログは、トランザクションにおいて操作されたレコードの操作後の値を有する。そして、処理装置は、コミット時に、個別ログに値を格納されたレコードに対応するストレージのレコードを読み出し、ストレージのレコードの値をコミットログとして格納した後に、個別ログにおける値をストレージのレコードへ反映させる。
【００１９】
また、本発明に係るデータ処理装置は、上記のデータ処理装置のいずれかに加え、次のようにしてもよい。つまり、その場合、処理装置は、複数のトランザクションを並行して実行し、コミットログへのバックアップ処理の間、他のトランザクションのコミットを禁止する。
【００２０】
また、本発明に係るデータ処理装置は、上記のデータ処理装置のいずれかに加え、次のようにしてもよい。つまり、その場合、処理装置は、バックアップ処理の間、他のトランザクションについて、ストレージまたはコミットログからレコードの読み出しを実行可能である。
【００２１】
これにより、レコード読み出しがロックされる期間が短くなり、トランザクションの処理時間を短くすることができる。
【００２２】
また、本発明に係るデータ処理装置は、上記のデータ処理装置のいずれかに加え、次のようにしてもよい。つまり、その場合、処理装置は、トランザクション毎に個別ログを生成し、コミットしたトランザクションの個別ログを消去する。また、メモリは、トランザクション毎に個別ログを格納する。
【００２３】
これにより、あるトランザクションの個別ログが他のトランザクションからアクセスされることがなく、トランザクションごとにアドレス空間も別個のものとすることができ、分散処理が行い易くなる。
【００２４】
また、本発明に係るデータ処理装置は、上記のデータ処理装置のいずれかに加え、次のようにしてもよい。つまり、その場合、処理装置は、あるトランザクションのコミットを実行しているときに、他のトランザクションについて、ストレージ、コミットログおよび他のトランザクションの個別ログからレコードの読み出しを実行可能である。
【００２５】
これにより、レコード読み出しがロックされる期間が短くなり、トランザクションの処理時間を短くすることができる。
【００２６】
また、本発明に係るデータ処理装置は、上記のデータ処理装置のいずれかに加え、次のようにしてもよい。つまり、その場合、コミットログは、時系列に沿って順番にメモリに格納される。処理装置は、あるトランザクションについてレコードの読み出しを行う場合、そのトランザクションの開始時点より後のコミットログを参照し、そのレコードについてのコミットログが存在すれば、そのコミットログからそのレコードの値を取得する。
【００２７】
これにより、コミットログの参照が最小限となり、レコード読み出しが高速に行うことができる。このため、トランザクションを高速に実行することができる。
【００２８】
本発明に係るデータ処理装置の１つは、過去にコミットしたトランザクションにおいて操作されたレコードのコミット前の値をバックアップするコミットログと、ストレージおよびコミットログにアクセス可能であって、あるレコードを読み出す場合に、ストレージにおけるレコードの値よりコミットログにおけるレコードの値を優先して使用しトランザクションを実行するトランザクション処理手段とを備える。
【００２９】
これにより、他のトランザクションがコミットした後でも、トランザクション開始時のレコード値をコミットログから取得することができる。このため、トランザクションを分散処理する際に高度な分離性を維持することができる。
【００３０】
また、本発明に係るデータ処理装置は、上記のデータ処理装置に加え、次のようにしてもよい。つまり、その場合、データ処理装置は、個別ログとコミット処理手段とを備える。個別ログは、トランザクションにおいて操作されたレコードの操作後の値を有する。コミット処理手段は、個別ログに値を格納されたレコードに対応するストレージのレコードを読み出し、ストレージのレコードの値をコミットログに格納した後に、個別ログにおける値をストレージのレコードへ反映させる。そして、トランザクション処理手段は、あるレコードを読み出す場合に、ストレージおよびコミットログにおけるレコードの値より個別ログにおけるレコードの値を優先して使用しトランザクションを実行する。
【００３１】
これにより、自己のトランザクションの実行によりレコード値が変更した場合には、メモリ上の個別ログからレコード値が読み出される。このため、ストレージにアクセスする頻度が減り、高速にトランザクションを実行することができる。
【００３２】
本発明に係るトランザクション実行方法の１つは、処理装置により、トランザクションをコミットする際に、そのトランザクションにおいて操作されたレコードのコミット前の値をコミットログとしてメモリに格納し、処理装置により、トランザクションにおいてあるレコードを読み出す場合に、ストレージにおけるレコードの値よりコミットログにおけるレコードの値を優先して使用する。
【００３３】
これにより、他のトランザクションがコミットした後でも、トランザクション開始時のレコード値をコミットログから取得することができる。このため、トランザクションを分散処理する際に高度な分離性を維持することができる。
【００３４】
また、本発明に係るトランザクション実行方法は、上記のトランザクション実行方法に加え、次のようにしてもよい。つまり、その場合、処理装置により、複数のトランザクションを並行して実行し、コミットするトランザクションにおいて操作されたレコードのコミット前の値をコミットログへバックアップするバックアップ処理の間、他のトランザクションのコミットを禁止する。
【００３５】
また、本発明に係るトランザクション実行方法は、上記のトランザクション実行方法のいずれかに加え、次のようにしてもよい。つまり、その場合、処理装置により、トランザクション毎に個別ログを生成し、コミットしたトランザクションの個別ログを消去する。また、メモリに、トランザクション毎に個別ログを格納する。
【００３６】
これにより、あるトランザクションの個別ログが他のトランザクションからアクセスされることがなく、トランザクションごとにアドレス空間も別個のものとすることができ、分散処理が行い易くなる。
【００３７】
また、本発明に係るトランザクション実行方法は、上記のトランザクション実行方法のいずれかに加え、次のようにしてもよい。つまり、その場合、コミットログは、時系列に沿って順番にメモリに格納される。そして、あるトランザクションについてレコードの読み出しを行う場合、そのトランザクションの開始時点より後のコミットログを参照し、そのレコードについてのコミットログが存在すれば、そのコミットログからそのレコードの値を取得する。
【００３８】
これにより、コミットログの参照が最小限となり、レコード読み出しが高速に行うことができる。このため、トランザクションを高速に実行することができる。
【００３９】
また、本発明に係るトランザクション実行方法の１つは、トランザクションをコミットする際に、そのトランザクションにおいて操作されたレコードのコミット前の値をコミットログにバックアップするステップと、トランザクションにおいてあるレコードを読み出す場合に、そのレコードの値がコミットログにあれば、コミットログにおけるレコードの値を使用し、そのレコードの値がコミットログになければ、ストレージから読み出されたレコードの値を使用するステップとを備える。
【００４０】
これにより、他のトランザクションがコミットした後でも、トランザクション開始時のレコード値をコミットログから取得することができる。このため、トランザクションを分散処理する際に高度な分離性を維持することができる。
【００４１】
本発明に係るトランザクション実行プログラムは、処理装置により、トランザクションをコミットする際に、そのトランザクションにおいて操作されたレコードのコミット前の値をストレージから読み出してコミットログとしてメモリに格納させ、処理装置により、トランザクションにおいてあるレコードを読み出す場合に、ストレージにおけるレコードの値よりコミットログにおけるレコードの値を優先して使用させる。
【００４２】
これにより、他のトランザクションがコミットした後でも、トランザクション開始時のレコード値をコミットログから取得することができる。このため、トランザクションを分散処理する際に高度な分離性を維持することができる。
【００４３】
また、本発明に係るトランザクション実行プログラムは、上記のトランザクション実行プログラムに加え、次のようにしてもよい。つまり、その場合、複数のトランザクションを並行して実行させ、コミットするトランザクションにおいて操作されたレコードのコミット前の値をコミットログへバックアップするバックアップ処理の間、他のトランザクションのコミットを禁止させる。
【００４４】
また、本発明に係るトランザクション実行プログラムは、上記のトランザクション実行プログラムのいずれかに加え、次のようにしてもよい。つまり、その場合、トランザクション毎に個別ログを生成させ、コミットしたトランザクションの個別ログを消去させ、メモリに、トランザクション毎に個別ログを格納させる。
【００４５】
これにより、あるトランザクションの個別ログが他のトランザクションからアクセスされることがなく、トランザクションごとにアドレス空間も別個のものとすることができ、分散処理が行い易くなる。
【００４６】
また、本発明に係るトランザクション実行プログラムは、上記のトランザクション実行プログラムのいずれかに加え、次のようにしてもよい。つまり、その場合、コミットログを、時系列に沿って順番にメモリに格納させる。そして、あるトランザクションについてレコードの読み出しを行う場合、そのトランザクションの開始時点より後のコミットログを参照させる。そのレコードについてのコミットログが存在すれば、そのコミットログからそのレコードの値を取得させる。
【００４７】
これにより、コミットログの参照が最小限となり、レコード読み出しが高速に行うことができる。このため、トランザクションを高速に実行することができる。
【００４８】
また、本発明に係るトランザクション実行プログラムは、トランザクションをコミットする際に、そのトランザクションにおいて操作されたレコードのコミット前の値をコミットログにバックアップするステップと、トランザクションにおいてあるレコードを読み出す場合に、そのレコードの値がコミットログにあれば、コミットログにおけるレコードの値を使用し、そのレコードの値がコミットログになければ、ストレージから読み出されたレコードの値を使用するステップとを実行させる。
【００４９】
これにより、他のトランザクションがコミットした後でも、トランザクション開始時のレコード値をコミットログから取得することができる。このため、トランザクションを分散処理する際に高度な分離性を維持することができる。
【発明の効果】
【００５０】
本発明によれば、トランザクションを分散処理する際に高度な分離性を維持することができる。
【発明を実施するための最良の形態】
【００５１】
以下、図に基づいて本発明の一実施の形態を説明する。
【００５２】
図１は、本発明の実施の形態に係るデータベースシステムの構成を示すブロック図である。図１において、サーバ装置１は、本発明のデータ処理装置の一実施の形態である。サーバ装置１には、プログラムを有するコンピュータシステムが使用される。また、ストレージ２は、データを「レコード」として格納するデータ格納装置である。ストレージ２は、サーバ装置１との通信を行うインタフェースと物理的にデータを記録する記録媒体とを有する。ストレージ２には、ハードディスクドライブ、ディスクアレイ、ファイルサーバなどの装置が使用される。
【００５３】
サーバ装置１は、ＣＰＵ１１、ＲＯＭ１２、ＲＡＭ１３、ハードディスクドライブ１４、インタフェース１５、通信装置１６およびインタフェース１７を有する。サーバ装置１において、ＣＰＵ１１、ＲＯＭ１２、ＲＡＭ１３等は、コンピュータを構成する。
【００５４】
ＣＰＵ（Central Processing Unit ）１１は、ＲＯＭ１２またはハードディスクドライブ１４に予め格納されＲＡＭ１３にロードされたプログラムを実行し、プログラムに記述された処理を実行する処理装置である。
【００５５】
また、ＲＯＭ（Read Only Memory）１２は、プログラムおよびデータを予め記憶した不揮発性のメモリである。また、ＲＡＭ（Random Access Memory）１３は、プログラムを実行する際にそのプログラムおよびデータを一時的に記憶するメモリである。
【００５６】
また、ＨＤＤ（Hard Disc Drive ）１４は、図示せぬオペレーティングシステムや、データベースエンジンとしてのプログラム２１などのアプリケーションプログラムを格納する記録媒体としてのハードディスク駆動装置である。なお、ＣＤ−ＲＯＭ、ＤＶＤ−ＲＯＭ等の可搬型の記録媒体にプログラム２１を格納し、その可搬型記録媒体からプログラムを読み出すドライブ装置をＨＤＤ１４の代わりに設けるようにしてもよい。
【００５７】
また、インタフェース１５は、ストレージ２にアクセス可能なアクセス手段としてのインタフェース回路である。インタフェース１５には、周辺機器用のインタフェース、ネットワークインタフェースなどの通信機器が使用される。周辺機器用のインタフェースとしては、ＳＣＳＩ（Small Computer System Interface ）、ＩＤＥ（Integrated Device Electronics ）互換のもの、ＩＥＥＥ１３９４、ＵＳＢ（Universal Serial Bus）などがある。ネットワークインタフェースとしては、イーサネット（登録商標）などがある。
【００５８】
また、通信装置１６は、ネットワークインタフェースカード、モデムなどといった、外部装置との通信に使用される装置である。なお、インタフェース１５をネットワークインタフェースとする場合には、通信装置１６の代わりにインタフェース１５を使用してもよい。通信装置１６は、通信回線を介して、トランザクションを供給する１または複数の外部クライアント装置と通信する。
【００５９】
上述のＣＰＵ１１、ＲＯＭ１２、ＲＡＭ１３、ＨＤＤ１４、インタフェース１５、通信装置１６は、１台のコンピュータ内で、バス、ブリッジコントローラなどにより互いに接続される。なお、これらの接続形態は、特に限定されるものではない。
【００６０】
例えば、サーバ用コンピュータなどを使用してこのシステムを実現する場合には、ＣＰＵ１１などを接続したマザーボードをサーバ用コンピュータの筐体内に配置し、そのサーバ用コンピュータにインタフェースを介してストレージ２が接続される。
【００６１】
次に、プログラム２１をＣＰＵ１１により実行した際に実現される処理部およびデータ構造について説明する。図２は、図１のデータ処理装置における処理部およびデータ構造を示すブロック図である。
【００６２】
図２において、トランザクション演算部４１は、１つのトランザクションにおける一連の操作および演算を行うトランザクション処理手段としての演算部である。トランザクションにおける命令としては、ＳＥＬＥＣＴ、ＵＰＤＡＴＥ、ＩＮＳＥＲＴ、ＤＥＬＥＴＥなどがある。レコードを読み出すＳＥＬＥＣＴ命令を実行する場合、トランザクション演算部４１は、ストレージ２、個別ログ５１およびコミットログ６３を参照し、分離性を維持したデータ読み出しを行う。トランザクションコンテキスト４２は、１つのトランザクションにおけるデータである。トランザクションコンテキスト４２は、個別ログ５１およびコミットログ参照情報５２を有する。個別ログ５１は、トランザクションにおいて変更（更新、挿入または削除）が発生したレコードの情報を有するデータである。個別ログ５１は、各トランザクションのローカルデータであって、他のトランザクションからはアクセスされない。コミットログ参照情報５２は、時系列に配列された１または複数のコミットログ６３における、トランザクション発生時点の先頭（最新）のコミットログ６３を指すポインタ（データ）である。トランザクションコンテキスト４２は、ＲＡＭ１３に格納される。
【００６３】
１つのトランザクション演算部４１および１つのトランザクションコンテキスト４２により、１つのトランザクションを処理するトランザクション処理部６１が構成される。マルチスレッドに対応したオペレーティングシステムが使用される場合には、１つのトランザクション処理部６１に１つのスレッドが割り当てられる。
【００６４】
また、トランザクションマネージャ６２は、トランザクション発生時にトランザクション処理部６１を生成し、トランザクション完了時にトランザクション処理部６１を消去する処理部である。また、トランザクションマネージャ６２は、トランザクションのコミット時に、コミットログ６３へのレコードの値のバックアップ、およびストレージ２への書き込みを行うコミット処理手段としての処理部である。
【００６５】
また、コミットログ６３は、コミットしたトランザクションにおいて値に変更が発生したレコードの、変更前の値をバックアップするデータである。コミットログ６３は、１回
の変更につき１つ、発生した順番でＲＡＭ１３に格納される。
【００６６】
次に、図２における構成をＣ＋＋、Ｃ＃などのオブジェクト指向言語に基づき実装した場合の一例について説明する。図３は、図２における処理部およびデータ構造の具体例を示すブロック図である。
【００６７】
図２における１つのトランザクション処理部６１は、図３における１対のトランザクションコンテキスト（ＴＣ）クラスインスタンス８１および個別ログバッファ（ＯＬＢ）クラスインスタンス８２により実装される。ＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２は、１つのトランザクションにつき１つずつ生成される。
【００６８】
ＴＣクラスインスタンス８１は、メソッド９１、およびデータとしてのポインタ９２〜９５を有する。メソッド９１は、トランザクション演算部４１に対応する。メソッド９１には、ＩＮＳＥＲＴ命令を実行するｉｎｓｅｒｔメソッド、ＤＥＬＥＴＥ命令を実行するｄｅｌｅｔｅメソッド、ＵＰＤＡＴＥ命令を実行するｕｐｄａｔｅメソッド、およびＳＥＬＥＣＴ命令を実行するｓｅｌｅｃｔメソッドがある。ポインタ９４は、コミットログ参照情報５２に対応する。また、ポインタ９２は、ＯＬＢクラスインスタンス８２へのポインタである。ポインタ９３は、トランザクションマネージャ（ＴＭ）クラスインスタンス８３へのポインタである。ポインタ９５は、ストレージクラスインスタンス８５へのポインタである。
【００６９】
ＯＬＢクラスインスタンス８２は、メソッド１０１、およびデータとしての挿入ログ１０２、更新ログ１０３および削除ログ１０４を有する。挿入ログ１０２、更新ログ１０３および削除ログ１０４は、それぞれ個別ログ５１である。メソッド１０１には、挿入ログ１０２を追加するｉｎｓｅｒｔメソッド、更新ログ１０３を追加するｕｐｄａｔｅメソッド、削除ログ１０４を追加するｄｅｌｅｔｅメソッドなどがある。このＯＬＢクラス８２に対応するトランザクションでＩＮＳＥＲＴ命令が実行される場合、ＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２のｉｎｓｅｒｔメソッドが呼び出されて、挿入ログ１０２が追加される。このＯＬＢクラス８２に対応するトランザクションでＵＰＤＡＴＥ命令が実行される場合、ＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２のｕｐｄａｔｅメソッドが呼び出されて、更新ログ１０３が追加される。このＯＬＢクラス８２に対応するトランザクションでＤＥＬＥＴＥ命令が実行される場合、ＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２のｄｅｌｅｔｅメソッドが呼び出されて、削除ログ１０４が追加される。
【００７０】
図２におけるトランザクションマネージャ６２は、図３におけるＴＭクラスインスタンス８３により実装される。ＴＭクラスインスタンス８３は、すべてのＴＣクラスインスタンスに対して１つだけ存在する。ＴＭクラスインスタンス８３は、メソッド１１１として、ＴＣクラスインスタンス８１を生成するｂｅｇｉｎメソッド、トランザクションをコミットするｃｏｍｍｉｔメソッド、トランザクションをロールバックするｒｏｌｌｂａｃｋメソッドなどを有し、データとして、ポインタ１１２〜１１４を有する。１または複数のポインタ１１２のそれぞれは、各ＴＣクラスインスタンス８１へのポインタである。ポインタ１１３は、コミットログバッファ（ＣＬＢ）クラスインスタンス８４へのポインタである。ポインタ１１４は、ストレージクラスインスタンス８５へのポインタである。
【００７１】
図２におけるコミットログ６３は、図３におけるＣＬＢクラスインスタンス８４により実装される。ＣＬＢクラスインスタンス８４は、メソッド１２１として、コミットログ６３を追加するｉｎｓｅｒｔＬｏｇメソッドを有し、データとして、ポインタ１２２および一連のコミットログ６３を有する。ポインタ１２２は、一連のコミットログ６３における先頭（最新）のコミットログ６３へのポインタである。
【００７２】
また、図２における各処理部のストレージ２に対する入出力は、図３におけるストレージクラスインスタンス８５により実装される。ストレージクラスインスタンス８は、メソッド１３１として、レコードを単位としたデータ入出力関数を提供する。メソッド１３１には、最初のレコードを読み込むｒｅａｄＦｉｒｓｔメソッド、２番目以降のレコードを読み込むｒｅａｄＮｅｘｔメソッド、レコードを削除するｄｅｌｅｔｅメソッド、レコードの値を更新するｕｐｄａｔｅメソッド、レコードを挿入するｉｎｓｅｒｔメソッドなどがある。
【００７３】
ここで、この実施の形態における各データのフォーマットを説明する。図４（Ａ）〜図４（Ｆ）は、この実施の形態におけるデータフォーマットの一例を示す図である。
【００７４】
図４（Ａ）に示すように、フィールドは、データとその長さを有するデータ単位である。次に、図４（Ｂ）に示すように、レコードは、レコードの識別子ｏｉｄ、フィールド数ｎｕｍ−ｆｉｅｌｄｓ、レコードの長さを調節するパディングｎｕｌｌＢｙｔｅｓ、および１または複数のフィールドを有するデータ単位である。例えば、ｏｉｄのデータ長は４バイト、ｎｕｍ−ｆｉｅｌｄｓのデータ長は２バイト、ｎｕｌｌＢｙｔｅｓのデータ長は（ｎｕｍ−ｆｉｅｌｄｓ）／８バイトとされる。識別子ｏｉｄには、レコードに固有の値が割り当てられる。フィールド数ｎｕｍ−ｆｉｅｌｄｓの値は、レコード内のフィールド数とされる。パディングｎｕｌｌＢｙｔｅｓの値はすべてｎｕｌｌ（通常はゼロ）とされる。
【００７５】
また、図４（Ｃ）に示すように、コミットログは、属性ｔｙｐｅとレコードとからなる。属性ｔｙｐｅの値は、挿入、更新および削除のそれぞれに対応する値（例えば、１，２，３）とされる。コミットログのレコードの値は、更新または削除の場合、コミット前の、ストレージ２におけるレコードの値とされ、挿入の場合、ｎｕｌｌ（ｏｉｄ＝０，ｎｕｍ−ｆｉｅｌｄｓ＝０，ｎｕｌｌＢｙｔｅｓ＝０）とされる。
【００７６】
また、図４（Ｄ）〜図４（Ｆ）に示すように、個別ログ５１のうち、挿入ログ１０２（図４（Ｄ））および更新ログ１０３（図４（Ｆ））には、挿入および更新後のレコードの値が格納される。削除ログ１０４（図４（Ｅ））には、削除されたレコードの識別子ｏｉｄのみが格納される。
【００７７】
次に、上記装置の動作について説明する。
【００７８】
まず、ＨＤＤ１４のプログラム２１が、ＲＡＭ１３にロードされ、ＣＰＵ１１がプログラム２１の実行を開始する。これにより、まず、ＴＭクラスインスタンス８３、ＣＬＢクラスインスタンス８４およびストレージクラスインスタンス８５が生成される。
【００７９】
そして、１または複数の外部クライアント装置（図示せず）から通信装置１６を介してトランザクションが受信されると、ＣＰＵ１１は、プログラム２１に従って、以下のように、トランザクションを実行する。図５は、図１のサーバ装置におけるトランザクション処理を説明するフローチャートである。
【００８０】
１つのトランザクションが受信されると、まず、トランザクションマネージャ６２がトランザクションコンテキスト４２を含む１つのトランザクション処理部６１を生成する（ステップＳ１）。その際、ＴＭクラスインスタンス８３のｂｅｇｉｎメソッドにより、ＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２が生成される。
【００８１】
次に、トランザクション演算部４１によりそのトランザクションが実行される（ステップＳ２）。トランザクション演算部４１は、そのトランザクションに記述されているレコード操作および演算を実行する。演算としては、四則演算がある。レコード操作としては、データベース内のレコードの読み出し、更新、挿入および削除がある。レコードの読み込みは、ＳＥＬＥＣＴ処理として実行され、レコードの更新は、ＵＰＤＡＴＥ処理として実行され、レコードの挿入は、ＩＮＳＥＲＴ処理として実行され、レコードの削除は、ＤＥＬＥＴＥ処理として実行される。
【００８２】
その際、ＳＥＬＥＣＴ処理は、ＴＣクラスインスタンス８１のｓｅｌｅｃｔメソッドにより実行され、ストレージ２、個別ログ５１およびコミットログ６３のいずれかに格納されたレコードの値が、戻り値（つまり、読み出した値）とされる。
【００８３】
ＳＥＬＥＣＴ処理では、分離性を確保するために、ストレージ２内のレコードの値が、トランザクション発生時点でのレコードの値に維持されている必要がある。後述するが、本実施の形態では、コミット済みの他のトランザクションによりストレージ２におけるレコードの値が変更されている場合には、トランザクション発生時点でのレコードの値は、コミットログ６３にバックアップされている。したがって、ＳＥＬＥＣＴ処理の対象となるレコードがコミットログ６３に格納されている場合には、コミットログ６３内のレコードの値が優先して使用される。その際、コミットログ６３のうち、トランザクション発生時点より後のもののみが参照され、トランザクション発生時点以前のレコードの値は使用されない。また、トランザクション開始後に、自己によりレコードの値が変更され、その後にそのレコードを読み出す場合には、個別ログ５１内のレコードの値が使用される。
【００８４】
また、ＵＰＤＡＴＥ処理は、ＴＣクラスインスタンス８１のｕｐｄａｔｅメソッドにより実行され、更新後のレコード値が、個別ログ５１の更新ログ１０３に追加される。また、ＩＮＳＥＲＴ処理は、ＴＣクラスインスタンス８１のｉｎｓｅｒｔメソッドにより実行され、挿入されたレコードの値が、個別ログ５１の挿入ログ１０２に追加される。また、ＤＥＬＥＴＥ処理は、ＴＣクラスインスタンス８１のｄｅｌｅｔｅメソッドにより実行され、削除されたレコードの識別子が、個別ログ５１の削除ログ１０４に追加される。ＵＰＤＡＴＥ処理、ＩＮＳＥＲＴ処理およびＤＥＬＥＴＥ処理では、ストレージ２へのアクセスは発生せず、ＲＡＭ１３へのアクセスのみが発生する。
【００８５】
そして、トランザクションに記述されているレコード操作および演算が完了すると、トランザクションマネージャ６２が、コミット処理を実行する（ステップＳ３）。コミット処理は、ＴＭクラスインスタンス８３のｃｏｍｍｉｔメソッドにより実行される。このデータベースシステムでは、コミット処理において、コミット対象のトランザクションの実行により変更が生じたレコードの値を個別ログ５１からストレージ２へ反映させる前に、ストレージ２内のそのレコードの値をコミットログ６３へバックアップする。そして、バックアップ後に、個別ログ５１内のレコードの値が、ストレージ２内の対応するレコードの値へ反映される。このようにしてコミット処理が実行された後、トランザクションマネージャ６２は、コミットされたトランザクションのトランザクション処理部６１を消去する。つまり、そのトランザクションのＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２が消去される。
【００８６】
以上のように、１つのトランザクションが処理される。複数のトランザクションが受信された場合には、同時に並行して複数のトランザクションが上述のように処理される。
【００８７】
このデータベースシステムでは、個別ログ５１およびコミットログ６３を使用することで、トランザクションで発生した変更がトランザクション内で保持されるとともに、他のトランザクションのコミットによるレコード値への影響を受けずに済む。このため、複数のトランザクションが並列して実行されるデータベースシステムにおいて、各トランザクションが、実行開始時点のレコードの状態に基づいて実行される。
【００８８】
また、複数のトランザクションが処理される場合、例えば複数のスレッドにより分散処理される。ＳＥＬＥＣＴ以外の処理では、コミットログ６３、ストレージ２などのスレッド外へのデータアクセスが発生しないので、高速にトランザクション処理が実行される。
【００８９】
次に、上述のトランザクションコンテキスト生成（ステップＳ１）、ＵＰＤＡＴＥ処理、ＩＮＳＥＲＴ処理、ＤＥＬＥＴＥ処理、ＳＥＬＥＣＴ処理およびコミット処理（ステップＳ３）の詳細を説明する。
【００９０】
１．トランザクションコンテキスト生成
【００９１】
図６は、本発明の実施の形態におけるトランザクションコンテキスト生成を説明するフローチャートである。トランザクションコンテキスト生成は、ＴＭクラスインスタンス８３のｂｅｇｉｎメソッドにより実行される。
【００９２】
まず、ＴＣクラスインスタンス８１が生成される（ステップＳ１１）。そして、そのＴＣクラスインスタンス８１へのポインタ１１２がＴＭクラスインスタンス８３に追加される（ステップＳ１２）。
【００９３】
次に、ＣＬＢクラスインスタンス８４がロックされる（ステップＳ１３）。その時点でのＣＬＢクラスインスタンスにおけるポインタ１２３の値が、ＴＣクラスインスタンス８１のポインタ９４にセットされる（ステップＳ１４）。その後、ＣＬＢクラスインスタンス８４のロックが解除される（ステップＳ１５）。これにより、トランザクションコンテキスト生成時、つまりトランザクション開始時の先頭のコミットログ６３へのポインタ値がＴＣクラスインスタンス８１におけるポインタ９４にセットされる。
【００９４】
そして、ＯＬＢクラスインスタンス８２が生成され（ステップＳ１６）、そのＯＬＢクラスインスタンス８２へのポインタ値がＴＣクラスインスタンスのポインタ９２にセットされる（ステップＳ１７）。これにより、ＴＣクラスインスタンス８１とＯＬＢクラスインスタンス８２との対応関係が確立される。
【００９５】
このようにして、１つのトランザクションに対応して１つのＴＣクラスインスタンス８１および１つのＯＬＢクラスインスタンス８２が生成され、データの初期化が行われる。
【００９６】
２．ＵＰＤＡＴＥ処理
【００９７】
図７は、本発明の実施の形態におけるＵＰＤＡＴＥ処理を説明するフローチャートである。ＵＰＤＡＴＥ処理は、ＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２のｕｐｄａｔｅメソッドにより実行される。ＵＰＤＡＴＥ処理では、ｕｐｄａｔｅメソッドの引数として指定されたレコードが、ＯＬＢクラスインスタンス８２の更新ログ１０３に追加される（ステップＳ２１）。したがって、ＵＰＤＡＴＥ処理では、ストレージ２へのアクセスは発生しない。
【００９８】
３．ＩＮＳＥＲＴ処理
【００９９】
図８は、本発明の実施の形態におけるＩＮＳＥＲＴ処理を説明するフローチャートである。ＩＮＳＥＲＴ処理は、ＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２のｉｎｓｅｒｔメソッドにより実行される。ＩＮＳＥＲＴ処理では、ｉｎｓｅｒｔメソッドの引数として指定されたレコードが、ＯＬＢクラスインスタンス８２の挿入ログ１０２に追加される（ステップＳ３１）。したがって、ＩＮＳＥＲＴ処理では、ストレージ２へのアクセスは発生しない。
【０１００】
４．ＤＥＬＥＴＥ処理
【０１０１】
図９は、本発明の実施の形態におけるＤＥＬＥＴＥ処理を説明するフローチャートである。ＤＥＬＥＴＥ処理は、ＴＣクラスインスタンス８１およびＯＬＢクラスインスタンス８２のｄｅｌｅｔｅメソッドにより実行される。ＤＥＬＥＴＥ処理では、ｄｅｌｅｔｅメソッドの引数として指定されたレコードが、ＯＬＢクラスインスタンス８２の削除ログ１０４に追加される（ステップＳ４１）。したがって、ＤＥＬＥＴＥ処理では、ストレージ２へのアクセスは発生しない。
【０１０２】
５．ＳＥＬＥＣＴ処理
【０１０３】
図１０は、本発明の実施の形態におけるＳＥＬＥＣＴ処理を説明するフローチャートである。ＳＥＬＥＣＴ処理は、ＴＣクラスインスタンス８１のｓｅｌｅｃｔメソッドにより実行される。
【０１０４】
ＳＥＬＥＣＴ処理では、ｓｅｌｅｃｔメソッドの引数として１または複数のレコードが指定される。そして、指定された最初のレコードが、ストレージ２から読み出される（ステップＳ５１）。
【０１０５】
そのレコードが存在する場合、つまり、レコードの読み出しに成功した場合（ステップＳ５２）、個別ログ５１を参照して、そのレコードが更新されたか否かが確認される（ステップＳ５３）。そのレコードが更新されていない場合（ステップＳ５４）、個別ログ５１を参照して、そのレコードが削除されたか否かが確認される（ステップＳ５５）。
【０１０６】
そのレコードが削除されていない場合（ステップＳ５６）、コミットログ６３を参照してそのレコードが更新されたか否かが確認される（ステップＳ５７）。そのレコードが更新されていない場合（ステップＳ５８）、コミットログ６３を参照してそのレコードが挿入されたものか否かが確認される（ステップＳ５９）。
【０１０７】
そのレコードが挿入されたものではない場合（ステップＳ６０）、ストレージ２から読み出されたそのレコードの値が保存される（ステップＳ６１）。つまり、個別ログ５１およびコミットログ６３のいずれにもそのレコードのログがない場合には、ストレージ２から読み出されたレコード値が、ＳＥＬＥＣＴ処理の対象のレコードの値として使用される。
【０１０８】
一方、そのレコードが更新されていると個別ログ５１に基づき判断された場合には（ステップＳ５４）、そのレコードの値が個別ログ５１における更新後のレコード値へ変更され（ステップＳ６２）、保存される。つまり、そのレコードの更新ログ１０３がある場合には、更新ログ１０３内のレコード値が、ＳＥＬＥＣＴ処理の対象のレコードの値として使用される。
【０１０９】
また、そのレコードが削除されていると個別ログ５１に基づき判断された場合には（ステップＳ５６）、レコードを保存せずに、そのレコードの読み込み処理が終了する。つまり、読み込み処理の戻り値としてｎｕｌｌが返され、そのレコードの読み込みに失敗したことになる。
【０１１０】
さらに、そのレコードが更新されているとコミットログ６３に基づき判断された場合には（ステップＳ５８）、そのレコードの値がコミットログ６３におけるレコード値へ変更され（ステップＳ６３）、保存される。つまり、そのレコードについて属性が「更新」であるコミットログ６３がある場合には、そのコミットログ６３内のレコード値が、ＳＥＬＥＣＴ処理の対象のレコードの値とされる。
【０１１１】
また、そのレコードが挿入されているとコミットログ６３に基づき判断された場合には（ステップＳ６０）、レコードを保存せずに、そのレコードの読み込み処理が終了する。つまり、読み込み処理の戻り値としてｎｕｌｌが返され、そのレコードの読み込みに失敗したことになる。
【０１１２】
また、ストレージ２にそのレコードが存在しない場合には（ステップＳ５２）、そのレコードの読み込み処理が終了する。つまり、読み込み処理の戻り値としてｎｕｌｌが返され、そのレコードの読み込みに失敗したことになる。
【０１１３】
そして、最初のレコードについての読み込み処理が完了すると、次のレコードの読み込みが実行される（ステップＳ６４）。図１１は、図１０のステップＳ６４の処理を説明するフローチャートである。
【０１１４】
次のレコードを読み込む場合、まず、次のレコードが、ストレージ２から読み出される（ステップＳ７１）。そのレコードがストレージ２に存在する場合（つまり、ストレージ２からの読み出しに成功した場合）、そのレコード値が、次のレコードの、ストレージ２での値と見なされて使用される（ステップＳ７３）。
【０１１５】
一方、ストレージ２にそのレコードが存在しない場合、そのレコードが、個別ログ５１の挿入ログ１０２から読み出される（ステップＳ７５）。そのレコードが挿入ログ１０２に存在する場合、そのレコード値が、次のレコードの、ストレージ２での値と見なされて使用される（ステップＳ７６）。
【０１１６】
また、挿入ログ１０２にもそのレコードが存在しない場合、そのレコードが、コミットログ６３の「削除」属性のログから読み出される（ステップＳ７７）。そのレコードがコミットログ６３の「削除」属性のログに存在する場合、そのレコード値が、次のレコードの、ストレージ２での値と見なされて使用される（ステップＳ７９）。
【０１１７】
そして、コミットログ６３の「削除」属性のログにもそのレコードが存在しない場合には、そのレコードが存在しないと判断される（ステップＳ８０）。つまり、戻り値としてｎｕｌｌが返される。
【０１１８】
読み込み対象のレコードが存在する場合には、そのレコードに対してステップＳ５３〜Ｓ６１の処理が実行される。
【０１１９】
そして、読み込み対象のレコードがなくなるまで読み込み処理が繰り返し実行される。読み込み対象のレコードがなくなると（ステップＳ６５）、ＳＥＬＥＣＴ処理が終了する。
【０１２０】
６．コミット処理
【０１２１】
図１２は、本発明の実施の形態におけるコミット処理を説明するフローチャートである。コミット処理は、ＴＭクラスインスタンス８３のｃｏｍｍｉｔメソッドにより実行される。
【０１２２】
まず、他のトランザクションのコミット処理がロックされる。つまり、トランザクションのコミット処理が実行されると、他のトランザクションのコミット処理が制限される（ステップＳ９１）。ロック状態では、あるトランザクションのコミット処理中に、他のトランザクションのコミット処理を開始することができない。なお、他のトランザクションのコミット処理は制限されるが、他のトランザクションについてのそれ以外の処理（ＳＥＬＥＣＴ処理など）は制限されない。
【０１２３】
次に、ＣＬＢクラスインスタンス８４がロックされる（ステップＳ９２）。この状態では、他のトランザクションについてのＣＬＢクラスインスタンス８４へのアクセスが制限される。
【０１２４】
そして、個別ログ５１の削除ログ１０４のレコードが、ストレージ２からコミットログ６３へバックアップされる（ステップＳ９３）。図１３は、本発明の実施の形態における、削除ログ１０４で指定されるレコードのバックアップについて説明するフローチャートである。まず、１つの削除ログ１０４の読み出しが実行される（ステップＳ１１１）。削除ログ１０４が存在する場合には（ステップＳ１１２）、その削除ログ１０４から、削除対象のレコードの識別子ｏｉｄが取得される（ステップＳ１１３）。次に、取得された識別子ｏｉｄのレコードがストレージ２から読み出される（ステップＳ１１４）。そのレコードに、「削除」の属性ｔｙｐｅを追加してコミットログ６３が生成される（ステップＳ１１５）。生成されたコミットログ６３は、ＣＬＢクラスインスタンス８４へ追加される（ステップＳ１１６）。そして、ステップＳ１１１〜Ｓ１１６の処理が、すべての削除ログ１０４に対して実行されるまで、各削除ログ１０４に対して順番に実行される。
【０１２５】
また、個別ログ５１の更新ログ１０３のレコードが、ストレージ２からコミットログ６３へバックアップされる（ステップＳ９４）。図１４は、本発明の実施の形態における、更新ログ１０３で指定されるレコードのバックアップについて説明するフローチャートである。まず、１つの更新ログ１０３の読み出しが実行される（ステップＳ１２１）。更新ログ１０３が存在する場合には（ステップＳ１２２）、その更新ログ１０３から、更新対象のレコードの識別子ｏｉｄが取得される（ステップＳ１２３）。次に、取得された識別子ｏｉｄのレコードがストレージ２から読み出される（ステップＳ１２４）。そのレコードに、「更新」の属性ｔｙｐｅを追加してコミットログ６３が生成される（ステップＳ１２５）。生成されたコミットログ６３は、ＣＬＢクラスインスタンス８４へ追加される（ステップＳ１２６）。そして、ステップＳ１２１〜Ｓ１２６の処理が、すべての更新ログ１０３に対して実行されるまで、各更新ログ１０３に対して順番に実行される。
【０１２６】
また、個別ログ５１の挿入ログ１０４のレコードが、コミットログ６３へバックアップされる（ステップＳ９５）。図１５は、本発明の実施の形態における、挿入ログ１０２で指定されるレコードのバックアップについて説明するフローチャートである。まず、１つの挿入ログ１０２の読み出しが実行される（ステップＳ１３１）。挿入ログ１０２が存在する場合には（ステップＳ１３２）、その挿入ログ１０２から、挿入対象のレコードの識別子ｏｉｄが取得される（ステップＳ１３３）。次に、値をｎｕｌｌ（ｏｉｄ＝０，ｎｕｍ−ｆｉｅｌｄｓ＝０，ｎｕｌｌＢｙｔｅｓ＝０）としたレコードに、「挿入」の属性ｔｙｐｅを追加してコミットログ６３が生成される（ステップＳ１３４）。生成されたコミットログ６３は、ＣＬＢクラスインスタンス８４へ追加される（ステップＳ１３５）。そして、ステップＳ１３１〜Ｓ１３５の処理が、すべての挿入ログ１０２に対して実行されるまで、各挿入ログ１０２に対して順番に実行される。
【０１２７】
このように、操作されたレコードのコミット前の値がコミットログ６３へバックアップされる。そして、ＣＬＢクラスインスタンス８４のロックが解除される（ステップＳ９６）。
【０１２８】
その後、ストレージ２に対して、個別ログ５１の削除ログ１０４がストレージ２のレコードに反映される（ステップＳ９７）。つまり、削除ログ１０４の識別子ｏｉｄで指定されるレコードがストレージ２から削除される。また、ストレージ２に対して、個別ログ５１の更新ログ１０３が、識別子ｏｉｄで指定されるストレージ２のレコードに反映される（ステップＳ９８）。つまり、更新ログ１０３のレコードがストレージ２へ書き込まれる。また、ストレージ２に対して、個別ログ５１の挿入ログ１０２が、識別子ｏｉｄで指定されるストレージ２のレコードに反映される（ステップＳ９９）。つまり、挿入ログ１０２のレコードがストレージ２へ書き込まれる。
【０１２９】
このように、操作前のレコード値のバックアップおよび操作後のレコードの反映が完了した後、他のトランザクションのコミット処理のロックが解除される（ステップＳ１００）。コミット処理が完了すると、コミットされたＴＣクラスインスタンス８１とＯＬＢクラスインスタンス８２が消去される。
【０１３０】
以上のように、上記実施の形態によれば、ＲＡＭ１３は、過去にコミットしたトランザクションにおいて操作されたレコードのコミット前の値をバックアップするコミットログ６３を格納する。また、ＣＰＵ１１は、ＲＡＭ１３にアクセス可能であり、かつインタフェース１５を介してストレージ２にアクセス可能であって、あるレコードを読み出す場合に、ストレージ２におけるレコードの値よりコミットログ６３におけるレコードの値を優先して使用しトランザクションを実行する。
【０１３１】
これにより、他のトランザクションがコミットした後でも、トランザクション開始時のレコード値をコミットログ６３から取得することができる。このため、トランザクションを分散処理する際に高度な分離性を維持することができる。
【０１３２】
また、上記実施の形態によれば、ＲＡＭ１３は、個別ログ５１を格納する。個別ログ５１は、トランザクションにおいて操作されたレコードの操作後の値を有する。そして、トランザクションが実行される際、あるレコードを読み出すときに、ストレージ２およびコミットログ６３におけるレコードの値より個別ログ５１におけるレコードの値が優先して使用される。
【０１３３】
これにより、自己のトランザクションの実行によりレコード値が変更した場合には、ＲＡＭ１３内の個別ログ５１からレコード値が読み出される。このため、ストレージ２にアクセスする頻度が減り、高速にトランザクションを実行することができる。
【０１３４】
また、上記実施の形態によれば、バックアップ処理の間、他のトランザクションについて、ストレージ２またはコミットログ６３からレコードの読み出しが実行可能である。
【０１３５】
これにより、レコード読み出しがロックされる期間が短くなり、トランザクションの処理時間を短くすることができる。
【０１３６】
また、上記実施の形態によれば、トランザクション毎に個別ログ５１が生成され、コミットしたトランザクションの個別ログ５１は消去される。また、ＲＡＭ１３には、トランザクション毎に個別ログ５１が格納される。
【０１３７】
これにより、あるトランザクションの個別ログ５１が他のトランザクションからアクセスされることがなく、トランザクションごとにアドレス空間も別個のものとすることができ、分散処理が行い易くなる。
【０１３８】
また、上記実施の形態によれば、あるトランザクションのコミット処理を実行しているときに、他のトランザクションについて、ストレージ２、コミットログ６３および他のトランザクションの個別ログ５１からレコードの読み出しが実行可能である。
【０１３９】
これにより、レコード読み出しがロックされる期間が短くなり、トランザクションの処理時間を短くすることができる。
【０１４０】
また、上記実施の形態によれば、コミットログ６３は、時系列に沿って順番にＲＡＭ１３に格納される。あるトランザクションについてレコードの読み出しが実行される場合、そのトランザクションの開始時点より後のコミットログ６３のみが参照される。そして、そのレコードについてのコミットログ６３が存在すれば、そのコミットログ６３からそのレコードの値が取得される。
【０１４１】
これにより、コミットログ６３の参照が最小限となり、レコード読み出しが高速に行うことができる。このため、トランザクションを高速に実行することができる。
【０１４２】
なお、上述の実施の形態は、本発明の好適な例であるが、本発明は、これらに限定されるものではなく、本発明の要旨を逸脱しない範囲において、種々の変形、変更が可能である。
【０１４３】
例えば、サーバ装置１とストレージ２は、コンピュータネットワークを介して接続されるようにしてもよい。その場合には、インタフェース１５として、ネットワークインタフェースなどが使用される。例えば、１つのＬＡＮに、トランザクションを受信するサーバ装置１、ストレージ２、およびトランザクションを送信する複数のクライアント装置を接続するようにしてもよい。
【０１４４】
また、上記実施の形態ではサーバ装置１のＣＰＵ１１は１つであるが、共有メモリを使用する複数のＣＰＵで複数のトランザクションを分散処理するようにしてもよい。また、複数のコアを有するＣＰＵ１１により分散処理を行うようにしてもよい。
【０１４５】
また、コミットログ６３の最大数を予め決めておき、コミットログ６３の数が最大数に達したら、最も古いコミットログ６３を削除して、次のコミットログ６３を追加するようにしてもよい。
【０１４６】
また、トランザクション発生時、トランザクション消去時などのタイミングで、あるいは定期的に、現時点で存在するトランザクションのうち、最も古いものの開始時点以前のコミットログ６３を削除するようにしてもよい。
【産業上の利用可能性】
【０１４７】
本発明は、例えば、データベースエンジンに適用可能である。
【図面の簡単な説明】
【０１４８】
【図１】本発明の実施の形態に係るデータベースシステムの構成を示すブロック図である。
【図２】図１のデータ処理装置における処理部およびデータ構造を示すブロックズである。
【図３】図２における処理部およびデータ構造の具体例を示すブロック図である。
【図４】この実施の形態におけるデータフォーマットの一例を示す図である。
【図５】図１のサーバ装置におけるトランザクション処理を説明するフローチャートである。
【図６】本発明の実施の形態におけるトランザクションコンテキスト生成を説明するフローチャートである。
【図７】本発明の実施の形態におけるＵＰＤＡＴＥ処理を説明するフローチャートである。
【図８】本発明の実施の形態におけるＩＮＳＥＲＴ処理を説明するフローチャートである。
【図９】本発明の実施の形態におけるＤＥＬＥＴＥ処理を説明するフローチャートである。
【図１０】本発明の実施の形態におけるＳＥＬＥＣＴ処理を説明するフローチャートである。
【図１１】図１０のステップＳ６４の処理を説明するフローチャートである。
【図１２】本発明の実施の形態におけるコミット処理を説明するフローチャートである。
【図１３】本発明の実施の形態における、削除ログで指定されるレコードのバックアップについて説明するフローチャートである。
【図１４】本発明の実施の形態における、更新ログで指定されるレコードのバックアップについて説明するフローチャートである。
【図１５】本発明の実施の形態における、挿入ログで指定されるレコードのバックアップについて説明するフローチャートである。
【符号の説明】
【０１４９】
１  サーバ装置（データ処理装置）
２  ストレージ
１１  ＣＰＵ（処理装置）
１３  ＲＡＭ（メモリ）
１５  インタフェース（アクセス手段）
４１  トランザクション演算部（トランザクション処理手段）
５１  個別ログ
６２  トランザクションマネージャ（コミット処理手段）
６３  コミットログ
【図１】
2008176687.tif 000003
【図２】
2008176687.tif 000004
【図３】
2008176687.tif 000005
【図４】
2008176687.tif 000006
【図５】
2008176687.tif 000007
【図６】
2008176687.tif 000008
【図７】
2008176687.tif 000009
【図８】
2008176687.tif 000010
【図９】
2008176687.tif 000011
【図１０】
2008176687.tif 000012
【図１１】
2008176687.tif 000013
【図１２】
2008176687.tif 000014
【図１３】
2008176687.tif 000015
【図１４】
2008176687.tif 000016
【図１５】
2008176687.tif 000017