(57)【要約】【課題】複数のノードでデータを分散して保持する場合に一貫性のあるスナップショットを取得する。【解決手段】スナップショット取得指示を受けた第１のノードからスナップショット要求を受信すると、稼働中のトランザクションを特定し、当該稼働中のトランザクションの状態を表すデータを、第１のノードに送信する。稼働中のトランザクションを特定した後、稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施する。第１のノードから、スナップショットデータにトランザクションの結果を反映させる特定のトランザクションのリストを受信し、特定のトランザクションについては正常終了阻止処理の対象から外して特定のトランザクションの全ての正常終了又はキャンセルを確認した後の特定の時刻を基準に、コピーオンライトを実行させる。【選択図】図２２
2012018449.tif 000002
【特許請求の範囲】
【請求項１】
スナップショットの取得指示を受けた第１のノードからスナップショットリクエストを受信すると、稼働中のトランザクションを特定し、当該稼働中のトランザクションの状態を表すデータを、前記第１のノードに送信する送信ステップと、
前記稼働中のトランザクションを特定した後、前記稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施するステップと、
前記第１のノードから、スナップショットデータにトランザクションの結果を反映させる特定のトランザクションのリスト又は前記スナップショットデータにトランザクションの結果を反映させない他のトランザクションのリストを受信する受信ステップと、
前記特定のトランザクションについては前記正常終了阻止処理の対象から外して前記特定のトランザクションの全ての正常終了又はキャンセルを確認した後の特定の時刻を基準に、コピーオンライトを実行させるコピーオンライト開始ステップと、
を、第２のノードに実行させるためのスナップショット取得処理プログラム。
【請求項２】
前記正常終了阻止処理が、コミットの受信阻止のための処理であり、
前記コピーオンライト開始ステップが、
前記特定のトランザクションのプロセスに、受信阻止されていたコミットを出力するステップ
を含む請求項１記載のスナップショット取得処理プログラム。
【請求項３】
前記稼働中のトランザクションが、前記コミットの受信前のトランザクションのうち否定応答を出力したトランザクション及びアボートを受信したトランザクションを除外したトランザクションである
請求項２記載のスナップショット取得処理プログラム。
【請求項４】
前記正常終了阻止処理が、前記コミットを受信していないトランザクションからの確認応答の送信を阻止する送信阻止処理を含み、
前記特定の時刻後に、前記送信阻止処理が行われた前記確認応答を、トランザクションコーディネータに送信するステップと、
前記特定の時刻後に、前記他のトランザクションに、正常終了又はキャンセルを行わせるステップと、
をさらに前記第２のノードに実行させるための請求項２又は３記載のスナップショット取得処理プログラム。
【請求項５】
スナップショットの取得指示を受けると、システムに属する複数の第１のノードの各々に、スナップショットリクエストを送信するステップと、
前記複数の第１のノードの各々から、前記稼働中のトランザクションの識別子及び当該トランザクションの状態を表すデータを受信し、送信元ノードの識別子に対応付けてデータ格納部に格納するステップと、
前記データ格納部に識別子が格納されているトランザクションのうち、関係する全ての送信元ノードにおいて確認応答出力済みであるトランザクションを選択トランザクションとして特定するステップと、
前記選択トランザクションのリスト又は前記データ格納部に識別子が格納されているトランザクションのうち前記選択トランザクション以外のトランザクションである他のトランザクションのリストを、前記複数の第１のノードの各々に送信するステップと、
を、第２のノードに実行させるためのスナップショット取得処理プログラム。
【請求項６】
スナップショットの取得指示を受けたノードからスナップショットリクエストを受信するパティシパント処理部と、
稼働中のトランザクションを特定し、当該稼働中のトランザクションの状態を表すデータを生成するトランザクションマネージャと、
を有し、
前記パティシパント処理部は、
前記稼働中のトランザクションの状態を表すデータを前記ノードに送信し、
前記トランザクションマネージャは、
前記稼働中のトランザクションを特定した後、前記稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施し、
前記パティシパント処理部は、
前記ノードから、スナップショットデータにトランザクションの結果を反映させる特定のトランザクションのリスト又は前記スナップショットデータにトランザクションの結果を反映させない他のトランザクションのリストを受信し、
前記特定のトランザクションについては前記正常終了阻止処理の対象から外して前記特定のトランザクションの全ての正常終了又はキャンセルを確認した後の特定の時刻を基準に、コピーオンライトを実行させる
コンピュータ。
【請求項７】
スナップショットの取得指示を受けると、システムに属する複数のノードの各々に、スナップショットリクエストを送信し、前記複数のノードの各々から、前記稼働中のトランザクションの識別子及び当該トランザクションの状態を表すデータを受信し、送信元ノードの識別子に対応付けてデータ格納部に格納する送受信部と、
前記データ格納部に識別子が格納されているトランザクションのうち、関係する全ての送信元ノードにおいて確認応答出力済みであるトランザクションを選択トランザクションとして特定するトランザクション選択部と、
を有し、
前記送受信部が、
前記選択トランザクションのリスト又は前記データ格納部に識別子が格納されているトランザクションのうち前記選択トランザクション以外のトランザクションである他のトランザクションのリストを、前記複数のノードの各々に送信する
コンピュータ。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、複数ノードでデータを分散して保持する技術に関する。
【背景技術】
【０００２】
クラウドコンピューティングの世界では、大規模なデータを大規模な分散システム（おおよそ百から万のオーダの計算機をネットワークで結合したもの）に格納し、処理することが行われている。このようなシステムを、例えば分散データストアと呼ぶことにする。これらは、従来からある一般にリレーショナルデータベース（ＲＤＢ）を分散化したシステムである分散データベースに比べ、高いスケーラビリティや耐障害性を持つことを特徴としている。但し、現段階では、機能的には、ＲＤＢにはまだ及ばない。以下、分散データストアと分散データベースを合わせて、「分散データシステム」と呼ぶことにする。
【０００３】
このような分散データシステムにおいてスナップショット（すなわちデータ全体のある時点におけるコピー）を取得することを考える。スナップショットはある時点でのものであるから、取得直後は別として、一般には最新ではない。しかし、ある時点にさかのぼって情報を見たい場合に有用である。また、更新が多いシステムでデータ全体を参照するような集計処理を行う場合、他のユーザの処理と衝突する可能性がある。スナップショットは更新させることがないため、スナップショットに対しては衝突なしで処理を行うことができる。また、スナップショットを用いる処理は最新のデータでなくても十分な場合が多いので、最新のデータにこだわることはない。しかしながら、データの一貫性は保持すべきである。
【０００４】
例えば、トランザクションの途中でスナップショットを採取すると、一貫性を失う可能性があるため、分散データシステムに含まれる複数のノードでトランザクションが実施されている場合には問題となる。具体的には、図１に示すように、口座Ａから口座Ｂへ１００万円を移すトランザクションｔ１がノード１及びノード２に跨って処理されているものとする。すなわち、サブトランザクションｔ１−１はノード１で実行され、サブトランザクションｔ１−２はノード２で実行されている。ここで、スナップショットＳ１が、ノード１ではトランザクションｔ１の前で、ノード２では、トランザクションｔ１の後で取られている。そうすると、口座Ａ及び口座Ｂ全体の金額が３００万円という結果がスナップショットに含まれることになり、全体として１００万円金額が増えてしまっている。このように、一貫性がないスナップショットは、集計処理や分析処理で問題となる。
【０００５】
また、スナップショットについてはコピーオンライト（copy-on-write）と呼ばれる手法が用いられる場合がある。このコピーオンライトでは、仮想的にコピーを取ったように見せかけ、後続の書き込み（すなわちwrite）時に前の値をコピーするというものである。更新が頻繁な基幹系のシステムでは、スナップショットを用いる集計処理や分析処理を同時実行すると衝突が発生する可能性が高い。しかし、このようなコピーオンライトを用いれば見かけ上即時にスナップショット取得処理が完了するため、両者が衝突せずに同時実行することが可能となる。しかしながら、上で述べたように、トランザクションが複数のノードに跨がって実行されるような状況において、コピーオンライトをどのように活用すべきかの考察は従来はなされていない。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２００７−１０２６９２号公報
【特許文献２】特開２００８−１０８２５８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
１つの側面では、分散データシステムのように複数のノードでデータを分散して保持する場合に、一貫性のあるスナップショットを取得するための技術を提供することを目的とする。
【課題を解決するための手段】
【０００８】
スナップショット取得処理方法は、（Ａ）スナップショットの取得指示を受けた第１のノードからスナップショットリクエストを受信すると、稼働中のトランザクションを特定し、当該稼働中のトランザクションの状態を表すデータを、第１のノードに送信する送信ステップと、（Ｂ）稼働中のトランザクションを特定した後、稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施するステップと、（Ｃ）第１のノードから、スナップショットデータにトランザクションの結果を反映させる特定のトランザクションのリスト又はスナップショットデータにトランザクションの結果を反映させない他のトランザクションのリストを受信する受信ステップと、（Ｄ）特定のトランザクションについては正常終了阻止処理の対象から外して特定のトランザクションの全ての正常終了又はキャンセルを確認した後の特定の時刻を基準に、コピーオンライトを実行させるコピーオンライト開始ステップとを含む。
【０００９】
また、スナップショット取得処理方法は、（Ａ）スナップショットの取得指示を受けると、複数の第１のノードの各々に、スナップショットリクエストを送信するステップと、（Ｂ）複数の第１のノードの各々から、稼働中のトランザクションの識別子及び当該トランザクションの状態を表すデータを受信し、送信元ノードの識別子に対応付けてデータ格納部に格納するステップと、（Ｃ）データ格納部に識別子が格納されているトランザクションのうち、関係する全ての送信元ノードにおいて確認応答出力済みであるトランザクションを選択トランザクションとして特定するステップと、（Ｄ）選択トランザクションのリスト又はデータ格納部に識別子が格納されているトランザクションのうち選択トランザクション以外のトランザクションである他のトランザクションのリストを、複数の第１のノードの各々に送信するステップとを含む。
【発明の効果】
【００１０】
複数のノードでデータを分散して保持する場合に、一貫性のあるスナップショットを取得できるようになる。
【図面の簡単な説明】
【００１１】
【図１】図１は、分散データシステムの問題を説明するための図である。
【図２】図２は、第１の実施の形態に係るシステムの機能ブロック図である。
【図３】図３は、第１の実施の形態に係る処理フローを示す図である。
【図４】図４は、第２の実施の形態に係る分散データシステムの機能ブロック図である。
【図５】図５は、２フェーズコミットプロトコルを説明するための図である。
【図６】図６は、分散トランザクションと２フェーズコミットプロトコルとの関係を示す図である。
【図７】図７は、第２の実施の形態における処理の概要を説明するための図である。
【図８】図８は、パティシパント・ノードのデータ格納部に格納される管理テーブルの一例を示す図である。
【図９Ａ】図９Ａは、第２の実施の形態におけるスナップショット・プロトコルを示す図である。
【図９Ｂ】図９Ｂは、確認応答及びコミットの出力遅延を説明するための図である。
【図１０】図１０は、第２の実施の形態における処理フローを示す図である。
【図１１】図１１は、稼働中トランザクションリストを説明するための図である。
【図１２】図１２は、ノードＡにおけるトランザクション進行状態を模式的に示す図である。
【図１３】図１３は、ノードＢにおけるトランザクション進行状態を模式的に示す図である。
【図１４】図１４は、コーディネータ・ノードにおけるデータ格納部に格納されるデータの一例を示す図である。
【図１５】図１５は、トランザクション選択処理の処理フローを示す図である。
【図１６】図１６は、２ノードの場合の選択基準を模式的に示す図である。
【図１７】図１７は、図１２及び図１３の場合の選択トランザクションを示すための図である。
【図１８】図１８は、選択トランザクションリストの一例を示す図である。
【図１９】図１９は、第２の実施の形態における処理フローを示す図である。
【図２０】図２０は、選択トランザクションリスト処理の処理フローを示す図である。
【図２１】図２１は、選択トランザクション管理テーブルの一例を示す図である。
【図２２】図２２は、データベース更新とスナップショット・ファイルの更新について説明するための図である。
【図２３】図２３は、スナップショット・データ取得処理についての処理フローを示す図である。
【図２４】図２４は、コンピュータの機能ブロック図である。
【図２５】図２５は、３フェーズコミットプロトコルを説明するための図である。
【図２６】図２６は、コピーオンライトの基本的な説明のための図である。
【発明を実施するための形態】
【００１２】
［実施の形態１］
図２に、本実施の形態に係るシステムの構成を示す。本システムでは、ネットワーク１０００に、ユーザ端末１３００と、スナップショットについての管理を行うコンピュータ（スナップショットコーディネータコンピュータと称することもある）１１００と、スナップショットコーディネータコンピュータからのスナップショットの取得リクエストに応じてスナップショットを取得する複数のコンピュータ（スナップショットパティシパントコンピュータと称することもある）１２００（図２で１２００ａ及び１２００ｂ。台数は２に限定されない。）とが接続されている。スナップショットコーディネータコンピュータ１１００は、送受信部１１１０と、トランザクション選択部１１２０と、データ格納部１１３０とを有している。一方、スナップショットパティシパントコンピュータ１２００は、スナップショット処理部１２２０と、トランザクションマネージャ１２１０と、各種データを格納するデータベース１２４０とを有する。なお、スナップショットパティシパントコンピュータ１２００は、必要に応じて、データベース１２４０に対する各種トランザクションを実施するトランザクションプロセス１２３０を生成し、実行する。
【００１３】
図３を用いて図２に示したシステムの説明を行う。まず、スナップショットコーディネータコンピュータ１１００の送受信部１１１０は、例えばユーザ端末１３００からスナップショットの取得指示を受信する（ステップＳ１００１）。そうすると、スナップショットコーディネータコンピュータ１１００の送受信部１１１０は、スナップショットの取得対象である複数のパティシパントノード、すなわち複数のスナップショットパティシパントコンピュータ１２００の各々に、スナップショットリクエストを送信する（ステップＳ１００３）。
【００１４】
これに対して、スナップショットパティシパントコンピュータ１２００のスナップショット処理部１２２０は、スナップショットコーディネータコンピュータ１１００からスナップショットリクエストを受信する（ステップＳ１００５）。そうすると、スナップショットパティシパントコンピュータ１２００のトランザクションマネージャ１２１０は、当該スナップショットパティシパントコンピュータ１２００において稼働中のトランザクション（例えばトランザクションプロセス１２３０）を特定し、当該稼働中のトランザクションの状態を表すデータを生成して、スナップショット処理部１２２０に出力する。スナップショット処理部１２２０は、稼働中のトランザクションの識別子及び稼働中のトランザクションの状態を表すデータを、スナップショットコーディネータコンピュータ１１００（すなわちコーディネータノード）に送信する（ステップＳ１００７）。
【００１５】
さらに、トランザクションマネージャ１２１０は、稼働中のトランザクションを特定した後、当該稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施する（ステップＳ１０１１）。後述の選択トランザクション以外のトランザクションについては、スナップショットに反映しないように、トランザクションの正常終了を延期することとなる。しかし、この段階では、スナップショットに結果を反映させる選択トランザクションと、反映させないそれ以外のトランザクションとの識別がまだなされておらず、稼働中のトランザクションについて一律にトランザクションが正常終了してしまわないようにするためである。
【００１６】
スナップショットコーディネータコンピュータ１１００の送受信部１１１０は、各スナップショットパティシパントコンピュータ１２００から、稼働中のトランザクションの識別子及び当該稼働中のトランザクションの状態を表すデータを受信し、送信元パティシパントノードに対応付けてデータ格納部１１３０に格納する（ステップＳ１００９）。
【００１７】
全てのスナップショットパティシパントコンピュータ１２００から上記データを受信すると、トランザクション選択部１１２０は、データ格納部１１３０に識別子が格納されているトランザクションのうち、関係する全ての送信元パティシパントノード（すなわち、スナップショットパティシパントコンピュータ１２００）において確認応答（すなわちａｃｋ）出力後であるトランザクションを、スナップショットデータにトランザクションの結果を反映させる選択トランザクションとして特定する（ステップＳ１０１３）。全ての送信元パティシパントノードから確認応答が出力されていれば、そのトランザクションについて遅延なく正常終了又はキャンセルがなされるはずでありスナップショットに含める方がスナップショットのリアルタイム性を確保する上で好ましいからである。なお、全ての送信元パティシパントノードから確認応答が出力されているわけではないトランザクションは、正常終了又はキャンセルされるまでの時間の不確定性が高く、スナップショットに取り込もうとするとその不確定な時間分だけスナップショットの取得タイミングが遅延するため、スナップショットに含めないことが考えられる。そうすると、送受信部１１１０は、選択トランザクションのリスト又はデータ格納部１１３０に識別子が格納されているトランザクションのうち選択トランザクション以外のトランザクションのリストを、スナップショットパティシパントコンピュータ１２００の各々に送信する（ステップＳ１０１５）。
【００１８】
これに対して、各スナップショットパティシパントコンピュータ１２００のスナップショット処理部１２１０は、スナップショットコーディネータコンピュータ１１００から、選択トランザクションのリスト又は選択トランザクション以外のトランザクションのリストを受信する（ステップＳ１０１７）。なお、選択トランザクションリストは、各スナップショットパティシパントコンピュータに対して、共通するリストとすることもできるし、共通するリストのうち、各スナップショットパティシパントコンピュータのそれぞれに対して、個別のリストとすることもできる。個別のリストには、送信対象のスナップショットパティシパントコンピュータに関連する選択トランザクションリストを含め、そのスナップショットパティシパントコンピュータの処理対象でないトランザクションについてはリストに含めないようにしてもよい。
【００１９】
そうすると、トランザクションマネージャ１２１０は、選択トランザクション（典型的には１又は複数のトランザクションを含む。但し、「空」の場合もある。）については正常終了阻止処理の対象から外し、選択トランザクションの全ての正常終了又はキャンセルを確認した後の時刻Ｔを基準に、スナップショット処理部１２１０は、コピーオンライトを実施させる（ステップＳ１０１９）。すなわち、時刻Ｔより前に正常終了されたトランザクションについては、そのトランザクション処理後のデータが時刻Ｔの後に更新された場合に、更新前のデータを保存する処理（コピーオンライト）を実行することとなるため、トランザクション処理後のデータの状態がスナップショットとして記録されることとなる。なお、選択トランザクションは、各スナップショットパティシパントコンピュータ間で、一貫性のあるものであり、あるスナップショットパティシパントコンピュータでは選択トランザクションであるにもかかわらず、他のスナップショットパティシパントコンピュータでは選択トランザクションでないといった矛盾が生じないようにしている。このような一貫性は、選択トランザクション以外のトランザクションについても同様である。
【００２０】
一方、選択トランザクション以外の他のトランザクションについては、正常終了阻止処理の実施により、前述の時刻Ｔより前に正常終了等しないように制御がなされ、時刻Ｔを過ぎた後にトランザクションの正常終了が実行されるようにする。そうすれば、時刻Ｔを過ぎた後にそのトランザクションについて正常終了がなされることでデータの更新があれば、即、コピーオンライト（更新前のデータのコピー）が実施されることになる。従って、選択トランザクション以外の他のトランザクションについては、トランザクションが正常終了する前のデータがスナップショットに含められることとなり、そのトランザクションの処理結果はスナップショットに反映されない。
【００２１】
以上述べたように、トランザクションをその状態に応じて適切に分類してコミットのタイミングを調整することにより、あるノードにおけるスナップショットについては、トランザクションＴ１を反映させているが、他のノードのスナップショットについては、トランザクションＴ１をスナップショットに反映させていない等といった一貫性の欠如が生じないように調整される。
【００２２】
［実施の形態２］
図４に、本実施の形態の分散データシステムのシステム構成図を示す。例えば、社内ＬＡＮ（Local Area Network）やインターネットなどのネットワーク１には、スナップショットのコーディネートを行うコーディネータ・ノード３と、分散トランザクションのコーディネートを行うトランザクション・コーディネータ・ノード５と、１又は複数の分散トランザクションを実施し且つコーディネータ・ノード３と連携してスナップショット取得処理を実行する複数のパティシパント・ノード７（図では７ａ及び７ｂ。但し、ノード数は２に限定されず、より多くノードが存在する場合もある）と、例えばパーソナルコンピュータであるユーザ端末９とが接続されている。
【００２３】
コーディネータ・ノード３は、スナップショット・コーディネータ３１０と、当該スナップショット・コーディネータ３１０によって処理されるデータを格納するデータ格納部３２０とを有する。スナップショット・コーディネータ３１０は、トランザクション選択部３１１と、メッセージ送受信部３１３とを有する。
【００２４】
トランザクション・コーディネータ・ノード５は、トランザクション・コーディネータ５１とデータ格納部５２を有する。
【００２５】
パティシパント・ノード７は、スナップショット・コーディネータ３１０と連携するスナップショット・パティシパント７１と、トランザクション・コーディネータ５１と連携するトランザクション・マネージャ７３と、トランザクション・マネージャ７３から生成され且つトランザクション・パティシパントとして機能するトランザクションプロセス７７と、トランザクション・マネージャ７３及びスナップショット・パティシパント７１が処理するデータを格納するデータ格納部７５と、コピーオンライトのための処理を行うコピーオンライト処理部７９とを有すると共に、トランザクションによって処理されるデータべース８２（図４ではパティシパント・ノード７ａには８２ａ、パティシパント・ノード７ｂには８２ｂ）と、トランザクションのログを格納するログ格納部８１（図４ではパティシパント・ノード７ａには８１ａ、パティシパント・ノード７ｂには８１ｂ）とを管理している。なお、トランザクションプロセス７７は、トランザクション・コーディネータ５１からの指示を受けたトランザクション・マネージャ７３が、必要に応じて必要なだけ生成するプロセスである。また、データベース８２は、一般的なＲＤＢなどだけではなく、単にデータをストアする装置をも含むものとする。
【００２６】
トランザクション・コーディネータ・ノード５は、パティシパント・ノード７である場合もある。すなわち、トランザクション・コーディネータ５１は、いずれかのパティシパント・ノード７に含まれる場合もある。同様に、コーディネータ・ノード３についても、パティシパント・ノード７である場合もある。すなわち、スナップショット・コーディネータ３１０は、いずれかのパティシパント・ノード７に含まれる場合もある。但し、以下では、説明を簡単にするために、別のノードに含まれるものとして説明する。
【００２７】
まず、本実施の形態の基本となる事項を幾つか説明しておく。
【００２８】
本実施の形態において、トランザクション（transaction）とは、データベースの用語であり、一貫性を持ったひとまとまりの処理のことである。例えば、振込においてある金額を１つの口座から別の口座に移す処理が１つのトランザクションである。トランザクションの実行前の状態に一貫性があれば、実行後にも一貫性がある。上記の例に関していえば、トランザクション実行後に金額の総額が変わらないという一貫性は保たれる。本実施の形態では、複数のノードに跨がるトランザクションを分散トランザクションと呼ぶ。また、トランザクションと記した場合は、１ノードに閉じたトランザクション及び分散トランザクションを含むものとする。
【００２９】
また、トランザクションは、オールオアナッシング（all or nothing）で処理される。例えば、振込においてある金額を１つの口座から別の口座に移す場合に、途中でエラーが発生した場合には、データを中途半端な状態にせず、最終的に全てを反映する（コミット：commit）か、又は全てをキャンセル（アボート：abort）するようにする。さもなければ、不整合が発生してしまうからである。
【００３０】
一般に、トランザクション内の更新結果をログ格納部８１などの一時的な領域に格納し、コミット時に最終的にデータシステムの本来の格納場所、例えばデータベース８２に反映させる。逆にアボート時には、ログに書き込んだ更新結果を廃棄する。
【００３１】
さらに、分散トランザクションにおいて、各ノードで処理される実行をサブトランザクションと呼ぶものとする。但し、特定のノードにおけるサブトランザクションであることが分かる場合には、サブトランザクションについても「トランザクション」と呼ぶものとなる。分散データシステムでは、システム全体で複数のトランザクションが同時に処理される場合がある。従って、各ノードで複数のサブトランザクションが稼動している可能性がある。分散トランザクションでは、１つでもアボートされるサブトランザクションが存在する場合には、全てのサブトランザクションもアボートされなければならない。１つでもコミットされてしまうと、不整合が発生してしまう。従って、トランザクション・コーディネータ５１が、サブトランザクションを全て一括して管理する。なお、本実施の形態では、分散トランザクションにサブトランザクションが１つしかない場合にも、同様の制御を行うものとする。
【００３２】
上で述べたように、分散トランザクションでは、サブトランザクションのうちいくつかがコミットされ、残りがアボートされるようなことになると、一貫性が損なわれる。このようなことにならず、分散トランザクションの一貫性を保つため、分散トランザクションに関与する全てのサブトランザクションがコミットされるか、あるいは逆に全てがアボートされるように制御するためのプロトコルとして、図５に示す２フェーズコミットプロトコルがある。本実施の形態では、分散トランザクションは、この２フェーズコミットプロトコル等（後に述べる３フェーズコミットプロトコルを含む）のように、最後にａｃｋ（確認応答と呼ぶ）及びｃｏｍｍｉｔ（コミットと呼ぶ）のメッセージをやりとりし、同期を取ってコミットを行うプロトコルに従う。このような性質を有するコミットプロトコルを、以下、単にコミットプロトコルと呼ぶことにする。
【００３３】
図５に示したトランザクション・パティシパントは、各ノードで分散トランザクションのサブトランザクション又は１つのノードに閉じたトランザクションを実行するプロセスであり、図４ではトランザクションプロセス７７と示されている。トランザクション・コーディネータは、１つのトランザクションに関わる１又は複数のトランザクション・パティシパントを２フェーズコミットプロトコルを通して制御するプロセスであり、図４ではトランザクション・コーディネータ５１として示されている。トランザクション・コーディネータ及びトランザクション・パティシパントは、トランザクションごとに別のプロセスとして生成される。
【００３４】
図５に示すように、２フェーズコミットプロトコルでは、トランザクション・コーディネータが、「begin transaction」を出力してトランザクション・パティシパント１及び２を生成した後、「command」をトランザクション・パティシパント１及び２に送信し、処理を行わせる。その後、トランザクション・コーディネータは、コミット可能か否かを問い合わせる「prepare」を、トランザクション・パティシパント１及び２に送信する。トランザクション・パティシパント１及び２は、コミットできれば確認応答（ａｃｋ）をトランザクション・コーディネータに送信し、コミットできなければ否定応答（ｎａｃｋ）を送信する。トランザクション・コーディネータは、全てのトランザクション・パティシパントから確認応答が得られた場合には、コミットをトランザクション・パティシパント１及び２に送信する。１つでも否定応答（ｎａｃｋ）を返信してきたトランザクション・パティシパントが存在する場合には、全てのトランザクション・パティシパントに、アボート（ａｂｏｒｔ）を送信する。
【００３５】
図６に、分散トランザクションと２フェーズコミットプロトコルの関係の一例を示す。この例では、トランザクション・コーディネータが、「begin transaction」によりノード１及び２においてサブトランザクションｔ１−１及びｔ１−２を実行するトランザクション・パティシパントのプロセスを生成し、口座Ａから口座Ｂへ１００振り込みする処理を「command」で指示している。ここで、ノード１のサブトランザクションｔ１−１では、口座Ａの残高「１００」をログにおいて「０」に減額し、ノード２のサブトランザクションｔ１−２では、口座Ｂの残高「１００」をログにおいて「２００」に増額した後、確認応答（ａｃｋ）を、トランザクション・コーディネータに送信している。そうすると、トランザクション・コーディネータは、コミット（ｃｏｍｍｉｔ）を、ノード１のサブトランザクションｔ１−１のトランザクション・パティシパント及びノード２のサブトランザクションｔ１−２のトランザクション・パティシパントに送信する。そうすると、各ノードのサブトランザクションのトランザクション・パティシパントは、ログのとおりにデータベースを更新して処理を終了する。
【００３６】
この例における分散トランザクションは、ノード１及び２でコミットされており、一貫性が保たれる例になっている。図６に示されるように、トランザクションの全更新処理が終了し、その結果がログに書かれた後、すなわちコミットでもアボートでもどちらにでも対応できる状態になった後に、確認応答（ａｃｋ）をトランザクション・コーディネータに送信する。各トランザクション・パティシパントは、トランザクション・コーディネータからコミットを受け取ると、ログに書き込んだ結果をデータベースに反映している。
【００３７】
もし、ログに書き込むまでの処理がうまくゆかなかった場合は、否定応答（ｎａｃｋ）を返す。トランザクション・コーディネータは、１つでも否定応答（ｎａｃｋ）があれば、アボートを送信し、トランザクションはアボートされる。
【００３８】
なお、確認応答（ａｃｋ）のメッセージを送信する前に、この確認応答を送信することを示すログをログデータ格納部に書き出す。コミットのメッセージの受信直後にも、コミットを受信したことを示すログをログデータ格納部に書き出す。これは、万一その後に、障害などが発生した場合でも、トランザクションの状態を知り、トランザクションを復旧することを可能にするためである。
【００３９】
次に、図７乃至図９Ｂを用いて、図４に示したシステムの、２フェーズコミットプロトコルをベースとした大まかな処理の流れを説明する。図７に、本実施の形態に係るトランザクション・マネージャ７３とトランザクション・コーディネータ５１とトランザクション・パティシパント（すなわちトランザクションプロセス７７）との関係を示す。
【００４０】
トランザクション・コーディネータ５１は、上で述べたように、サブトランザクションを実行させるノード（ここではトランザクション・パティシパント・ノード７）に対して「begin transaction」を送信する。この点は通常と同じである。
【００４１】
トランザクション・マネージャ７３は、パティシパント・ノード７内のトランザクション（厳密にはサブトランザクション）を管理・制御するものであり、トランザクション・コーディネータ５１からの「begin transaction」をキャプチャし、トランザクション・パティシパントのプロセスを生成し、さらに「begin transaction」を当該トランザクション・パティシパントに送信する。この後、トランザクション・コーディネータ５１は、トランザクション・パティシパントに対して「command」及び「prepare」を送信するが、このようなメッセージについては、トランザクション・マネージャ７３は関与せず、トランザクション・パティシパントが「command」及び「prepare」を受信する。これに対して、トランザクション・パティシパントは、確認応答（ａｃｋ）又は否定応答（ｎａｃｋ）を出力する。トランザクション・マネージャ７３はこれをキャプチャする。なお、以下で述べるような事象の場合には確認応答についてはトランザクション・コーディネータ５１への送信を遅延させる。同様に、トランザクション・コーディネータ５１が、確認応答又は否定応答に応じて、コミット（ｃｏｍｍｉｔ）又はアボート（ａｂｏｒｔ）を送信するが、トランザクション・マネージャ７３は、これをキャプチャする。なお、以下で述べるような事象の場合にはコミットについてはトランザクション・パティシパントへの出力を遅延させる。
【００４２】
なお、本実施の形態では、トランザクション・パティシパントは、コミット又はアボートを受信したことをログに書き込んだ後、コミット完了通知又はアボート完了通知をトランザクション・マネージャ７３に出力する。その後、コミットであればトランザクション・パティシパントは、処理結果をデータベース８２に反映させる。なお、処理結果をデータベースに反映させた後又はアボートについての処理が完了した後に、コミット完了通知又はアボート完了通知を出力するようにしても良い。但し、上述のように、ログを書き込んだ後でも問題はなく、そちらの方が早く通知できる分有利である。これによって、トランザクション・マネージャ７３は、トランザクション・パティシパント側の処理が完了したことがわかる。
【００４３】
このようにして、トランザクション・マネージャ７３は、パティシパント・ノード７において稼働中のトランザクション（すなわちサブトランザクション）を管理すると共にその状態を把握する。例えば、データ格納部７５には、図８に示すようなデータを保持しておく。図８の例では、トランザクションＩＤ毎に、状態が登録されるようになっている。状態は、例えば「ａｃｋ／ｎａｃｋより前」「ｃｏｍｍｉｔ受信済」「ａｃｋ受信済」「ｎａｃｋ受信済」「ａｂｏｒｔ受信済」といったものである。以下でも説明するように、トランザクション・マネージャ７３が確認応答（ａｃｋ）を受信したか否か、すなわちトランザクション・パティシパントが確認応答（ａｃｋ）を出力したか否かは、トランザクションの分類の上で注目すべき状態である。
【００４４】
次に、図９Ａを用いてスナップショット・プロトコルについて説明する。分散データシステム上でスナップショットを取るためにノード間でやりとりされるプロトコルを「スナップショット・プロトコル」と呼ぶことにする。スナップショット・コーディネータ３１０は、例えばユーザ端末９からスナップショットの取得指示を受信すると、スナップショット・リクエストを全てのパティシパント・ノード７に送信する（ステップ（１１））。パティシパント・ノード７のスナップショット・パティシパント７１が、スナップショット・リクエストを受信した後、仮スナップショット時刻が決まる。仮スナップショット時刻は、稼働中のトランザクションを確定させた時刻であるが、この時刻でスナップショットが取得されるわけではないので、あくまで仮スナップショット時刻となる。
【００４５】
ここでスナップショット・パティシパント７１は、稼働中トランザクションリスト要求をトランザクション・マネージャ７３に出力する（ステップ（１２））。トランザクション・マネージャ７３は、所定のルールに従って稼働中のトランザクションを特定し、稼働中トランザクションリストを生成して、スナップショット・パティシパント７１に出力する（ステップ（１３））。なお、以下で説明するが、稼働中トランザクションを特定した後、稼働中トランザクションリストに列挙されたトランザクションについての確認応答及びコミットについては、トランザクション・マネージャ７３がキャプチャして出力を遅延させる。
【００４６】
スナップショット・パティシパント７１は、トランザクション・マネージャ７３から稼働中トランザクションリストを受信すると、コーディネータ・ノード３のスナップショット・コーディネータ３１０に送信する（ステップ（１４））。スナップショット・コーディネータ３１０は、全てのパティシパント・ノード７から稼働中トランザクションリストを受信すると、以下で述べるような処理を行ってスナップショットに結果を反映させるトランザクションを選択し、選択トランザクションリストをパティシパント・ノード毎に生成して、パティシパント・ノード７の各々に送信する（ステップ（１５））。選択されるトランザクションは、関係する全てのノードで確認応答（ａｃｋ）出力後となっているトランザクションである。
【００４７】
パティシパント・ノード７のスナップショット・パティシパント７１は、選択トランザクションリストを受信すると、この選択トランザクションリストをトランザクション・マネージャ７３に出力する（ステップ（１６））。
【００４８】
トランザクション・マネージャ７３は、選択トランザクションリストを受信すると、選択トランザクションリストに列挙されているトランザクションについては、コミット又はアボートについての処理が完了するように処理を行う。すなわち、キャプチャした確認応答を送信しコミットを出力する。なお、アボートについては送信を遅延させないので、そのままトランザクションが失敗ということで完了するが、アボートが送信された（又は受信したこと）ことについてはチェックしておく。
【００４９】
各選択トランザクション・パティシパントは、コミット又はアボートを受信したことをログデータ格納部７５に書き込んだ後、コミット完了通知又はアボート完了通知をトランザクション・マネージャ７３に出力する。その後、選択トランザクションリストに列挙されているトランザクションの全てからコミット完了通知又はアボート完了通知を受信すると、トランザクション・マネージャ７３は、選択トランザクションリスト処理完了通知を、スナップショット・パティシパント７１に出力する（ステップ（１７））。
【００５０】
スナップショット・パティシパント７１は、トランザクション・マネージャ７３から選択トランザクションリスト処理完了通知を受信すると、最終スナップショット時刻を決定する。この最終スナップショット時刻を基準にコピーオンライトを実施することになる。コピーオンライトについては、後に詳細に説明する。
【００５１】
さらに、スナップショット・パティシパント７１は、スナップショット完了通知を、スナップショット・コーディネータ３１０に送信する（ステップ（１８））。また、図９Ａには明記していないが、スナップショット・コーディネータ３１０からユーザ端末にスナップショット完了通知が送信される。これによって、ユーザは、スナップショット・データを取得できるようになる。
【００５２】
また、スナップショット・パティシパント７１は、最終スナップショット時刻後に、稼働トランザクションリストに載っているトランザクションのうち選択トランザクションリストに載っていないトランザクションを終了させるために、トランザクション完了リクエストを、トランザクション・マネージャ７３に送信する（ステップ（１９））。トランザクション・マネージャ７３は、キャプチャしている確認応答（ａｃｋ）をトランザクション・コーディネータ５１に送信したり、キャプチャしているコミット（ｃｏｍｍｉｔ）をトランザクション・パティシパントに出力したりして、トランザクションを完了させるようにする。
【００５３】
このようにして、トランザクションをその状態に応じて適切に分類してコミットのタイミングを調整することによりシステム全体におけるデータの一貫性を保持しつつ、コピーオンライトの実施タイミングである最終スナップショット時刻を適切に設定してコピーオンライトによる即時性を有効化している。
【００５４】
なお、以下の説明が理解しやすいように、図９Ｂに、確認応答（ａｃｋ）及びコミットの出力遅延制御について説明しておく。上で述べたように、ステップ（１１）でスナップショット・リクエストがスナップショット・コーディネータ３１０からスナップショット・パティシパント７１に送信されると、仮スナップショット時刻において稼働中のトランザクションが特定される。そして、稼働中のトランザクションの状態についての稼働中トランザクションリストが生成され、ステップ（１４）でスナップショット・パティシパント７１からスナップショット・コーディネータ３１０に送信される。その後、ステップ（１５）では、選択トランザクションリストが生成されてスナップショット・コーディネータ３１０からスナップショット・パティシパント７１に送信される。
【００５５】
上で述べたように、トランザクション・マネージャ７３は、仮スナップショット時刻以降、稼働中トランザクションリストに載っているトランザクションのコミット及び確認応答をキャプチャして出力遅延制御を行う。図９Ｂでは、パティシパント・ノード７においてトランザクションｔ１乃至ｔ３が実行されている場合を示しており、出力遅延制御を行わない場合には、（ａ）で点線で示すようなタイミングで確認応答（ａｃｋ）及びコミット（ｃｏｍｍｉｔ）が出力される。但し、トランザクションｔ１は、仮スナップショット時刻において既にコミットを受信しているので、出力遅延制御の対象ではない。一方、トランザクションｔ２及びｔ３については、確認応答又はコミットが出力又は送信されていないので、出力遅延制御が行われる。以下でも述べるが、ここではトランザクションｔ２については結果をスナップショットに反映させることができ、トランザクションｔ３については結果をスナップショットに反映させることができない。従って選択トランザクションリストにはトランザクションｔ２のみが載っているとする。このような場合には、キャプチャして出力遅延させているトランザクションｔ２へのコミットを出力して、コミットに対する処理を行わせる（図９Ｂの矢印Ａ）。
【００５６】
その後、選択トランザクションリストに含まれる選択トランザクション全てについてコミットに対する処理を実施させた後に、スナップショット・パティシパント７１は最終スナップショット時刻を決定する。そうすると、ステップ（１８）において、スナップショット・パティシパント７１は、スナップショット処理完了通知をスナップショット・コーディネータ３１０に送信する。さらに、ステップ（１９）でスナップショット・パティシパント７１は、トランザクション・マネージャ７３にトランザクション完了リクエストを出力する。トランザクション・マネージャ７３は、トランザクション完了リスクエストを受信すると、キャプチャしていて出力遅延させていた確認応答（ａｃｋ）を送信して、後続の処理を行わせる（矢印Ｂ）。そうすると、例えばコミットをトランザクション・コーディネータ５１が送信するので、トランザクションｔ３のプロセスでもコミットを受信して、コミットに対する処理を実施する。
【００５７】
このようにすることで、スナップショットに処理結果を反映させるトランザクションについては完了させた後に、最終スナップショット時刻を基準にコピーオンライトを実施すれば、最終スナップショット時刻を基準に一貫性のあるスナップショット・データを見かけ上即時に得ることができるようになる。
【００５８】
また、更新が頻繁な基幹系では、参照主体の集計処理や分析処理を同時実行すると衝突する可能性が高いが、スナップショットを即時取得し、スナップショットに対して集計処理や分析処理を行うことにより、両者が衝突せずに同時実行することが可能となる。
【００５９】
次に、詳細な処理を図１０乃至図２４を用いて説明する。
【００６０】
コーディネータ・ノード３におけるスナップショット・コーディネータ３１０のメッセージ送受信部３１３は、例えばユーザ端末９からスナップショット取得指示を受信すると（図１０：ステップＳ１）、スナップショット・リクエストを全てのパティシパント・ノード７に送信する（ステップＳ３）。メッセージ送受信部３１３は、予め全てのパティシパント・ノード７のアドレスなどを把握しているものとする。図１０では説明の都合上１つのパティシパント・ノード７のみ示しているが、実際には複数のパティシパント・ノード７に送信する。
【００６１】
パティシパント・ノード７におけるスナップショット・パティシパント７１は、スナップショット・リクエストを受信すると（ステップＳ５）、稼動中トランザクションリスト要求をトランザクション・マネージャ７３に出力する（ステップＳ７）。トランザクション・マネージャ７３は、スナップショット・パティシパント７１から稼動中トランザクションリスト要求を受信し（ステップＳ９）、稼働中トランザクションリストを生成し、スナップショット・パティシパント７１に出力する（ステップＳ１１）。
【００６２】
図８に示したように、トランザクション・マネージャ７３は、自分が生成したトランザクションプロセス７７の状態を管理している。簡単な場合には、図８のリストをそのまま稼働中トランザクションリストとして送信しても良いが、本実施の形態では、正常に終了する可能性の無いトランザクション、すなわち、否定応答（ｎａｃｋ）及びアボートを受信したトランザクションについては、そもそもそのトランザクションの結果をスナップショットに反映することは無いので、稼動中トランザクションリストから除外する。また、コミットを受信したトランザクションプロセス７７についても、その後速やかにデータベース８２に処理結果が反映されてしまい、スナップショットに結果を反映すべきトランザクションであることが明らかであるから除外する。
【００６３】
従って、図８のような場合には、例えば図１１に示すような稼働中トランザクションリストになる。トランザクションｔ１及びｔ３以外のトランザクションについては、通知しなくても良いトランザクションであるから除外される。トランザクションｔ１及びｔ３の状態についても、確認応答（ａｃｋ）出力前か出力済かが以下の処理に影響するので、状態についてもこれらのいずれかに設定する。なお、トランザクション・マネージャ７３では、図８に示したテーブルでトランザクションがｃｏｍｍｉｔ受信済かなども管理するが、図１１のリストでもｃｏｍｍｉｔ受信済などにしても良い。ただし、ａｃｋ出力前か、ａｃｋ出力済かの情報があればよく、ｃｏｍｍｉｔ受信済であれば、スナップショット・コーディネータ側でａｃｋ出力済と解釈するようにすればよい。
【００６４】
さらに、トランザクション・マネージャ７３は、稼働中トランザクションを特定した後には、稼働中トランザクションリストに載っているトランザクションについて出力又は送信された確認応答及びコミットをキャプチャするだけではなく、出力又は送信を遅延させる（ステップＳ１３）。なお、拒否応答もアボートも上で述べたようにキャプチャするが、図８に示したようなトランザクション管理テーブルを更新する。
【００６５】
一方、スナップショット・パティシパント７１は、トランザクション・マネージャ７３から稼働中トランザクションリストを受信すると（ステップＳ１５）、その稼働中トランザクションリストをスナップショット・コーディネータ３１０に送信する（ステップＳ１７）。
【００６６】
スナップショット・コーディネータ３１０のメッセージ送受信部３１３は、各パティシパント・ノード７から稼働中トランザクションリストを受信すると（ステップＳ１９）、データ格納部３２０に送信元ノード（又はスナップショット・パティシパント）の識別子に対応付けて格納する。そして、メッセージ送受信部３１３は、全てのパティシパント・ノード７から稼働中トランザクションリストを受信すると、トランザクション選択部３１１に通知する。
【００６７】
例えば、ノードＡにおけるトランザクションの進行状態が図１２に示すような状態であるものとする。トランザクション・マネージャ７３が、稼働中トランザクションを特定する時点である仮スナップショット時刻において、トランザクションｔ１についてはコミット受信済みであり、トランザクションｔ２乃至ｔ４については確認応答（ａｃｋ）出力済であり、トランザクションｔ５については確認応答（ａｃｋ）出力前である。一方、ノードＢにおけるトランザクションの進行状態が図１３に示すような状態であるものとする。すなわち、トランザクション・マネージャ７３が、稼働中トランザクションを特定する時点である仮スナップショット時刻において、トランザクションｔ１及びｔ２についてはコミット受信済みであり、トランザクションｔ３及びｔ５については確認応答（ａｃｋ）出力済みであり、トランザクションｔ４については確認応答（ａｃｋ）出力前である。
【００６８】
このような場合には、データ格納部３２０には、例えば図１４に示すようなテーブルが格納される。図１４の例では、トランザクションＩＤの列と、送信元ノードの識別子毎にトランザクションの状態を登録するための列と、選択フラグの列とが設けられている。図１４の例では、送信元ノード毎に、各トランザクションの状態（確認応答（ａｃｋ）出力前なのか出力済なのか）が把握できるようになっており、さらにトランザクション毎に各送信元ノードでどのような状態にあるのかも把握できるようになっている。なお、ステップＳ１９の段階では、選択フラグはセットされない。
【００６９】
なお、図１２及び図１３の例からすると、トランザクションｔ１についてはノードＡ及びＢでいずれもコミット受信後であるから稼働中トランザクションリストには載せられないが、図１４では説明の都合上点線で囲んだ上で示している。また、トランザクションｔ２についてもノードＢでは既にコミット受信済みであるから稼働中トランザクションリストには載せられないが、図１４では説明の都合上点線で囲んだ上で示している。
【００７０】
メッセージ送受信部３１３から通知を受けると、トランザクション選択部３１１は、トランザクション選択処理を実施する（ステップＳ２１）。トランザクション選択処理については、図１５乃至１８を用いて説明する。
【００７１】
トランザクション選択部３１１は、未処理のトランザクションを１つ特定する（ステップＳ３１）。そして、トランザクション選択部３１１は、特定されたトランザクションについてリスト通知のあった全てのノードで確認応答出力済みであるか確認する（ステップＳ３３）。このステップにおいては、図１２及び図１３の例で示したようにトランザクションｔ１については確認応答出力済みであるが、コミット受信済みであるから稼働中トランザクションリストには掲載されていない。従って、トランザクションｔ１については判断の対象とはならない。
【００７２】
また、トランザクションｔ２についてはノードＢでは既にコミット受信済みでノードＢについての稼働中トランザクションリストには状態が示されない。すなわち、ノードＢではトランザクションｔ２が実施されているのか分からないが、このような場合には、報告があったノードについてのみ確認する。これは以下の理由からである。すなわち、確認応答出力前の状態のノードがあれば、確認応答出力は後に述べるように最終スナップショット時刻まで遅延される。従って、それまではコミットされていることはない。つまり、既にコミットしてしまっているノードがあるということは、確認応答出力前の状態のノードがないことを意味している。従って、稼動中トランザクションリスト中の状態は全て確認応答出力後の状態であるはずであり、コミットされたノードに関する情報がなくても、結果は、最終的にスナップショットに含めることに決まるからである。
【００７３】
特定されたトランザクションについて通知のあった全てのノードで確認応答出力済みである場合には（ステップＳ３５：Ｙｅｓルート）、トランザクション選択部３１１は、スナップショットに結果を反映させるトランザクションとして、図１４に示したような管理テーブルにおいて選択フラグをオン（図１４では○）にセットする（ステップＳ３７）。そしてステップＳ４１に移行する。
【００７４】
一方、特定されたトランザクションについて通知のあったいずれかのノードで確認応答出力前であった場合には（ステップＳ３５：Ｎｏルート）、トランザクション選択部３１１は、スナップショットに結果を反映させないトランザクションとして、図１４に示したような管理テーブルにおいて選択フラグをオフ（図１４では×）にセットする（ステップＳ３９）。そしてステップＳ４１に移行する。
【００７５】
要するに、ノードが２つの場合には、図１６に示すような判断基準となる。すなわち、両方のノードで確認応答出力済みであれば、そのトランザクションの結果をスナップショットに反映させ、それ以外であればトランザクションの結果をスナップショットに反映させないこととする。
【００７６】
そして、トランザクション選択部３１１は、全てのトランザクションについて処理したか判断する（ステップＳ４１）。未処理のトランザクションが存在する場合にはステップＳ３１に戻り、一方、全てのトランザクションについて処理が完了した場合には元の処理に戻る。
【００７７】
図１２及び図１３の例では、図１７に示すような判定結果が得られる。ノードＡ及びＢで、確認応答出力後であるのは、トランザクションｔ１、ｔ２及びｔ３であるが、トランザクションｔ１は、上で述べたように稼働中トランザクションリストには載らないトランザクションであるから、トランザクションｔ２及びｔ３が選択される。
【００７８】
図１０の処理の説明に戻って、トランザクション選択部３１１は、選択トランザクションリストのデータをメッセージ送受信部３１３に出力し、メッセージ送受信部３１３は、選択トランザクションリストを、全てのパティシパント・ノード７に送信する（ステップＳ２３）。選択トランザクションリストは、図１４に示したテーブルから、ノードごとに作成される。図１８の例では、ノードＡ及びノードＢに同じ選択トランザクションリストが生成され送信されることになるが、一般には異なる。パティシパント・ノード７のスナップショット・パティシパント７１は、スナップショット・コーディネータ３１０から選択トランザクションリストを受信する（ステップＳ２５）。処理は端子Ａ及びＢを介して図１９の処理に移行する。
【００７９】
図１９の処理の説明に移行して、スナップショット・パティシパント７１は、選択トランザクションリストをトランザクション・マネージャ７３に出力する（ステップＳ５１）。トランザクション・マネージャ７３は、選択トランザクションリストをスナップショット・パティシパント７１から受信し、例えばデータ格納部７５に格納する（ステップＳ５３）。そして、トランザクション・マネージャ７３は、選択トランザクションリストが空であるか判断する（ステップＳ５５）。空の場合には、ステップＳ５９に移行する。
【００８０】
一方、選択トランザクションリストが空でない場合には、トランザクション・マネージャ７３は、選択トランザクションリスト処理を実施する（ステップＳ５７）。この選択トランザクションリスト処理については、図２０を用いて説明する。
【００８１】
トランザクション・マネージャ７３は、選択トランザクションリストに載っている選択トランザクションについて、キャプチャしたままで出力遅延させているコミットを、該当するトランザクションプロセス７７（トランザクション・パティシパント）に出力する（ステップＳ８１）。また、トランザクション・マネージャ７３は、選択トランザクションについてコミットを新たにキャプチャした場合には、直ぐに当該コミットを、該当するトランザクションプロセス７７に出力する（ステップ８３）。
【００８２】
このようにすることによって、最終スナップショット時刻を決定する前に、選択トランザクションを完了させる。上で説明したように、コミットを受信した場合には、トランザクション・パティシパントは、コミット受信をログ格納部８１に登録した後に、コミット完了通知をトランザクション・マネージャ７３に出力する。その後、ログデータ格納部７５に格納した処理結果を、データベース８２に反映させる。なお、トランザクション・マネージャ７３は、アボートについてはキャプチャしても出力遅延させずに出力してしまう。そして、例えば図８に示したような管理テーブルで状態については管理しておく。
【００８３】
例えば、データ格納部７５には、図２１に示すような選択トランザクション管理テーブルを格納する。図２１の例では、選択トランザクションのＩＤと、完了フラグとを登録するようになっている。完了フラグは、コミット完了通知を受信するか、アボート完了通知を受信した場合にオンをセットする。但し、選択トランザクションリストには、既にアボートされたため自パティシパント・ノードでは実行されていないトランザクションもあるので、選択トランザクションリストを受信したトランザクション・マネージャ７３は、例えば図８に示した管理テーブルと照らし合わせて、管理テーブルに載っていないトランザクション及びアボート完了通知を受信したトランザクションについては、完了フラグをオンにセットしてしまうものとする。なお、否定応答（ｎａｃｋ）についてもキャプチャした時点で完了扱いにしても良い。
【００８４】
そして、トランザクション・マネージャ７３は、全ての選択トランザクションがトランザクション完了か判断する（ステップＳ８５）。図２１に示したような選択トランザクション管理テーブルにおいて完了フラグが全ての選択トランザクションについてオンにセットされているか判断する。なお、選択トランザクションリストに載っており且つトランザクション・マネージャ７３が管理しているトランザクションについて管理テーブルを生成することも可能であって、この場合にはこの管理テーブルに載っているトランザクションの全てについてコミット完了通知を受信したか又はアボート完了通知を受信したかを判断する。
【００８５】
全ての選択トランザクションがトランザクション完了であると判断された場合には、元の処理に戻る。一方、トランザクション完了ではない選択トランザクションが存在する場合には、トランザクション・マネージャ７３は、選択トランザクションについてコミット完了通知又はアボート完了通知の受信を待機する（ステップＳ８７）。コミット完了通知又はアボート完了通知を受信しない場合には（ステップＳ８９：Ｎｏルート）、ステップＳ８７に戻る。一方、選択トランザクションについてコミット完了通知又はアボート完了通知を受信した場合には（ステップＳ８９：Ｙｅｓルート）、トランザクション・マネージャ７３は、コミット完了通知又はアボート完了通知の送信元トランザクションに対して選択トランザクション管理テーブルにおいて完了登録を行う（ステップＳ９１）。すなわち完了フラグをオンにセットする。その後ステップＳ８５に戻る。
【００８６】
このようにして、選択トランザクションリストに載っている選択トランザクションが、自パティシパント・ノード７について完了したことを確認する。
【００８７】
図１９の処理の説明に戻って、ステップＳ５７の後に、トランザクション・マネージャ７３は、選択トランザクションリスト処理完了メッセージを、スナップショット・パティシパント７１に出力する（ステップＳ５９）。なお、ステップＳ５５からステップＳ５９に移行するのは、トランザクション完了を確認する必要もないので直ぐに選択トランザクションリスト処理完了メッセージを出力するものである。
【００８８】
スナップショット・パティシパント７１は、トランザクション・マネージャ７３から選択トランザクションリスト処理完了メッセージを受信する（ステップＳ６５）。ここでスナップショット・パティシパント７１は、コピーオンライトを実施する準備が完了したことになるので、ここで最終スナップショット時刻を決定する（ステップＳ６７）。
【００８９】
そして、スナップショット・パティシパント７１は、コピーオンライト処理部７９に対してコピーオンライトを開始させる（ステップＳ６８）。例えば、データ格納部７５にスナップショット・ファイルを生成する。そうすると、コピーオンライト処理部７９は、トランザクションプロセス７７が、データベース８２のデータ（例えばページ単位又はレコード単位のデータ）を次に更新する際には、更新前のデータをコピーして例えばデータ格納部７５に格納する。これによって、スナップショットの取得は見かけ上即時に完了する。一方、実際のスナップショットは、更新が行われるたびに少しずつデータ格納部７５に貯められてゆく。
【００９０】
その後、スナップショット・パティシパント７１は、スナップショット完了メッセージをコーディネータ・ノード３のスナップショット・コーディネータ３１０に送信する（ステップＳ６９）。スナップショット・コーディネータ３１０のメッセージ送受信部３１３は、スナップショット・パティシパント７１からスナップショット完了メッセージを受信する（ステップＳ７１）。その後、全てのパティシパント・ノード７からスナップショット完了メッセージを受信した場合には、スナップショット・コーディネータ３１０のメッセージ送受信部３１３は、完了通知をユーザ端末９等に送信する（ステップＳ７３）。
【００９１】
ユーザ端末９等では、完了通知を受信すると、この後スナップショット・データを要求することができるようになる。
【００９２】
一方、スナップショット・パティシパント７１は、トランザクション完了リクエストをトランザクション・マネージャ７３に出力する（ステップＳ７５）。トランザクション・マネージャ７３は、スナップショット・パティシパント７１からトランザクション完了リクエストを受信する（ステップＳ７７）。ここで、トランザクション・マネージャ７３は、選択トランザクションリストに載っていないが稼働中トランザクションリストに載っているトランザクションについてキャプチャして出力遅延させている確認応答及びコミットを送信又は出力する（ステップＳ７９）。これによって、トランザクションプロセス７７がコミットを受信すると、ログに書き込んだ処理結果をデータベース８２に反映させるが、この際には、コピーオンライト処理部７９が、更新前のデータをコピーしてデータ格納部７５のスナップショット・ファイルに格納する。
【００９３】
その後は、スナップショット・パティシパント７１が、実際にスナップショット・データを読み出すまで、トランザクションプロセス７７がデータベース８２のデータを更新する際には、既にコピーしたデータでない限り、更新前のデータをコピーしてデータ格納部７５に格納する。このような処理を繰り返すことによって、スナップショット・データがデータ格納部７５内のスナップショット・ファイルに貯められてゆく。
【００９４】
ここで図２２を用いてデータベース８２の更新と共にスナップショット・ファイルの変化についても説明する。図２２では、他ノードでのトランザクションについては、記述していないが、説明上、どのトランザクションの他のノードでの状態も、図２２と同様とする。たとえば、ｔ１は図２２ですでにコミットされているので、他のノードでもコミットされているものとする。ｔ２については、仮スナップショット時にすでに確認応答が出力されているので、他のノードでもすでに確認応答が出力されている。ｔ３及びｔ５についても同様である。図２２の例では、データベース８２には４つのページが存在しており、トランザクションｔ１がページ１を更新し、トランザクションｔ２がページ２及び３を更新し、トランザクションｔ３がページ４を更新する。トランザクションｔ１では、処理を進めてページ１に対する更新データ５００１を生成すると、ログデータ格納部７５に格納すると共に、確認応答を送信する。その後、コミットを受信すれば、データベース８２のページ１を更新データ５００１で更新する。トランザクションｔ１については、仮スナップショット時刻までにコミットが送信されているのでスナップショットに処理結果が反映される。一方、トランザクションｔ２については、処理を進めてページ２に対する更新データ５００２を生成してログデータ格納部７５に格納すると共に、さらに処理を進めてページ３に対する更新データ５００３を生成してログデータ格納部７５に格納する。そして、確認応答を送信した後に仮スナップショット時刻に到達するので、コミットがトランザクション・マネージャ７３にキャプチャされて出力遅延される。しかし、トランザクションｔ２については、ａｃｋ送信済であるからスナップショットに処理結果を反映させるトランザクションとなり、最終スナップショット時刻前に、コミットが送信されるので、その後速やかにデータベース８２も更新データ５００２及び５００３で更新される。
【００９５】
最終スナップショット時刻後、データ格納部７５にスナップショット・ファイルが生成される。スナップショット・ファイルは、図２２の例のように、初期的には（タイミング（１））、サイズ「０」のファイルであり、これによってデータ格納部７５における使用容量を削減している。なお、スナップショット・ファイルは、コピー済みのページＩＤを格納するヘッダを有する他、各ページのコピーを格納するようになっている。
【００９６】
トランザクションｔ３については、処理を進めてページ４に対する更新データ５００４を生成してログデータ格納部７５に格納するが、確認応答送信前に仮スナップショット時刻が来てしまったので、確認応答をトランザクション・マネージャ７３がキャプチャして出力遅延させる。確認応答送信前に仮スナップショット時刻が来てしまっているので、スナップショットに処理結果を反映させないため、最終スナップショット時刻以後に確認応答が解放され、例えばコミットも出力される。そうすると、コミット受信後、データベース８２は、更新データ５００４によって更新される。このときに、コピーオンライトが実行され、スナップショット・ファイルには、更新データ５００４によって更新される前のページ４のデータが格納される。なお、コピーされたページのＩＤ「４」も、ヘッダに登録される。
【００９７】
その後、トランザクションｔ５が実行され、ページ１の更新データ５００５を生成して、ログデータ格納部７５に格納され、コミットが出力されると、更新データ５００５によりデータベース８２においてページ１のデータは更新される。ここで、ページ１はスナップショット・ファイルのヘッダには登録されていないので、コピーオンライトが行われ、更新データ５００５によって更新される前のページ１のデータが格納される。コピーされたページのＩＤ「１」も、ヘッダに登録される。
【００９８】
このような処理を繰り返してゆくことによって、スナップショット・ファイルにスナップショット・データが貯められる。
【００９９】
この後、例えばユーザ端末９からスナップショット・データ取得指示がトランザクション・コーディネータ・ノード５に出力された場合の処理について図２３を用いて説明する。まず、スナップショット・データ全体をユーザ端末に返送する処理について説明する。トランザクション・コーディネータ５１は、例えばスナップショット・データ取得指示を受信すると（ステップＳ１１１）、各ノードのトランザクションプロセス７７に、スナップショットデータ読み出しリクエストを送信する（ステップＳ１１３）。なお、これに先立ち、トランザクション・マネージャ７３により、トランザクションプロセス７７が生成されているものとする。各ノードのトランザクションプロセス７７は、トランザクション・コーディネータ５１からスナップショットデータ読み出しリクエストを受信すると（ステップＳ１１５）、スナップショット・ファイルに含まれないデータを、データベース８２から読み出す（ステップＳ１１７）。スナップショット・ファイルに含まれないデータについては、ヘッダを確認することによってコピー未完了のページのＩＤが得られる。そして、ステップＳ１１７が完了すると、ステップＳ１１７で読み出されたデータ及びスナップショット・ファイルから読み出したデータを、トランザクション・コーディネータ５１に送信する（ステップＳ１１９）。
【０１００】
トランザクション・コーディネータ５１は、トランザクションプロセス７７から、データベース８２から読み出したデータ及びスナップショット・ファイルから読み出したデータを受信し、データ格納部５２に格納する（ステップＳ１２１）。トランザクション・コーディネータ５１は、全てのノードからデータを受信すると、全てのスナップショット・データを、要求元のユーザ端末９に送信する（ステップＳ１２３）。なお、データ量は膨大になる場合もあるので、トランザクション・コーディネータ・ノード５の格納場所を表すデータ（例えばＵＲＩ（Universal Resource Indicator）を通知して、ユーザ端末９にダウンロードさせるようにしてもよい。また、全てのスナップショット・データを一括して出力せずに、分割したり、通常のデータベースのように特定の条件を満たすデータを返送するよう要求するリクエストに応じて出力してもよい。
【０１０１】
これによってユーザ端末９等は、スナップショット・データを取得して、分析処理や集計処理を実施することができるようになる。スナップショット・データの分析処理や集計処理は、ユーザ端末９に返送せずに、各ノードでトランザクションプロセスに部分的に実行させ（たとえば各ノードでの和を求め）、その結果をユーザ端末９に返送し、ユーザ端末で分析処理や集計処理を行う（たとえば、求めた各ノードでの和の総計を計算する）ことも可能である。
【０１０２】
なお、これまで、正常に終了するトランザクションを中心に述べてきた。ここで、トランザクション・パティシパントにおいて異常が発生したり、他のトランザクション・パティシパントやトランザクション・コーディネータなどで異常が発生し、正常に終了できなくなったトランザクションに関して補足する。
【０１０３】
上でも述べたように、トランザクションが正常に終了しないことがはっきりしている場合（たとえば、拒否応答を送信したり、アボートを受信した場合）は、稼動中トランザクションリスト中には含めない。このようにしても問題ないのは、以下の理由からである。
【０１０４】
すなわち、異常が発生したトランザクションは、最終的にアボートを受信して、トランザクションをキャンセルする。すなわち、スナップショットに含まれることはなく、その意味で、基本的に問題は発生しない。但し、別のトランザクション・パティシパントで異常が発生して、稼動中トランザクションリストに載らなかった場合、そのトランザクションはスナップショットに含めるものと決定される可能性がある。しかし、この場合、そのトランザクションは最終的にアボートされるため、スナップショットには含まれない。また、アボートの場合は、送信が遅延されることはないため、処理が停滞することはない。よって問題がない。
【０１０５】
以上本実施の形態について説明したが、本技術はこれに限定されるものではない。例えば、図２に示した機能ブロック図は一例であって、必ずしも実際のプログラムモジュールと一致するわけではない。また、データの格納態様についても同様である。ユーザ端末９ではなくネットワーク中の他の機能がスナップショットを要求するようにしても良い。
【０１０６】
なお、上で述べたユーザ端末９、コーディネータ・ノード３、パティシパント・ノード７、トランザクション・コーディネータ５は、コンピュータ装置であって、図２４に示すように、メモリ２５０１とＣＰＵ２５０３とハードディスク・ドライブ（ＨＤＤ）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。必要に応じてＣＰＵ２５０３は、表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、必要な動作を行わせる。また、処理途中のデータについては、メモリ２５０１に格納され、必要があればＨＤＤ２５０５に格納される。本技術の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及び必要なアプリケーション・プログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【０１０７】
より具体的には、スナップショット・コーディネータ３１０、トランザクション・コーディネータ５１、スナップショット・パティシパント７１、トランザクション・マネージャ７３、コピーオンライト処理部７９などの機能は、プログラムとしてＣＰＵ２５０３で実行されて実現される。また、ＨＤＤ２５０５及びメモリ２５０１は、データ格納部３２０、データ格納部７５、ログ格納部８１及びデータベース８２の少なくとも一部が実現される。
【０１０８】
念のため、以下に３フェーズコミットプロトコルとコピーオンライトについて補足しておく。
【０１０９】
（Ａ）３フェーズコミットプロトコル
２フェーズコミットプロトコルでは、パティシパントが確認応答を送信後コミットを受信する前に、コーディネータがダウンした場合、コミットもアボートもできない、いわゆるブロッキングの状態が発生してしまう。この問題を解決するために考案されたのが、３フェーズコミットプロトコルである。
【０１１０】
２フェーズコミットプロトコルとの違いは、図２５に示すように「ｐｒｅｐａｒｅ」「ａｃｋ」のやりとりの後に、さらに「ｐｒｅＣｏｍｍｉｔ」、「ａｃｋ」のやりとりを行うことにある。このやりとりを行うこと、すなわち「ｐｒｅＣｏｍｍｉｔ」を受け取ることにより、全てのパティシパントは、全パティシパントでの処理が正常終了し、トランザクションをコミットできる状態にあることを知ることができる。そして、その後で実際にｃｏｍｍｉｔを行う。この「ｐｒｅＣｏｍｍｉｔ」、「ａｃｋ」のやりとりを行うことで、詳しい説明は省くが、ノード障害が原因のブロッキングを避けることができる。
【０１１１】
なお、本実施の形態で関係するのは、２フェーズコミットプロトコル同様、最後のａｃｋ（「ｐｒｅｐａｒｅ」の後の「ａｃｋ」ではない）、ｃｏｍｍｉｔのやりとりである。
【０１１２】
また、「ａｃｋ」「ｃｏｍｍｉｔ」に関するログの書き出しに関しても、２フェーズコミットプロトコルと同様である。
【０１１３】
（Ｂ）コピーオンライト
ここでは、集中型におけるコピーオンライトとデータの更新との関係について、ページ単位のデータベースの格納構造を基に、より詳しく説明する。ページは４ＫＢ、８ＫＢといった固定長のブロックであり、ディスクとの入出力の単位になっている。但し、ページ単位ではなくレコード単位であっても良い。
【０１１４】
図２６に示すように、データベースファイルが５ページからなっているものとする。左側の数字はページの番号である。
【０１１５】
スナップショット取得時には、スナップショット・データの保管用のファイルであるスナップショットファイルが用意される。このファイルのページ０には、どのページがスナップショット後に更新されたかを示す情報が格納される。スナップショットファイルの１乃至５ページはデータベースファイルの同じ番号のページに対応しているものとする。但し、スナップショット取得時には、これらの領域は割り当てられず空である。
【０１１６】
スナップショット取得後の更新時１に、データベースファイルのページ３が書き換えられるものとする。そうすると、ページ３のページを更新する前に、その内容がスナップショットファイルの第３ページにコピーされる。その後に、データベースファイルの第３ページが更新される。図の矢印は更新を表している。
【０１１７】
更新時２に更にデータベースファイルのページ５が更新されたものとする。この時にも、ページ３同様、スナップショットファイルのページ５にコピーを格納した後に、データベースファイルのページ５が更新される。
【０１１８】
更新時３に更にページ３が再度更新されたものとする。この際には、データベースファイルは更新されるが、スナップショットファイルには、更新前のページはコピーされない。これは、既にスナップショット取得時の内容がスナップショットファイルに保持されておりコピーする必要がないからである。もし、さらにコピーしてしまうと、スナップショット取得時の情報が失われてしまうことになる。
【０１１９】
次にページの参照について説明する。スナップショット後に更新されていないページについては、データベースファイルのページを参照し、更新されたページについては、スナップショットファイルのページを参照する。たとえば、更新時２以降であれば、ページ３，５についてはスナップショットファイルを、それ以外のページについては、データベースファイルを参照する。どちらのファイルを参照するかは、スナップショットファイルのページ０の情報により、判断できる。
【０１２０】
このように、コピーオンライトの方式では、スナップショット取得時には、ほとんど空のファイルを準備するだけで済むため、即時にスナップショットを取得することが可能となる。ただし、更新時に遅延してコピーを行うため、更新処理はその分重くなる。また、スナップショット取得後に全てのページが更新された場合は、スナップショット取得時にコピーを行う処理と同様、データベースファイルとほぼ同じ大きさの領域が必要になる。
【０１２１】
以上述べた本実施の形態をまとめると、以下のようになる。
【０１２２】
スナップショット・パティシパント・ノードであるコンピュータにより実行されるスナップショット取得処理方法は、（Ａ）スナップショットの取得指示を受けたコーディネータ・ノードからスナップショット・リクエストを受信すると、稼働中のトランザクションを特定し、当該稼働中のトランザクションの状態を表すデータを、コーディネータ・ノードに送信する送信ステップと、（Ｂ）稼働中のトランザクションを特定した後、稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施するステップと、（Ｃ）コーディネータ・ノードから、スナップショット・データにトランザクションの結果を反映させる特定のトランザクションのリスト又はスナップショット・データにトランザクションの結果を反映させない他のトランザクションのリストを受信する受信ステップと、（Ｄ）特定のトランザクションについては正常終了阻止処理の対象から外して特定のトランザクションの全ての正常終了又はキャンセルを確認した後の特定の時刻を基準に、コピーオンライトを実行させるコピーオンライト開始ステップとを含む。
【０１２３】
このように、処理結果をスナップショットに反映させる可能性のあるトランザクションについては特定の時刻までに正常終了又はキャンセルさせて当該特定の時刻を基準にコピーオンライトを実施すれば、一貫性のあるスナップショットを即時に得ることができるようになる。なお、特定のトランザクションの方が多い場合には、上記他のトランザクションはリストの方が通信量の面で有利なこともある。
【０１２４】
なお、上で述べた正常終了阻止処理が、コミットの受信阻止のための処理である場合もある。さらに、上で述べたコピーオンライト開始ステップが、特定のトランザクションのプロセスに、受信阻止されていたコミットを出力するステップを含む場合もある。２フェーズコミットプロトコルなどの確認応答に対してコミットを出力するようなプロトコルを採用している場合に対処可能である。
【０１２５】
また、上で述べた稼働中のトランザクションが、コミットの受信前のトランザクションのうち否定応答を出力したトランザクション及びアボートを受信したトランザクションを除外したトランザクションに限定される場合もある。トランザクションの結果がデータベースなどに反映される可能性のあるものに絞り込んで、スナップショット・コーディネータの処理負荷を減らすものである。
【０１２６】
さらに、上で述べた正常終了阻止処理が、コミットを受信していないトランザクションからの確認応答の送信を阻止する送信阻止処理を含むようにしてもよい。この場合、本スナップショット取得処理方法は、上記特定の時刻後に、送信阻止処理が行われた確認応答を、トランザクション・コーディネータに送信するステップと、特定の時刻後に、上記他のトランザクションに、正常終了又はキャンセルを行わせるステップとをさらに含むようにしても良い。このようにすれば、確実に、上記他のトランザクションの処理結果をスナップショットに含ませないようにすることができるようになる。
【０１２７】
さらに、上で述べた送信ステップにおいて、稼働中のトランザクションを特定すると、当該稼働中のトランザクションの識別子のリストを、データ格納部に格納するようにしてもよい。さらに、上で述べた正常終了阻止処理において、データ格納部に格納されている稼働中のトランザクションの識別子のリストに基づき、稼働中のトランザクションの正常終了を阻止するようにしてもよい。さらに、上で述べた受信ステップにおいて、コーディネータ・ノードから受信したリストを、データ格納部に格納するようにしてもよい。そして、データ格納部に格納されており且つコーディネータ・ノードから受信した上記リストに基づき、特定のトランザクションの全てが正常終了したか又はキャンセルされたかを確認するようにしてもよい。このようにすれば処理が確実に行われる。
【０１２８】
スナップショット・コーディネータ・ノードであるコンピュータに実行されるスナップショット取得処理方法は、（Ａ）スナップショットの取得指示を受けると、システムに属する複数のパティシパント・ノードの各々に、スナップショット・リクエストを送信するステップと、（Ｂ）複数のパティシパント・ノードの各々から、稼働中のトランザクションの識別子及び当該トランザクションの状態を表すデータを受信し、送信元ノードの識別子に対応付けてデータ格納部に格納するステップと、（Ｃ）データ格納部に識別子が格納されているトランザクションのうち、関係する全ての送信元ノードにおいて確認応答出力済みであるトランザクションを選択トランザクションとして特定するステップと、（Ｄ）選択トランザクションのリスト又はデータ格納部に識別子が格納されているトランザクションのうち選択トランザクション以外のトランザクションである他のトランザクションのリストを、複数のパティシパント・ノードの各々に送信するステップとを含む。なお、上記リストはパティシパント・ノード毎に生成するようにしてもよい。
【０１２９】
なお、上で述べたような処理をコンピュータに実施させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、ＣＤ−ＲＯＭ、光磁気ディスク、半導体メモリ（例えばＲＯＭ）、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。なお、処理途中のデータについては、ＲＡＭ等の記憶装置に一時保管される。
【０１３０】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１３１】
（付記１）
スナップショットの取得指示を受けた第１のノードからスナップショットリクエストを受信すると、稼働中のトランザクションを特定し、当該稼働中のトランザクションの状態を表すデータを、前記第１のノードに送信する送信ステップと、
前記稼働中のトランザクションを特定した後、前記稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施するステップと、
前記第１のノードから、スナップショットデータにトランザクションの結果を反映させる特定のトランザクションのリスト又は前記スナップショットデータにトランザクションの結果を反映させない他のトランザクションのリストを受信する受信ステップと、
前記特定のトランザクションについては前記正常終了阻止処理の対象から外して前記特定のトランザクションの全ての正常終了又はキャンセルを確認した後の特定の時刻を基準に、コピーオンライトを実行させるコピーオンライト開始ステップと、
を、第２のノードに実行させるためのスナップショット取得処理プログラム。
【０１３２】
（付記２）
前記正常終了阻止処理が、コミットの受信阻止のための処理であり、
前記コピーオンライト開始ステップが、
前記特定のトランザクションのプロセスに、受信阻止されていたコミットを出力するステップ
を含む付記１記載のスナップショット取得処理プログラム。
【０１３３】
（付記３）
前記稼働中のトランザクションが、前記コミットの受信前のトランザクションのうち否定応答を出力したトランザクション及びアボートを受信したトランザクションを除外したトランザクションである
付記２記載のスナップショット取得処理プログラム。
【０１３４】
（付記４）
前記正常終了阻止処理が、前記コミットを受信していないトランザクションからの確認応答の送信を阻止する送信阻止処理を含み、
前記特定の時刻後に、前記送信阻止処理が行われた前記確認応答を、トランザクションコーディネータに送信するステップと、
前記特定の時刻後に、前記他のトランザクションに、正常終了又はキャンセルを行わせるステップと、
をさらに前記第２のノードに実行させるための付記２又は３記載のスナップショット取得処理プログラム。
【０１３５】
（付記５）
前記送信ステップにおいて、
前記稼働中のトランザクションを特定すると、当該稼働中のトランザクションの識別子のリストを、データ格納部に格納し、
前記正常終了阻止処理において、前記データ格納部に格納されている前記稼働中のトランザクションの識別子のリストに基づき、前記稼働中のトランザクションの正常終了を阻止し、
前記受信ステップにおいて、
前記第１のノードから受信した前記リストを、前記データ格納部に格納し、
前記データ格納部に格納されており且つ前記第１のノードから受信した前記リストに基づき、前記特定のトランザクションの全てが正常終了したか又はキャンセルされたかを確認する
付記１乃至４のいずれか１つ記載のスナップショット取得処理プログラム。
【０１３６】
（付記６）
スナップショットの取得指示を受けると、システムに属する複数の第１のノードの各々に、スナップショットリクエストを送信するステップと、
前記複数の第１のノードの各々から、前記稼働中のトランザクションの識別子及び当該トランザクションの状態を表すデータを受信し、送信元ノードの識別子に対応付けてデータ格納部に格納するステップと、
前記データ格納部に識別子が格納されているトランザクションのうち、関係する全ての送信元ノードにおいて確認応答出力済みであるトランザクションを選択トランザクションとして特定するステップと、
前記選択トランザクションのリスト又は前記データ格納部に識別子が格納されているトランザクションのうち前記選択トランザクション以外のトランザクションである他のトランザクションのリストを、前記複数の第１のノードの各々に送信するステップと、
を、第２のノードに実行させるためのスナップショット取得処理プログラム。
【０１３７】
（付記７）
スナップショットの取得指示を受けた第１のノードからスナップショットリクエストを受信すると、稼働中のトランザクションを特定し、当該稼働中のトランザクションの状態を表すデータを、前記第１のノードに送信するステップと、
前記稼働中のトランザクションを特定した後、前記稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施するステップと、
前記第１のノードから、スナップショットデータにトランザクションの結果を反映させる特定のトランザクションのリスト又は前記スナップショットデータにトランザクションの結果を反映させない他のトランザクションのリストを受信するステップと、
前記特定のトランザクションについては前記正常終了阻止処理の対象から外して前記特定のトランザクションの全ての正常終了又はキャンセルを確認した後の特定の時刻を基準に、コピーオンライトを実行するステップと、
を含み、第２のノードにより実行されるスナップショット取得処理方法。
【０１３８】
（付記８）
スナップショットの取得指示を受けると、システムに属する複数の第１のノードの各々に、スナップショットリクエストを送信するステップと、
前記複数の第１のノードの各々から、前記稼働中のトランザクションの識別子及び当該トランザクションの状態を表すデータを受信し、送信元ノードの識別子に対応付けてデータ格納部に格納するステップと、
前記データ格納部に識別子が格納されているトランザクションのうち、関係する全ての送信元ノードにおいて確認応答出力済みであるトランザクションを選択トランザクションとして特定するステップと、
前記選択トランザクションのリスト又は前記データ格納部に識別子が格納されているトランザクションのうち前記選択トランザクション以外のトランザクションである他のトランザクションのリストを、前記複数の第１のノードの各々に送信するステップと、
を含み、第２のノードにより実行されるスナップショット取得処理方法。
【０１３９】
（付記９）
スナップショットの取得指示を受けたノードからスナップショットリクエストを受信するパティシパント処理部と、
稼働中のトランザクションを特定し、当該稼働中のトランザクションの状態を表すデータを生成するトランザクションマネージャと、
を有し、
前記パティシパント処理部は、
前記稼働中のトランザクションの状態を表すデータを前記ノードに送信し、
前記トランザクションマネージャは、
前記稼働中のトランザクションを特定した後、前記稼働中のトランザクションの正常終了を阻止する正常終了阻止処理を実施し、
前記パティシパント処理部は、
前記ノードから、スナップショットデータにトランザクションの結果を反映させる特定のトランザクションのリスト又は前記スナップショットデータにトランザクションの結果を反映させない他のトランザクションのリストを受信し、
前記特定のトランザクションについては前記正常終了阻止処理の対象から外して前記特定のトランザクションの全ての正常終了又はキャンセルを確認した後の特定の時刻を基準に、コピーオンライトを実行させる
コンピュータ。
【０１４０】
（付記１０）
スナップショットの取得指示を受けると、システムに属する複数のノードの各々に、スナップショットリクエストを送信し、前記複数のノードの各々から、前記稼働中のトランザクションの識別子及び当該トランザクションの状態を表すデータを受信し、送信元ノードの識別子に対応付けてデータ格納部に格納する送受信部と、
前記データ格納部に識別子が格納されているトランザクションのうち、関係する全ての送信元ノードにおいて確認応答出力済みであるトランザクションを選択トランザクションとして特定するトランザクション選択部と、
を有し、
前記送受信部が、
前記選択トランザクションのリスト又は前記データ格納部に識別子が格納されているトランザクションのうち前記選択トランザクション以外のトランザクションである他のトランザクションのリストを、前記複数のノードの各々に送信する
コンピュータ。
【符号の説明】
【０１４１】
１  ネットワーク    ３  コーディネータ・ノード
５  トランザクション・コーディネータ・ノード
７  パティシパント・ノード
３１０  スナップショット・コーディネータ
３１１  トランザクション選択部
３１３  メッセージ送受信部
３２０  データ格納部
５１  トランザクション・コーディネータ
７１  スナップショット・パティシパント
７３  トランザクション・マネージャ
７５  データ格納部
７７  トランザクションプロセス
７９  コピーオンライト処理部
８１  ログ格納部    ８２  データベース
【図１】
2012018449.tif 000003
【図２】
2012018449.tif 000004
【図３】
2012018449.tif 000005
【図４】
2012018449.tif 000006
【図５】
2012018449.tif 000007
【図６】
2012018449.tif 000008
【図７】
2012018449.tif 000009
【図８】
2012018449.tif 000010
【図９Ａ】
2012018449.tif 000011
【図９Ｂ】
2012018449.tif 000012
【図１０】
2012018449.tif 000013
【図１１】
2012018449.tif 000014
【図１２】
2012018449.tif 000015
【図１３】
2012018449.tif 000016
【図１４】
2012018449.tif 000017
【図１５】
2012018449.tif 000018
【図１６】
2012018449.tif 000019
【図１７】
2012018449.tif 000020
【図１８】
2012018449.tif 000021
【図１９】
2012018449.tif 000022
【図２０】
2012018449.tif 000023
【図２１】
2012018449.tif 000024
【図２２】
2012018449.tif 000025
【図２３】
2012018449.tif 000026
【図２４】
2012018449.tif 000027
【図２５】
2012018449.tif 000028
【図２６】
2012018449.tif 000029