(57)【要約】【課題】各データベース間の整合性を保ちつつ、レプリケーションに要する処理時間を短くすることができる分散データベースシステムを提供する。【解決手段】マスタＤＢ８０のプリペア要求手段８１は、トランザクションのコミット指示がなされたときに、そのトランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢ９０に対して、プリペア処理を指示するプリペア要求を行う。コミット手段８２は、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢ９０から送信される処理結果が全て成功の場合、その全てのスレーブＤＢ９０に対してトランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについてそのトランザクションのコミット処理を行う。【選択図】図１４
2016071526.tif 000002
【特許請求の範囲】
【請求項１】
複数のスレーブＤＢと、
更新情報を前記複数のスレーブＤＢに反映させるマスタＤＢとを備え、
前記マスタＤＢは、
トランザクションのコミット指示がなされたときに、当該トランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、前記プリペア処理を指示するプリペア要求を行うプリペア要求手段と、
同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、当該全てのスレーブＤＢに対して前記トランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについて当該トランザクションのコミット処理を行うコミット手段とを含み、
前記スレーブＤＢは、
前記マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合に当該トランザクションのコミット処理を行うとともに、自身のＤＢに対してプリペア処理を行い、当該プリペア処理の処理結果を前記マスタＤＢに送信するプリペア手段を含む
ことを特徴とする分散データベースシステム。
【請求項２】
マスタＤＢのコミット手段は、同一のトランザクションについてのプリペア要求に対してスレーブＤＢから送信される処理結果の少なくとも一部が失敗である場合、全てのスレーブＤＢに対して前記トランザクションのロールバック処理を指示するロールバック要求を行うとともに自身のＤＢのロールバック処理を行う
請求項１記載の分散データベースシステム。
【請求項３】
スレーブＤＢのプリペア手段は、トランザクションのロールバック要求を受信した場合、プリペア状態のトランザクションのロールバック処理を行う
請求項２記載の分散データベースシステム。
【請求項４】
スレーブＤＢのプリペア手段は、マスタＤＢへの変更指示を受けたときに、他のスレーブＤＢのトランザクションの進行状況に基づいて、当該他のスレーブＤＢに対してトランザクションのロールバック要求またはコミット要求を行う
請求項１から請求項３のうちのいずれか１項に記載の分散データベースシステム。
【請求項５】
変更指示を受けたスレーブＤＢのプリペア手段は、他のスレーブＤＢ間のトランザクションの進行状況が異なる場合、いずれかのスレーブＤＢでコミット処理が行われているトランザクションが存在する場合、他のスレーブＤＢに対して当該トランザクションのコミット要求を行い、コミット処理が行われていないプリペア状態のトランザクションが一部のスレーブＤＢにのみ存在する場合、当該プリペア状態のトランザクションを有するスレーブＤＢに対して、当該トランザクションのロールバック指示を行う
請求項４記載の分散データベースシステム。
【請求項６】
更新情報を複数のスレーブＤＢに反映させるマスタＤＢであって、
トランザクションのコミット指示がなされたときに、当該トランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、前記プリペア処理を指示するプリペア要求を行うプリペア要求手段と、
同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、当該全てのスレーブＤＢに対して前記トランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについて当該トランザクションのコミット処理を行うコミット手段とを備え、
前記プリペア要求手段は、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合に当該トランザクションのコミット処理を行うとともに自身のＤＢに対してプリペア処理を行い、当該プリペア処理の処理結果をマスタＤＢに送信するスレーブＤＢに対して、プリペア要求を行う
ことを特徴とするマスタＤＢ。
【請求項７】
コミット手段は、同一のトランザクションについてのプリペア要求に対してスレーブＤＢから送信される処理結果の少なくとも一部が失敗である場合、全てのスレーブＤＢに対して前記トランザクションのロールバック処理を指示するロールバック要求を行うとともに自身のＤＢのロールバック処理を行う
請求項６記載のマスタＤＢ。
【請求項８】
１つのマスタＤＢと複数のスレーブＤＢを含む分散データベースシステムにおいて、前記マスタＤＢで更新した更新情報を前記複数のスレーブＤＢに反映させるレプリケーション方法であって、
前記マスタＤＢが、トランザクションのコミット指示がなされたときに、当該トランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行い、
前記マスタＤＢが、全てのスレーブＤＢに対して、前記プリペア処理を指示するプリペア要求を行い、
前記スレーブＤＢが、前記プリペア要求に応じて、自身のＤＢに対してプリペア処理を行い、当該プリペア処理の処理結果を前記マスタＤＢに送信し、
前記マスタＤＢは、同一のトランザクションについてのプリペア要求に対して前記全てのスレーブＤＢから送信される処理結果が全て成功の場合、当該全てのスレーブＤＢに対して前記トランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについて当該トランザクションのコミット処理を行い、
前記スレーブＤＢが、前記プリペア要求を受信したときにプリペア状態のトランザクションが存在した場合、当該トランザクションのコミット処理を行う
ことを特徴とするレプリケーション方法。
【請求項９】
更新情報を複数のスレーブＤＢに反映させるマスタＤＢの更新情報反映方法であって、
トランザクションのコミット指示がなされたときに、当該トランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、前記プリペア処理を指示するプリペア要求を行い、
同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、当該全てのスレーブＤＢに対して前記トランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについて当該トランザクションのコミット処理を行い、
前記プリペア要求では、プリペア要求を、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合に当該トランザクションのコミット処理を行うとともに自身のＤＢに対してプリペア処理を行い、当該プリペア処理の処理結果をマスタＤＢに送信するスレーブＤＢに対して行う
ことを特徴とする更新情報反映方法。
【請求項１０】
更新情報を複数のスレーブＤＢに反映させるマスタＤＢを含むコンピュータに適用されるマスタＤＢプログラムであって、
前記コンピュータに、
トランザクションのコミット指示がなされたときに、当該トランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、前記プリペア処理を指示するプリペア要求を行うプリペア要求処理、および、
同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、当該全てのスレーブＤＢに対して前記トランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについて当該トランザクションのコミット処理を行うコミット処理を実行させ、
前記プリペア要求処理で、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合に当該トランザクションのコミット処理を行うとともに自身のＤＢに対してプリペア処理を行い、当該プリペア処理の処理結果をマスタＤＢに送信するスレーブＤＢに対して、プリペア要求を行わせる
ためのマスタＤＢプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、分散データベースシステム、マスタＤＢ、レプリケーション方法、更新情報反映方法およびマスタＤＢプログラムに関する。
【背景技術】
【０００２】
分散データベースシステムでは、トランザクションの整合性を保つため、一般的に２相（２フェーズ）コミットと呼ばれる分散アルゴリズムが用いられる。２相コミットでは、調整者と呼ばれるデータベース（以下、単にＤＢと記す。）が、参加者と呼ばれるＤＢ全てを調整する。
【０００３】
２相コミットは、調整者が全ての参加者の調整を行うプリペア要求相と、調整者の決定により全ての参加者のトランザクションを完了させるコミット要求相により実現される。ここでプリペアとは、トランザクションをコミットまたはロールバックできる状態まで処理を進めることを意味する。具体的には、調整者が、参加者に更新ログ情報を送信することで、参加者の調整を行う。
【０００４】
図１６は、２相コミットを用いた一般的な分散データベースシステムを示す説明図である。まず、クライアント５０は、分散データベースシステム６０に対して、コミット要求を行う（ステップＳ８１）。分散データベースシステム６０では、調整者６１が各参加者６２に対してプリペア要求を行う（ステップＳ８２）。そして、調整者６１は、参加者６２からの応答を待って参加者にコミット要求を行う（ステップＳ８３）。処理が完了すると、分散データベースシステム６０は、クライアント５０に対してコミット結果を応答する（ステップＳ８４）。
【０００５】
図１７は、２相コミットの一般的な処理を示すシーケンス図である。プリペア要求相において、調整者６１は、各参加者６２に対してプリペア要求を行う（ステップＳ９１）。各参加者６２は、要求に応じてプリペア処理を行い（ステップＳ９２）、処理結果を調整者６１に応答する（ステップＳ９３）。
【０００６】
次に、コミット要求相において、調整者６１は、各参加者に対してトランザクションのコミットまたはロールバック要求を行う（ステップＳ９４）。参加者６２は、要求に応じてコミットまたはロールバック処理を行い（ステップＳ９５）、処理結果を調整者６１に応答する（ステップＳ９６）。
【０００７】
なお、特許文献１には、コミット処理の同期制御を効率的に行うことができるデータベース同期制御方式が記載されている。特許文献１に記載された方式では、更新サーバ数の数に応じて２フェーズ処理を行うかどうかが判断される。
【先行技術文献】
【特許文献】
【０００８】
【特許文献１】特開平４−８４２３８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００９】
図１７の破線枠で示すように、２相コミットにおいて、調整者は、全ての参加者からプリペア処理の応答メッセージを受信した後、参加者にコミットまたはロールバック要求メッセージを再度送信し、応答を受信するまで待ち合わせる。すなわち、２相コミットでは、調整者と参加者との間で、プリペア要求とコミット要求の２回の要求について送受信が行われるため、処理時間が長くなってしまうという問題がある。
【００１０】
また、特許文献１に記載された方式でも、更新サーバ数が２以上の場合には、全てのサーバに対してプリペア要求およびコミット要求が行われる。そのため、更新サーバ数が２以上の場合であっても、処理を効率化してレプリケーションに要する処理時間を短くできることが好ましい。
【００１１】
そこで、本発明は、各データベース間の整合性を保ちつつ、レプリケーションに要する処理時間を短くすることができる分散データベースシステム、マスタＤＢ、レプリケーション方法、更新情報反映方法およびマスタＤＢプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
本発明による分散データベースシステムは、複数のスレーブＤＢと、更新情報を複数のスレーブＤＢに反映させるマスタＤＢとを備え、マスタＤＢが、トランザクションのコミット指示がなされたときに、そのトランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、プリペア処理を指示するプリペア要求を行うプリペア要求手段と、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、その全てのスレーブＤＢに対してトランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについてそのトランザクションのコミット処理を行うコミット手段とを含み、スレーブＤＢが、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合にそのトランザクションのコミット処理を行うとともに、自身のＤＢに対してプリペア処理を行い、そのプリペア処理の処理結果をマスタＤＢに送信するプリペア手段を含むことを特徴とする。
【００１３】
本発明によるマスタＤＢは、更新情報を複数のスレーブＤＢに反映させるマスタＤＢであって、トランザクションのコミット指示がなされたときに、そのトランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、プリペア処理を指示するプリペア要求を行うプリペア要求手段と、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、その全てのスレーブＤＢに対してトランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについてそのトランザクションのコミット処理を行うコミット手段とを備え、プリペア要求手段が、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合にそのトランザクションのコミット処理を行うとともに自身のＤＢに対してプリペア処理を行い、そのプリペア処理の処理結果をマスタＤＢに送信するスレーブＤＢに対して、プリペア要求を行うことを特徴とする。
【００１４】
本発明によるレプリケーション方法は、１つのマスタＤＢと複数のスレーブＤＢを含む分散データベースシステムにおいて、マスタＤＢで更新した更新情報を複数のスレーブＤＢに反映させるレプリケーション方法であって、マスタＤＢは、トランザクションのコミット指示がなされたときに、そのトランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行い、マスタＤＢが、全てのスレーブＤＢに対して、プリペア処理を指示するプリペア要求を行い、スレーブＤＢが、プリペア要求に応じて、自身のＤＢに対してプリペア処理を行い、そのプリペア処理の処理結果をマスタＤＢに送信し、マスタＤＢは、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、その全てのスレーブＤＢに対してトランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについてそのトランザクションのコミット処理を行い、スレーブＤＢは、プリペア要求を受信したときにプリペア状態のトランザクションが存在した場合、そのトランザクションのコミット処理を行うことを特徴とする。
【００１５】
本発明による更新情報反映方法は、更新情報を複数のスレーブＤＢに反映させるマスタＤＢの更新情報反映方法であって、トランザクションのコミット指示がなされたときに、そのトランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、プリペア処理を指示するプリペア要求を行い、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、その全てのスレーブＤＢに対してトランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについてそのトランザクションのコミット処理を行い、プリペア要求では、プリペア要求を、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合にそのトランザクションのコミット処理を行うとともに自身のＤＢに対してプリペア処理を行い、そのプリペア処理の処理結果をマスタＤＢに送信するスレーブＤＢに対して行うことを特徴とする。
【００１６】
本発明によるマスタＤＢプログラムは、更新情報を複数のスレーブＤＢに反映させるマスタＤＢを含むコンピュータに適用されるマスタＤＢプログラムであって、コンピュータに、トランザクションのコミット指示がなされたときに、そのトランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、プリペア処理を指示するプリペア要求を行うプリペア要求処理、および、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、その全てのスレーブＤＢに対してトランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについてそのトランザクションのコミット処理を行うコミット処理を実行させ、プリペア要求処理で、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合にそのトランザクションのコミット処理を行うとともに自身のＤＢに対してプリペア処理を行い、そのプリペア処理の処理結果をマスタＤＢに送信するスレーブＤＢに対して、プリペア要求を行わせることを特徴とする。
【発明の効果】
【００１７】
本発明によれば、各データベース間の整合性を保ちつつ、レプリケーションに要する処理時間を短くすることができる。
【図面の簡単な説明】
【００１８】
【図１】本発明による分散データベースシステムの第１の実施形態の構成例を示すブロック図である。
【図２】第１の実施形態の分散データベースシステムの動作例を示すシーケンス図である。
【図３】スレーブＤＢでプリペア処理が失敗したときの動作例を示すシーケンス図である。
【図４】スレーブＤＢでプリペア処理が失敗したときの他の動作例を示すシーケンス図である。
【図５】プリペア処理が成功した場合の動作例を示す説明図である。
【図６】マスタＤＢでプリペア処理が失敗した時の動作例を示す説明図である。
【図７】スレーブＤＢでプリペア処理が失敗したときの動作例を示す説明図である。
【図８】スレーブＤＢでプリペア処理が失敗したときの他の動作例を示す説明図である。
【図９】第２の実施形態の分散データベースシステムの動作例を示すシーケンス図である。
【図１０】マスタＤＢに障害が発生した場合の動作例を示す説明図である。
【図１１】マスタＤＢに障害が発生した場合の他の動作例を示す説明図である。
【図１２】マスタＤＢに障害が発生した場合の更に他の動作例を示す説明図である。
【図１３】マスタＤＢに障害が発生した場合の更に他の動作例を示す説明図である。
【図１４】本発明による分散データベースシステムの概要を示すブロック図である。
【図１５】本発明によるマスタＤＢの概要を示すブロック図である。
【図１６】２相コミットを用いた一般的な分散データベースシステムを示す説明図である。
【図１７】２相コミットの一般的な処理を示す説明図である。
【発明を実施するための形態】
【００１９】
以下、本発明の実施形態を図面を参照して説明する。
本実施形態では、１つのマスタデータベース（以下、マスタＤＢと記す。）と複数のスレーブデータベース（以下、スレーブＤＢと記す。）を含む分散データベースシステムを想定する。本実施形態の分散データベースシステムでは、マスタＤＢで更新した更新情報（ログ）を他の全スレーブＤＢに反映させるレプリケーションを行う。
【００２０】
また、本実施形態で用いられるＤＢは、メモリデータベースを想定する。トランザクションをコミットまたはロールバックできる状態（以下、プリペア状態と記す。）にする処理（すなわち、プリペア処理）では、共有メモリのリソースが確保される。共有メモリのリソース確保が成功すれば、コミット処理で新たなリソースを追加することがない。また、コミット処理でディスクにログを出力することもないため、コミット処理が失敗することがない。したがって、本実施形態の分散データベースシステムは、プリペア処理が成功したならば、コミット処理が成功するとみなせるものである。
【００２１】
本実施形態の分散データベースシステムは、複数のデータベースを含む。複数のデータベースのうち、マスタとして動作するマスタＤＢが１つ決定され、残りのＤＢはスレーブＤＢとして動作する。以下の説明では、便宜上マスタＤＢとスレーブＤＢとを分けて説明するが、マスタＤＢとスレーブＤＢの構成は同一であってもよく、異なっていてもよい。
【００２２】
実施形態１．
図１は、本発明による分散データベースシステムの第１の実施形態の構成例を示すブロック図である。図１に例示する分散データベースシステム１００は、マスタＤＢ１０と、２台のスレーブＤＢ２０（具体的には、スレーブＤＢ２０ａおよびスレーブＤＢ２０ｂ）とを備えている。
【００２３】
分散データベースシステム１００は、クライアント３０に接続され、クライアント３０からのトランザクションを受け付ける。そして、クライアントからトランザクションのコミット指示がなされると、マスタＤＢ１０からスレーブＤＢ２０へのレプリケーションが行われる。
【００２４】
以下の説明では、スレーブＤＢに共通する機能を説明する場合、その主体をスレーブＤＢ２０と記し、各スレーブＤＢを区別して説明する場合、その主体をそれぞれスレーブＤＢ２０ａ、スレーブＤＢ２０ｂと記す。また、図１では、分散データベースシステムがスレーブＤＢ２０を２つ備えている場合を例示しているが、スレーブＤＢ２０の数は２台に限定されず、３台以上であってもよい。
【００２５】
マスタＤＢ１０は、各種制御を行うトランザクション制御部１１と、記憶部１２とを含む。また、各スレーブＤＢ２０も、各種制御を行うトランザクション制御部２１と、記憶部２２とを含む。
【００２６】
なお、以下の説明では、マスタＤＢ１０に含まれる記憶部１２のことをマスタＤＢと記すこともある。また、スレーブＤＢ２０ａおよびスレーブＤＢ２０ｂに含まれる記憶部２２のことを、それぞれスレーブＤＢ１およびスレーブＤＢ２と記すこともある。
【００２７】
マスタＤＢ１０のトランザクション制御部１１は、クライアント３０からトランザクションのコミット指示がなされると、自身のＤＢに対してプリペア処理を行うとともに、全てのスレーブＤＢ２０に対して、プリペア処理の要求（以下、プリペア要求と記す。）を行う。
【００２８】
また、トランザクション制御部１１は、同一のトランザクションについてのプリペア要求に対する処理結果を、全てのスレーブＤＢ２０から受信する。処理結果が全て成功の場合、トランザクション制御部１１は、自身のＤＢについて上記トランザクションのコミット処理を行う。ただし、トランザクション制御部１１は、スレーブＤＢ２０に対して、上記トランザクションのコミット処理の要求（以下、コミット要求と記す。）は行わない。
【００２９】
したがって、この処理により、マスタＤＢは、トランザクションのコミットが行われている一方、スレーブＤＢ１およびスレーブＤＢ２は、トランザクションのコミットまたはロールバックが可能な状態（すなわち、プリペア状態）になっている。
【００３０】
一方、同一のトランザクションについてのプリペア要求に対してスレーブＤＢ２０から送信される処理結果の少なくとも一部が失敗である場合、トランザクション制御部１１は、全てのスレーブＤＢ２０に対してトランザクションのロールバック処理の要求（以下、ロールバック要求と記す。）を行う。さらに、トランザクション制御部１１は、自身のＤＢのロールバック処理を行う。
【００３１】
スレーブＤＢ２０のトランザクション制御部２１は、マスタＤＢ１０からのプリペア要求に応じて、自身のＤＢに対してプリペア処理を行う。そして、トランザクション制御部２１は、そのプリペア処理の処理結果（具体的には、プリペア処理が成功したか失敗したか）をマスタＤＢ１０に送信する。
【００３２】
さらに、トランザクション制御部２１は、プリペア要求を受信したときにプリペア状態のトランザクションが存在した場合には、そのトランザクションのコミット処理を行う。すなわち、トランザクション制御部２１は、プリペア状態のトランザクションに対するコミット要求ではなく、他のトランザクションについてのプリペア要求を受信したときに、プリペア状態のトランザクションのコミット処理を行う。
【００３３】
本実施形態の分散データベースシステム１００は、プリペア処理が成功すればコミット処理が失敗する可能性がないことを前提としている。そこで、マスタＤＢ１０は、スレーブＤＢ２０のプリペア処理が成功した段階でコミットされたものと扱い、コミット要求をスレーブＤＢ２０に送信しない。
【００３４】
このようにすることで、マスタＤＢ１０がスレーブＤＢ２０に行うコミット要求に要する処理時間およびスレーブＤＢ２０の応答を待つ時間を削減でき、コミット処理に要する処理時間を短縮できるため、レプリケーションに要する処理時間を短くすることができる。言い換えると、本実施形態の分散データベースシステムは、マスタＤＢ１０がスレーブＤＢ２０に対して明示的なコミット要求を行っていないため、実質的に１相コミットを実現していると言える。
【００３５】
トランザクション制御部１１は、プログラム（マスタＤＢプログラム）に従って動作するコンピュータのＣＰＵによって実現される。例えば、プログラムは、マスタＤＢ１０が備える記憶部１２に記憶され、ＣＰＵは、そのプログラムを読み込み、プログラムに従って、トランザクション制御部１１として動作してもよい。記憶部１２は、例えば、磁気ディスク等により実現される。
【００３６】
また、本実施形態では、トランザクション制御部１１と記憶部１２の両方が、マスタＤＢ１０に含まれている場合を例示しているが、それぞれが専用のハードウェアで実現されていてもよい。
【００３７】
同様に、トランザクション制御部２１は、プログラム（スレーブＤＢプログラム）に従って動作するコンピュータのＣＰＵによって実現される。例えば、プログラムは、スレーブＤＢ２０が備える記憶部２２に記憶され、ＣＰＵは、そのプログラムを読み込み、プログラムに従って、トランザクション制御部２１として動作してもよい。記憶部２２は、例えば、磁気ディスク等により実現される。
【００３８】
また、本実施形態では、トランザクション制御部２１と記憶部２２の両方が、スレーブＤＢ２０に含まれている場合を例示しているが、それぞれが専用のハードウェアで実現されていてもよい。
【００３９】
次に、本実施形態の分散データベースシステムの動作を説明する。図２は、本実施形態の分散データベースシステムの動作例を示すシーケンス図である。本動作例では、クライアントから、２種類のトランザクション（トランザクションＡおよびトランザクションＢ）のコミット指示が同期的に行われるものとする。
【００４０】
まず、クライアント３０からマスタＤＢ１０に対してトランザクションＡのコミット指示がなされると、マスタＤＢ１０のトランザクション制御部１１は、自身のＤＢに対してトランザクションＡのプリペア処理を行う（ステップＳ１１）。さらに、トランザクション制御部１１は、全てのスレーブＤＢ２０に対してトランザクションＡのプリペア要求を行う（ステップＳ１２）。
【００４１】
スレーブＤＢ２０がマスタＤＢ１０からプリペア要求を受信すると、スレーブＤＢ２０のトランザクション制御部２１は、プリペア状態のトランザクションが存在するか否か判断する（ステップＳ１３）。プリペア状態のトランザクションが存在する場合（ステップＳ１３におけるＹｅｓ）、トランザクション制御部２１は、トランザクションのコミット処理を行う（ステップＳ１４）。
【００４２】
一方、プリペア状態のトランザクションが存在しない場合（ステップＳ１３におけるＮｏ）、トランザクション制御部２１は、以降のプリペア処理を行う。なお、本動作例では、プリペア状態のトランザクションはまだ存在しないため、コミット処理は行われない。
【００４３】
次に、トランザクション制御部２１は、マスタＤＢ１０からのプリペア要求に応じて、自身のＤＢに対してトランザクションＡのプリペア処理を行う（ステップＳ１５）。そして、トランザクション制御部２１は、そのプリペア処理の処理結果をマスタＤＢ１０に送信する（ステップＳ１６）。
【００４４】
マスタＤＢ１０は、全てのスレーブＤＢ２０からトランザクションＡのプリペア処理の処理結果を受信するまで待機する。なお、一定時間経過しても処理結果が送信されない場合、マスタＤＢ１０は、処理結果が送信されないスレーブＤＢ２０を分散データベースシステム内における無効なスレーブとして切り離してもよい。
【００４５】
トランザクション制御部１１は、トランザクションＡについてのプリペア要求に対する処理結果が全て成功か否か判断する（ステップＳ１７）。処理結果が全て成功の場合（ステップＳ１７におけるＹｅｓ）、トランザクション制御部１１は、自身のＤＢについてトランザクションＡのコミット処理を行う（ステップＳ１８）。
【００４６】
一方、処理結果の少なくとも一部が失敗である場合（ステップＳ１７におけるＮｏ）、トランザクション制御部１１は、全てのスレーブＤＢ２０に対してトランザクションＡのロールバック要求を行う（ステップＳ１９）。また、トランザクション制御部１１は、自身のＤＢのロールバック処理を行う（ステップＳ２０）。なお、本動作例では、全ての処理結果が成功であるものとする。
【００４７】
ここまでで、トランザクションＡについての処理は終了する。すなわち、トランザクション制御部１１は、スレーブＤＢ２０に対して、トランザクションＡのコミット要求を行わない。
【００４８】
次に、クライアント３０からマスタＤＢ１０に対してトランザクションＢのコミット指示がなされると、マスタＤＢ１０のトランザクション制御部１１は、自身のＤＢに対してトランザクションＢのプリペア処理を行う（ステップＳ２１）。さらに、トランザクション制御部１１は、全てのスレーブＤＢ２０に対してトランザクションＢのプリペア要求を行う（ステップＳ２２）。
【００４９】
スレーブＤＢ２０がマスタＤＢ１０からプリペア要求を受信すると、スレーブＤＢ２０のトランザクション制御部２１は、プリペア状態のトランザクションが存在するか否か判断する（ステップＳ２３）。プリペア状態のトランザクションが存在する場合（ステップＳ２３におけるＹｅｓ）、トランザクション制御部２１は、トランザクションのコミット処理を行う（ステップＳ２４）。
【００５０】
本動作例では、プリペア状態のトランザクションＡが存在する。そのため、トランザクション制御部２１は、トランザクションＡのコミット処理を行う。一方、プリペア状態のトランザクションが存在しない場合（ステップＳ２３におけるＮｏ）、トランザクション制御部２１は、以降のプリペア処理を行う。
【００５１】
次に、トランザクション制御部２１は、マスタＤＢ１０からのプリペア要求に応じて、自身のＤＢに対してトランザクションＢのプリペア処理を行う（ステップＳ２５）。そして、トランザクション制御部２１は、そのプリペア処理の処理結果をマスタＤＢ１０に送信する（ステップＳ２６）。マスタＤＢ１０は、全てのスレーブＤＢ２０からトランザクションＢのプリペア処理の処理結果を受信するまで待機する。
【００５２】
トランザクション制御部２１は、トランザクションＢについてのプリペア要求に対する処理結果が全て成功か否か判断する（ステップＳ２７）。処理結果が全て成功の場合（ステップＳ２７におけるＹｅｓ）、トランザクション制御部１１は、自身のＤＢについてトランザクションＢのコミット処理を行う（ステップＳ２８）。
【００５３】
一方、処理結果の少なくとも一部が失敗である場合（ステップＳ２７におけるＮｏ）、トランザクション制御部１１は、全てのスレーブＤＢ２０に対してトランザクションＢのロールバック要求を行う（ステップＳ２９）。また、トランザクション制御部１１は、自身のＤＢのロールバック処理を行う（ステップＳ３０）。なお、本動作例では、全ての処理結果が成功であるものとする。
【００５４】
ここまでで、トランザクションＢについての処理は終了する。トランザクションＡの場合と同様に、トランザクション制御部１１は、スレーブＤＢ２０に対して、トランザクションＢのコミット要求を行わない。
【００５５】
次に、スレーブＤＢ２０でプリペア処理が失敗した時の動作を説明する。初めに、初回のトランザクションＡについてのプリペア要求に対してスレーブＤＢ２０の一部でプリペア処理が失敗した時の動作を説明する。図３は、スレーブＤＢ２０でプリペア処理が失敗したときの動作例を示すシーケンス図である。
【００５６】
クライアント３０からマスタＤＢ１０に対してトランザクションＡのコミット指示がなされてから、マスタＤＢ１０がスレーブＤＢ２０にプリペア要求を行い、各スレーブＤＢ２０がプリペア状態のトランザクションが存在するか否か判断するまでの処理は、図２に例示するステップＳ１１からステップＳ１４までの処理と同様である。
【００５７】
トランザクション制御部２１は、マスタＤＢ１０からのプリペア要求に応じて、自身のＤＢに対してトランザクションＡのプリペア処理を行う（ステップＳ３３）。ここで、プリペア処理が失敗した場合、トランザクション制御部２１は、プリペア処理が失敗したことを示す処理結果をマスタＤＢ１０に送信する（ステップＳ３４）。
【００５８】
トランザクション制御部１１は、トランザクションＡについてのプリペア要求に対する処理結果が全て成功か否か判断する（ステップＳ１７）。本動作例では、処理結果の少なくとも一部が失敗であるため（ステップＳ１７におけるＮｏ）、トランザクション制御部１１は、全てのスレーブＤＢ２０に対してトランザクションＡのロールバック要求を行う（ステップＳ１９）。
【００５９】
スレーブＤＢ２０がロールバック要求を受信すると、トランザクション制御部２１は、トランザクションＡのロールバック処理を行い（ステップＳ３５）、処理結果をマスタＤＢ１０に応答する（ステップＳ３６）。また、トランザクション制御部１１は、自身のＤＢのロールバック処理を行う（ステップＳ２０）。
【００６０】
次に、２回目以降のトランザクションＢについてのプリペア要求に対してスレーブＤＢ２０の一部でプリペア処理が失敗した時の動作を説明する。図４は、スレーブＤＢ２０でプリペア処理が失敗したときの他の動作例を示すシーケンス図である。
【００６１】
クライアント３０からマスタＤＢ１０に対して初回のトランザクションＡのコミット指示がなされてから、マスタＤＢ１０でトランザクションＡのコミット処理が行われるまでの処理は、図２に例示するステップＳ１１からステップＳ２０までの処理と同様である。
【００６２】
また、クライアント３０からマスタＤＢ１０に対してトランザクションＢのコミット指示がなされてから、スレーブＤＢ２０がプリペア状態のトランザクションが存在するか否か判断するまでの処理は、図３に例示するステップＳ２１からステップＳ２３までの処理と同様である。
【００６３】
本動作例ではプリペア状態のトランザクションＡが存在するため（ステップＳ２３におけるＹｅｓ）、トランザクション制御部２１は、トランザクションＡのコミット処理を行う（ステップＳ２４）。
【００６４】
次に、トランザクション制御部２１は、マスタＤＢ１０からのプリペア要求に応じて、自身のＤＢに対してトランザクションＢのプリペア処理を行う（ステップＳ３７）。ここで、プリペア処理が失敗した場合、トランザクション制御部２１は、プリペア処理が失敗したことを示す処理結果をマスタＤＢ１０に送信する（ステップＳ３８）。
【００６５】
トランザクション制御部１１は、トランザクションＢについてのプリペア要求に対する処理結果が全て成功か否か判断する（ステップＳ２７）。本動作例では、処理結果の少なくとも一部が失敗であるため（ステップＳ２７におけるＮｏ）、トランザクション制御部１１は、全てのスレーブＤＢ２０に対してトランザクションＢのロールバック要求を行う（ステップＳ２９）。
【００６６】
スレーブＤＢ２０がロールバック要求を受信すると、トランザクション制御部２１は、トランザクションＢのロールバック処理を行い（ステップＳ３９）、処理結果をマスタＤＢ１０に応答する（ステップＳ４０）。また、トランザクション制御部１１は、自身のＤＢのロールバック処理を行う（ステップＳ３０）。
【００６７】
本動作例のように、スレーブＤＢ２０でトランザクションＢのプリペア処理が失敗したとしても、トランザクションＡのコミット処理は実施される。そのため、本動作例では、結果として、トランザクションＡは全てのＤＢでコミットされ、トランザクションＢは全てのＤＢでロールバックされることになる。したがって、分散データベースシステム全体でデータの整合性を保つことができる。
【００６８】
以下、具体的な動作例を説明する。図５は、分散データベースシステムの具体的な動作例を示す説明図である。図５に示す例は、マスタＤＢおよびスレーブＤＢでプリペア処理が成功した場合の例を示す。図５に例示する動作例は、図２に例示する動作例に対応する。
【００６９】
クライアントからマスタＤＢに対して初回のトランザクションＡのコミット指示がなされると、マスタＤＢは、トランザクションＡのプリペア処理を行い、スレーブＤＢ１およびスレーブＤＢ２にトランザクションＡのプリペア要求を行う。プリペア要求を受信した各スレーブＤＢは、トランザクションＡのプリペア処理を行い、プリペア処理が成功したことを示す処理結果をマスタＤＢに送信する。処理結果が全て成功だった場合、マスタＤＢは、自身のＤＢについてコミット処理を行い、クライアントに処理結果を通知する。
【００７０】
次に、クライアントからマスタＤＢに対してトランザクションＢのコミット指示がなされると、マスタＤＢは、トランザクションＢのプリペア処理を行い、スレーブＤＢ１およびスレーブＤＢ２にトランザクションＢのプリペア要求を行う。プリペア要求を受信した各スレーブＤＢは、まず、プリペア状態にあるトランザクションＡのコミット処理を行う。そして、各スレーブＤＢは、トランザクションＢのプリペア処理を行い、プリペア処理が成功したことを示す処理結果をマスタＤＢに送信する。処理結果が全て成功だった場合、マスタＤＢは、自身のＤＢについてコミット処理を行い、クライアントに処理結果を通知する。
【００７１】
次に、プリペア処理が失敗した時の動作例を説明する。図６は、マスタＤＢのメモリ枯渇等によりプリペア処理が失敗した時の動作例を示す説明図である。クライアントからマスタＤＢに対してトランザクションＮのコミット指示がなされると、マスタＤＢは、トランザクションＮのプリペア処理を行う。ここで、プリペア処理が失敗した場合、マスタＤＢは、トランザクションＮのロールバック処理を行い、クライアントに処理結果を通知する。
【００７２】
次に、プリペア処理が失敗した時の他の動作例を説明する。図７は、プリペア状態のトランザクションが存在しない状態でスレーブＤＢのプリペア処理が失敗したときの動作例を示す説明図である。図７に例示する動作例は、図３に例示する動作例に対応する。
【００７３】
クライアントからマスタＤＢに対して初回のトランザクションＡのコミット指示がなされると、マスタＤＢは、トランザクションＡのプリペア処理を行い、スレーブＤＢ１およびスレーブＤＢ２にトランザクションＡのプリペア要求を行う。プリペア要求を受信した各スレーブＤＢは、トランザクションＡのプリペア処理を行う。
【００７４】
ここで、例えば、スレーブＤＢ２でメモリ枯渇等によりプリペア処理が失敗したとする。この場合、スレーブＤＢ１はプリペア処理が成功したことを示す処理結果をマスタＤＢに送信し、スレーブＤＢ２はプリペア処理が失敗したことを示す処理結果をマスタＤＢに送信する。
【００７５】
この場合、マスタＤＢは、スレーブＤＢ１およびスレーブＤＢ２にトランザクションＡのロールバック要求を行う。各スレーブＤＢは、トランザクションＡのロールバック処理を行い、処理結果をマスタＤＢに送信する。そして、マスタＤＢも、トランザクションＡのロールバック処理を行う。
【００７６】
次に、プリペア処理が失敗した時のさらに他の動作例を説明する。図８は、プリペア状態のトランザクションが存在する状態でスレーブＤＢのプリペア処理が失敗したときの動作例を示す説明図である。ここでは、スレーブＤＢ１およびスレーブＤＢ２は、プリペア状態のトランザクションＡが存在するものとする。なお、図８に例示する動作例は、図４に例示する動作例に対応する。
【００７７】
この状態で、クライアントからマスタＤＢに対してトランザクションＢのコミット指示がなされると、マスタＤＢは、トランザクションＢのプリペア処理を行い、スレーブＤＢ１およびスレーブＤＢ２にトランザクションＢのプリペア要求を行う。プリペア要求を受信した各スレーブＤＢは、まず、プリペア状態にあるトランザクションＡのコミット処理を行う。そして、各スレーブＤＢは、トランザクションＢのプリペア処理を行う。
【００７８】
ここで、例えば、スレーブＤＢ２でメモリ枯渇等によりプリペア処理が失敗したとする。この場合、スレーブＤＢ１はプリペア処理が成功したことを示す処理結果をマスタＤＢに送信し、スレーブＤＢ２はプリペア処理が失敗したことを示す処理結果をマスタＤＢに送信する。
【００７９】
この場合、マスタＤＢは、スレーブＤＢ１およびスレーブＤＢ２にトランザクションＢのロールバック要求を行う。各スレーブＤＢは、トランザクションＢのロールバック処理を行い、処理結果をマスタＤＢに送信する。そして、マスタＤＢも、トランザクションＢのロールバック処理を行う。
【００８０】
このように、いずれの具体例においても、データの整合性を保つことができる。
【００８１】
以上のように、本実施形態では、マスタＤＢ１０のトランザクション制御部１１が、クライアント３０からトランザクションのコミット指示がなされたときに、そのトランザクションのプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢ２０に対してプリペア要求を行う。スレーブＤＢ２０のトランザクション制御部２１は、プリペア要求に応じて、自身のＤＢに対してプリペア処理を行い、そのプリペア処理の処理結果をマスタＤＢ１０に送信する。マスタＤＢ１０のトランザクション制御部１１は、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、その全てのスレーブＤＢに対してトランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについてそのトランザクションのコミット処理を行う。一方、スレーブＤＢ２０のトランザクション制御部２１は、プリペア要求を受信したときにプリペア状態のトランザクションが存在した場合、そのトランザクションのコミット処理を行う。
【００８２】
よって、各データベース間の整合性を保ちつつ、レプリケーションに要する処理時間を短くすることができる。具体的には、スレーブＤＢ２０でプリペア処理が失敗した場合でも、システム全体としてコミットまたはロールバックが行われるため、各データベース間の整合性を維持できる。
【００８３】
実施形態２．
次に、本発明による分散データベースシステムの第２の実施形態を説明する。本実施形態では、スレーブＤＢがマスタＤＢへの変更指示を受けた場合のトランザクションリカバリ機能を説明する。スレーブＤＢがマスタＤＢへの変更指示を受ける場合として、例えば、マスタＤＢに障害が発生した場合が挙げられる。ただし、変更指示が行われるタイミングは、マスタＤＢの障害発生時に限定されず、例えば、マスタＤＢのメンテナンス時などであってもよい。
【００８４】
本実施形態の分散データベースシステムの構成は、第１の実施形態と同様である。マスタＤＢ１０に障害が発生した場合に、スレーブＤＢ２０がマスタＤＢへの変更指示を受けると、変更指示を受けたスレーブＤＢ２０のトランザクション制御部２１は、他のスレーブＤＢのトランザクションの進行状況を確認する。トランザクションの進行状況とは、各トランザクションがコミット処理まで行われているかプリペア状態にあるか等を示すものである。
【００８５】
トランザクションの進行状況の確認方法は任意である。例えば、各スレーブＤＢ２０が進行状況を各ＤＢ共通のカウンタ値で管理している場合、トランザクション制御部２１は、そのカウンタ値を比較して進行状況を確認してもよい。
【００８６】
トランザクション制御部２１は、他のスレーブＤＢのトランザクションの進行状況に基づいて、他のスレーブＤＢ２０に対してトランザクションのロールバック要求またはコミット要求を行う。具体的には、他のスレーブＤＢ２０間のトランザクションの進行状況が異なる場合、変更指示を受けたスレーブＤＢ２０のトランザクション制御部２１は、以下のように動作する。
【００８７】
まず、第一の状況として、いずれかのスレーブＤＢ２０でコミット処理が行われているトランザクションが存在するとする。この場合、トランザクション制御部２１は、他のスレーブＤＢ２０に対してそのトランザクションのコミット要求を行う。また、第二の状況として、コミット処理が行われていないプリペア状態のトランザクションが一部のスレーブＤＢ２０にのみ存在するとする。この場合、トランザクション制御部２１は、そのプリペア状態のトランザクションを有するスレーブＤＢに対して、そのトランザクションのロールバック指示を行う。
【００８８】
このように、マスタＤＢの変更時に、トランザクション制御部２１が他のスレーブＤＢのトランザクションの進行状況に基づいて、他のスレーブＤＢに対してトランザクションのロールバック要求またはコミット要求を行う。そのため、マスタＤＢが変更されるような場合であっても、各データベース間の整合性を保つことが可能になる。
【００８９】
次に、本実施形態の分散データベースシステムの動作を説明する。図９は、本実施形態の分散データベースシステムの動作例を示すシーケンス図である。ここでは、変更指示を受けたスレーブＤＢをスレーブＤＢ２０ａと記し、その他のスレーブＤＢをスレーブＤＢｂと記す。
【００９０】
外部コマンド等によりマスタ化要求が行われると、スレーブＤＢ２０ａのトランザクション制御部２１は、残りのスレーブＤＢ２０ｂに対して、トランザクションの進行状況を問い合わせる（ステップＳ４１）。問い合わせを受けた各スレーブＤＢ２０ｂのトランザクション制御部２１は、トランザクションの進行状況をスレーブＤＢ２０ａに送信する（ステップＳ４２）。
【００９１】
スレーブＤＢ２０ａのトランザクション制御部２１は、各スレーブＤＢ２０ｂのトランザクションの進行状況に応じて、各スレーブＤＢ２０ｂに対してコミット要求またはロールバック要求を行う（ステップＳ４３）。
【００９２】
各スレーブＤＢ２０ｂのトランザクション制御部２１は、スレーブＤＢ２０ａからの要求に応じて、プリペア状態のトランザクションのコミット処理またはロールバック処理を行う（ステップＳ４４）。また、スレーブＤＢ２０ａのトランザクション制御部２１も、同様にコミット処理またはロールバック処理を行う（ステップＳ４５）。そして、スレーブＤＢ２０ａは、マスタＤＢになるための各処理を行う（ステップＳ４６）。
【００９３】
以下、具体的な動作例を説明する。以下の説明では、スレーブＤＢ１がマスタ化するＤＢであり、スレーブＤＢ２がその他のスレーブＤＢであるものとする。
【００９４】
図１０は、トランザクションが存在しない状態で障害が発生した場合の動作例を示す説明図である。トランザクションが存在しない状態でマスタＤＢに障害が発生し、スレーブＤＢ１に対して外部コマンド等によりマスタ化要求が行われたとする。このとき、スレーブＤＢ１は、スレーブＤＢ２にトランザクションの状況を取得するための要求を行い、スレーブＤＢ２は、その要求に対して、トランザクションの状況を返信する。
【００９５】
図１０に示す例では、トランザクションが存在せず、何もする必要がないことが分かるため、スレーブＤＢ１は、自身のマスタ化処理を行う。
【００９６】
図１１は、マスタＤＢがコミット処理を行った直後に障害が発生した場合の動作例を示す説明図である。この場合、全てのスレーブＤＢにはトランザクションＢのプリペア要求が行われた状態であるため、全てのスレーブＤＢで、プリペア状態のトランザクションＡのコミット処理と、新たなプリペア要求に対するプリペア処理が行われている。
【００９７】
この状態で、スレーブＤＢ１に対して外部コマンド等によりマスタ化要求が行われたとする。このとき、スレーブＤＢ１は、スレーブＤＢ２にトランザクションの状況を取得するための要求を行い、スレーブＤＢ２は、その要求に対して、トランザクションの状況を返信する
【００９８】
この場合、スレーブＤＢ間でプリペア状態にあるトランザクションの内容が異なっていないことが分かるため、スレーブＤＢ１は、プリペア状態にあるトランザクションＢのコミット処理を行い、自身のマスタ化処理を行う。このとき、一度データの整合性を確保するため、スレーブＤＢ１は、スレーブＤＢ２に対してコミット要求を行ってもよい。
【００９９】
図１２は、一部のスレーブＤＢに対してプリペア要求が行われている状態で障害が発生した場合の動作例を示す説明図である。本動作例では、マスタＤＢが初回のトランザクションＡのプリペア処理を行うとともに一部のスレーブＤＢに対してのみプリペア要求を行った状態で障害が発生したとする。この場合、プリペア要求が行われたスレーブＤＢ１では、トランザクションＡのプリペア処理が行われ、プリペア要求が行われていないスレーブＤＢ２では、トランザクションＡのプリペア処理は行われていない。
【０１００】
この状態で、スレーブＤＢ１に対して外部コマンド等によりマスタ化要求が行われたとする。このとき、スレーブＤＢ１は、スレーブＤＢ２にトランザクションの状況を取得するための要求を行い、スレーブＤＢ２は、その要求に対して、トランザクションの状況を返信する
【０１０１】
この場合、スレーブＤＢ１は、スレーブＤＢ間でプリペア状態にあるトランザクションの内容が異なっていることが分かる。この状況は、上述する第二の状況に相当する。そのため、スレーブＤＢ１は、プリペア状態にあるトランザクションＡのロールバック処理を行う。そして、スレーブＤＢ１は、自身のマスタ化処理を行う。
【０１０２】
なお、この状態の前提として、クライアントはトランザクションＡのコミット指示を行っている。この障害は、分散データベースシステムのコミット処理実行中に起こった障害であるため、クライアントは、トランザクションＡがコミットされたかロールバックされたか不明である。そこで、分散データベースシステムではロールバック処理を行うことで、データベースの不整合を防止している。
【０１０３】
図１３は、一部のスレーブＤＢに対してプリペア要求が行われている状態で障害が発生した場合の他の動作例を示す説明図である。本動作例では、すでにトランザクションＡのプリペア要求が各スレーブＤＢに対して行われているものとする。また、マスタＤＢがトランザクションＢのプリペア処理を行うとともに一部のスレーブＤＢに対してのみプリペア要求を行った状態で障害が発生したとする。この場合、プリペア要求が行われたスレーブＤＢ１では、トランザクションＡのコミット処理およびトランザクションＢのプリペア処理が行われ、プリペア要求が行われていないスレーブＤＢ２では、トランザクションＡのコミット処理およびトランザクションＢのプリペア処理のいずれも行われていない。
【０１０４】
この状態で、スレーブＤＢ１に対して外部コマンド等によりマスタ化要求が行われたとする。このとき、スレーブＤＢ１は、スレーブＤＢ２にトランザクションの状況を取得するための要求を行い、スレーブＤＢ２は、その要求に対して、トランザクションの状況を返信する
【０１０５】
この場合、スレーブＤＢ１は、スレーブＤＢ間でコミットされたトランザクションおよびプリペア状態にあるトランザクションの内容が異なっていることが分かる。具体的には、スレーブＤＢ１は、一部のスレーブＤＢでトランザクションＡのコミット処理が行われていることがわかる。この状況は、上述する第一の状況に相当する。そこで、スレーブＤＢ１は、スレーブＤＢ２に対してトランザクションＡのコミット要求を行う。
【０１０６】
一方、スレーブＤＢ２はトランザクションＢのプリペア要求が行われていない。そのため、スレーブＤＢ１でのみトランザクションＢのプリペア処理が行われている。この状況は、上述する第二の状況に相当する。そこで、スレーブＤＢ１は、プリペア状態にあるトランザクションＢのロールバック処理を行う。そして、スレーブＤＢ１は、自身のマスタ化処理を行う。
【０１０７】
なお、この状態の前提として、クライアントはトランザクションＡのコミット処理をすでに完了し、トランザクションＢのコミット指示を行っている。この障害は、分散データベースシステムのコミット処理実行中に起こった障害であるため、クライアントは、トランザクションＢがコミットされたかロールバックされたか不明である。一方、クライアントは、トランザクションＡのコミット処理は完了していると判断している。そこで、分散データベースシステムでは、トランザクションＡについてはコミット処理を行い、トランザクションＢについてはロールバック処理を行うことで、データベースの不整合を防止している。
【０１０８】
以上のように、本実施形態では、第１の実施形態の構成に加え、スレーブＤＢ２０のトランザクション制御部２１が、マスタＤＢへの変更指示を受けたときに、他のスレーブＤＢのトランザクションの進行状況に基づいて、他のスレーブＤＢに対してトランザクションのロールバック要求またはコミット要求を行う。よって、第１の実施形態の効果に加え、各データベース間の整合性をより保つことが可能になる。
【０１０９】
次に、本発明の概要を説明する。図１４は、本発明による分散データベースシステムの概要を示すブロック図である。本発明による分散データベースシステムは、複数のスレーブＤＢ９０（例えば、スレーブＤＢ２０）と、更新情報を複数のスレーブＤＢ９０に反映させるマスタＤＢ８０（例えば、マスタＤＢ１０）とを備えている。
【０１１０】
マスタＤＢ８０は、トランザクションのコミット指示がなされたときに、そのトランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢ９０に対して、プリペア処理を指示するプリペア要求を行うプリペア要求手段８１（例えば、トランザクション制御部１１）と、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢ９０から送信される処理結果が全て成功の場合、その全てのスレーブＤＢ９０に対してトランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについてそのトランザクションのコミット処理を行うコミット手段８２（例えば、トランザクション制御部１１）とを含む。
【０１１１】
スレーブＤＢ９０は、マスタＤＢ８０からのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合に、そのトランザクションのコミット処理を行うとともに、自身のＤＢに対してプリペア処理を行い、そのプリペア処理の処理結果をマスタＤＢに送信するプリペア手段９１（例えば、トランザクション制御部２１）を含む。
【０１１２】
そのような構成により、各データベース間の整合性を保ちつつ、レプリケーションに要する処理時間を短くすることができる。
【０１１３】
また、マスタＤＢ８０のコミット手段８２は、同一のトランザクションについてのプリペア要求に対してスレーブＤＢ９０から送信される処理結果の少なくとも一部が失敗である場合、全てのスレーブＤＢ９０に対してトランザクションのロールバック処理を指示するロールバック要求を行うとともに自身のＤＢのロールバック処理を行ってもよい。
【０１１４】
また、スレーブＤＢ９０のプリペア手段９１は、トランザクションのロールバック要求を受信した場合、プリペア状態のトランザクションのロールバック処理を行ってもよい。
【０１１５】
また、スレーブＤＢ９０のプリペア手段９１は、マスタＤＢ８０への変更指示を受けたときに、他のスレーブＤＢ９０のトランザクションの進行状況に基づいて、その他のスレーブＤＢ９０に対してトランザクションのロールバック要求またはコミット要求を行ってもよい。
【０１１６】
また、変更指示を受けたスレーブＤＢ９０（例えば、スレーブＤＢ２０ａ）のプリペア手段９１は、他のスレーブＤＢ間のトランザクションの進行状況が異なる場合、いずれかのスレーブＤＢ９０でコミット処理が行われているトランザクションが存在する場合、他のスレーブＤＢ９０に対してそのトランザクションのコミット要求を行い、コミット処理が行われていないプリペア状態のトランザクションが一部のスレーブＤＢ９０にのみ存在する場合、そのプリペア状態のトランザクションを有するスレーブＤＢ９０に対して、そのトランザクションのロールバック指示を行ってもよい。
【０１１７】
図１５は、本発明によるマスタＤＢの概要を示すブロック図である。本発明によるマスタＤＢは、プリペア要求手段８１と、コミット手段８２とを備えている。なお、マスタＤＢの内容は、図１５に例示するマスタＤＢ８０の内容と同様である。
【０１１８】
上記の実施形態の一部又は全部は、以下の付記のようにも記載されうるが、以下には限られない。
【０１１９】
（付記１）１つのマスタＤＢと複数のスレーブＤＢを含む分散データベースシステムにおいて、前記マスタＤＢで更新した更新情報を前記複数のスレーブＤＢに反映させるレプリケーション方法であって、前記マスタＤＢが、トランザクションのコミット指示がなされたときに、当該トランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行い、前記マスタＤＢが、全てのスレーブＤＢに対して、前記プリペア処理を指示するプリペア要求を行い、前記スレーブＤＢが、前記プリペア要求に応じて、自身のＤＢに対してプリペア処理を行い、当該プリペア処理の処理結果を前記マスタＤＢに送信し、前記マスタＤＢは、同一のトランザクションについてのプリペア要求に対して前記全てのスレーブＤＢから送信される処理結果が全て成功の場合、当該全てのスレーブＤＢに対して前記トランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについて当該トランザクションのコミット処理を行い、前記スレーブＤＢが、前記プリペア要求を受信したときにプリペア状態のトランザクションが存在した場合、当該トランザクションのコミット処理を行うことを特徴とするレプリケーション方法。
【０１２０】
（付記２）マスタＤＢが、同一のトランザクションについてのプリペア要求に対してスレーブＤＢから送信される処理結果の少なくとも一部が失敗である場合、全てのスレーブＤＢに対して前記トランザクションのロールバック処理を指示するロールバック要求を行うとともに自身のＤＢのロールバック処理を行う付記１記載のレプリケーション方法。
【０１２１】
（付記３）スレーブＤＢが、トランザクションのロールバック要求を受信した場合、プリペア状態のトランザクションのロールバック処理を行う付記２記載のレプリケーション方法。
【０１２２】
（付記４）スレーブＤＢが、マスタＤＢへの変更指示を受けたときに、他のスレーブＤＢのトランザクションの進行状況に基づいて、当該他のスレーブＤＢに対してトランザクションのロールバック要求またはコミット要求を行う付記１から付記３のうちのいずれか１項に記載のレプリケーション方法。
【０１２３】
（付記５）変更指示を受けたスレーブＤＢが、他のスレーブＤＢ間のトランザクションの進行状況が異なる場合、いずれかのスレーブＤＢでコミット処理が行われているトランザクションが存在する場合、他のスレーブＤＢに対して当該トランザクションのコミット要求を行い、コミット処理が行われていないプリペア状態のトランザクションが一部のスレーブＤＢにのみ存在する場合、当該プリペア状態のトランザクションを有するスレーブＤＢに対して、当該トランザクションのロールバック指示を行う付記４記載のレプリケーション方法。
【０１２４】
（付記６）更新情報を複数のスレーブＤＢに反映させるマスタＤＢの更新情報反映方法であって、トランザクションのコミット指示がなされたときに、当該トランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、前記プリペア処理を指示するプリペア要求を行い、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、当該全てのスレーブＤＢに対して前記トランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについて当該トランザクションのコミット処理を行い、前記プリペア要求では、プリペア要求を、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合に当該トランザクションのコミット処理を行うとともに自身のＤＢに対してプリペア処理を行い、当該プリペア処理の処理結果をマスタＤＢに送信するスレーブＤＢに対して行うことを特徴とする更新情報反映方法。
【０１２５】
（付記７）同一のトランザクションについてのプリペア要求に対してスレーブＤＢから送信される処理結果の少なくとも一部が失敗である場合、全てのスレーブＤＢに対して前記トランザクションのロールバック処理を指示するロールバック要求を行うとともに自身のＤＢのロールバック処理を行う付記６記載の更新情報反映方法。
【０１２６】
（付記８）更新情報を複数のスレーブＤＢに反映させるマスタＤＢを含むコンピュータに適用されるマスタＤＢプログラムであって、前記コンピュータに、トランザクションのコミット指示がなされたときに、当該トランザクションをコミットまたはロールバックできるプリペア状態にするプリペア処理を自身のＤＢに対して行うとともに、全てのスレーブＤＢに対して、前記プリペア処理を指示するプリペア要求を行うプリペア要求処理、および、同一のトランザクションについてのプリペア要求に対して全てのスレーブＤＢから送信される処理結果が全て成功の場合、当該全てのスレーブＤＢに対して前記トランザクションのコミット処理を指示するコミット要求を行うことなく自身のＤＢについて当該トランザクションのコミット処理を行うコミット処理を実行させ、前記プリペア要求処理で、マスタＤＢからのプリペア要求を受信したときに、プリペア状態のトランザクションが存在した場合に当該トランザクションのコミット処理を行うとともに自身のＤＢに対してプリペア処理を行い、当該プリペア処理の処理結果をマスタＤＢに送信するスレーブＤＢに対して、プリペア要求を行わせるためのマスタＤＢプログラム。
【０１２７】
（付記９）コンピュータに、コミット処理で、同一のトランザクションについてのプリペア要求に対してスレーブＤＢから送信される処理結果の少なくとも一部が失敗である場合、全てのスレーブＤＢに対して前記トランザクションのロールバック処理を指示するロールバック要求を行わせるとともに自身のＤＢのロールバック処理を行わせる付記８記載のマスタＤＢプログラム。
【符号の説明】
【０１２８】
１０  マスタＤＢ
１１，２１  トランザクション制御部
１２，２２  記憶部
２０，２０ａ，２０ｂ  スレーブＤＢ
３０，５０  クライアント
６０，１００  分散データベースシステム
【図１】
2016071526.tif 000003
【図２】
2016071526.tif 000004
【図３】
2016071526.tif 000005
【図４】
2016071526.tif 000006
【図５】
2016071526.tif 000007
【図６】
2016071526.tif 000008
【図７】
2016071526.tif 000009
【図８】
2016071526.tif 000010
【図９】
2016071526.tif 000011
【図１０】
2016071526.tif 000012
【図１１】
2016071526.tif 000013
【図１２】
2016071526.tif 000014
【図１３】
2016071526.tif 000015
【図１４】
2016071526.tif 000016
【図１５】
2016071526.tif 000017
【図１６】
2016071526.tif 000018
【図１７】
2016071526.tif 000019