本発明は、装置自身の故障以外ではコミット処理要求に対して必ずコミット処理を行って応答する複数の処理装置にアプリケーションから受け付けたトランザクションの分散処理を指示する分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置に関し、特に、コミット処理を高速に行うとともに、導入・運用の負担を軽減することができる分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置に関するものである。
従来、一つのトランザクションを処理する場合に複数のデータベースに対してアクセスする必要がある分散トランザクション処理では、複数のデータベース間の整合性を保証するために、2フェーズコミットが用いられてきた。
2フェーズコミットでは、コミット処理を2段階のフェーズにわけ、第1段階でデータベースに対してコミットの準備ができているか否かを確認し(プリペア)、全てのデータベースからコミットの準備ができたことが確認できた場合にのみ第2段階でコミットを実行し、それ以外の場合には第2段階でロールバックを行うことによってデータベース間の整合性を保証している(例えば、非特許文献1参照。)。
しかしながら、2フェーズコミットでは、コミット処理を2段階のフェーズにわけて行うために、処理効率が悪いという問題がある。また、分散トランザクション処理を管理するトランザクションマネージャを実行するコンピュータに障害が発生した場合にトランザクションマネージャが復旧処理で使用するトランザクションログが必要であり、トランザクションログのための導入・運用の負担が大きいという問題もある。
本発明は、上記に鑑みてなされたものであって、コミット処理を高速に行うとともに、導入・運用の負担を軽減することができる分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置を提供することを目的とする。
上述した課題を解決し、目的を達成するため、請求項1の発明に係る分散トランザクション処理プログラムは、装置自身の故障以外ではコミット処理要求に対して必ずコミット処理を行って応答する複数の処理装置にアプリケーションから受け付けたトランザクションの分散処理を指示する分散トランザクション処理プログラムであって、前記アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求するコミット要求手順と、前記コミット要求手順により要求したコミット処理に対していずれかの処理装置から応答があった場合に前記アプリケーションに対してコミットの成功を応答するコミット応答手順と、前記コミット要求手順により要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、該応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて該故障処理装置に対して指示する復旧指示手順と、をコンピュータに実行させることを特徴とする。
この請求項1の発明によれば、アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求し、要求したコミット処理に対していずれかの処理装置から応答があった場合にアプリケーションに対してコミットの成功を応答し、要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて故障処理装置に対して指示するよう構成したので、1フェーズコミットによってデータベース間の整合性を維持することができる。
また、請求項2の発明に係る分散トランザクション処理プログラムは、請求項1の発明において、前記復旧指示手順は、前記故障処理装置が復旧したか否かを判定する復旧判定手順と、前記復旧判定手順により故障処理装置が復旧したと判定された場合に、故障処理装置の未解決トランザクションの処理結果について他の処理装置に問合せを行い、問合せ結果に基づいて未解決トランザクションに対する処理を故障処理装置に要求する処理装置復旧処理手順とを、コンピュータに実行させることを特徴とする。
この請求項2の発明によれば、故障処理装置が復旧したか否かを判定し、故障処理装置が復旧したと判定した場合に、故障処理装置の未解決トランザクションの処理結果について他の処理装置に問合せを行い、問合せ結果に基づいて未解決トランザクションに対する処理を故障処理装置に要求するよう構成したので、処理装置によるトランザクションログの管理だけが必要であり、当該分散トランザクション処理プログラムによるトランザクションログの管理を不要とすることができる。
また、請求項3の発明に係る分散トランザクション処理プログラムは、請求項2の発明において、前記復旧判定手順は、前記故障処理装置に対して定期的に接続を確認することによって該故障処理装置が復旧したか否かを判定することを特徴とする。
この請求項3の発明によれば、故障処理装置に対して定期的に接続を確認することによって故障処理装置が復旧したか否かを判定するよう構成したので、確実に故障処理装置の復旧を検知することができる。
また、請求項4の発明に係る分散トランザクション処理プログラムは、請求項1、2または3の発明において、自装置の故障からの復旧時に処理装置に対して未解決トランザクションを問い合わせる未解決問合せを行い、該未解決問合せに対して処理装置から応答された未解決トランザクションの処理結果について他の処理装置に問い合わせる処理結果問合せを行う未解決トランザクション処理結果問合せ手順と、前記未解決トランザクション処理結果問合せ手順による処理結果問合せに対する応答結果に基づいて該未解決トランザクションに対する処理を未解決問合せに対して未解決トランザクションを応答した処理装置に要求する自装置復旧処理手順とを、さらにコンピュータに実行させることを特徴とする。
この請求項4の発明によれば、自装置の故障からの復旧時に処理装置に対して未解決トランザクションを問い合わせる未解決問合せを行い、未解決問合せに対して処理装置から応答された未解決トランザクションの処理結果について他の処理装置に問い合わせる処理結果問合せを行い、処理結果問合せに対する応答結果に基づいて未解決トランザクションに対する処理を未解決問合せに対して未解決トランザクションを応答した処理装置に要求するよう構成したので、当該分散トランザクション処理プログラムを実行するコンピュータが一部の処理装置に対してコミット処理を要求した後に故障した場合にも、復旧後に残りの処理装置のコミット処理を正しく行うことができる。
また、請求項5の発明に係る分散トランザクション処理プログラムは、請求項1の発明において、前記コミット要求手順は、コミット処理の要求がいずれの処理装置にも受け付けられなかった場合に、前記アプリケーションに対してコミットの失敗を応答することを特徴とする。
この請求項5の発明によれば、コミット処理の要求がいずれの処理装置にも受け付けられなかった場合に、アプリケーションに対してコミットの失敗を応答するよう構成したので、コミット処理を要求した全ての処理装置が故障している場合にもアプリケーションに迅速に応答することができる。
また、請求項6の発明に係る分散トランザクション処理プログラムは、請求項1の発明において、前記コミット応答手順は、前記コミット要求手順により要求したコミット処理に対していずれの処理装置からも応答がなかった場合には、前記アプリケーションにコミット結果を不明と応答することを特徴とする。
この請求項6の発明によれば、要求したコミット処理に対していずれの処理装置からも応答がなかった場合には、アプリケーションにコミット結果を不明と応答するよう構成したので、コミット処理を要求した全ての処理装置が要求受付後に故障した場合にもアプリケーションに確実に応答することができる。
また、請求項7の発明に係る分散トランザクション処理方法は、装置自身の故障以外ではコミット処理要求に対して必ずコミット処理を行って応答する複数の処理装置にアプリケーションから受け付けたトランザクションの分散処理を指示する分散トランザクション処理方法であって、前記アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求するコミット要求工程と、前記コミット要求工程により要求したコミット処理に対していずれかの処理装置から応答があった場合に前記アプリケーションに対してコミットの成功を応答するコミット応答工程と、前記コミット要求工程により要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、該応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて該故障処理装置に対して指示する復旧指示工程と、を含んだことを特徴とする。
この請求項7の発明によれば、アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求し、要求したコミット処理に対していずれかの処理装置から応答があった場合にアプリケーションに対してコミットの成功を応答し、要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて故障処理装置に対して指示するよう構成したので、1フェーズコミットによってデータベース間の整合性を維持することができる。
また、請求項8の発明に係る分散トランザクション処理装置は、装置自身の故障以外ではコミット処理要求に対して必ずコミット処理を行って応答する複数の処理装置にアプリケーションから受け付けたトランザクションの分散処理を指示する分散トランザクション処理装置であって、前記アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求するコミット要求手段と、前記コミット要求手段により要求したコミット処理に対していずれかの処理装置から応答があった場合に前記アプリケーションに対してコミットの成功を応答するコミット応答手段と、前記コミット要求手段により要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、該応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて該故障処理装置に対して指示する復旧指示手段と、を備えたことを特徴とする。
この請求項8の発明によれば、アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求し、要求したコミット処理に対していずれかの処理装置から応答があった場合にアプリケーションに対してコミットの成功を応答し、要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて故障処理装置に対して指示するよう構成したので、1フェーズコミットによってデータベース間の整合性を維持することができる。
また、請求項9の発明に係る分散トランザクション処理装置は、一つのトランザクションを分散処理する複数の処理装置と、アプリケーションからトランザクション処理要求を受け付けて該複数の処理装置に分散処理を要求するトランザクション管理装置とから構成される分散トランザクション処理装置であって、前記トランザクション管理装置は、前記アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求するコミット要求手段と、前記コミット要求手段により要求したコミット処理に対していずれかの処理装置から応答があった場合に前記アプリケーションに対してコミットの成功を応答するコミット応答手段と、前記コミット要求手段により要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、該応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて該故障処理装置に対して指示する復旧指示手段と、を備え、前記処理装置は、装置自身の故障以外では前記トランザクション管理装置からのコミット処理要求に対して必ずコミット処理を行って該トランザクション管理装置に応答することができるコミット処理手段と、故障から復旧した際に、前記トランザクション管理装置からの指示に基づいて前記未解決トランザクションの処理を行う復旧処理手段と、を備えたことを特徴とする。
この請求項9の発明によれば、トランザクション管理装置は、アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求し、要求したコミット処理に対していずれかの処理装置から応答があった場合にアプリケーションに対してコミットの成功を応答し、要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて故障処理装置に対して指示し、処理装置は、装置自身の故障以外ではトランザクション管理装置からのコミット処理要求に対して必ずコミット処理を行ってトランザクション管理装置に応答することができ、故障から復旧した際に、トランザクション管理装置からの指示に基づいて未解決トランザクションの処理を行うよう構成したので、1フェーズコミットによってデータベース間の整合性を維持することができる。
また、請求項10の発明に係る分散トランザクション処理方法は、一つのトランザクションを分散処理する複数の処理装置と、アプリケーションからトランザクション処理要求を受け付けて該複数の処理装置に分散処理を要求するトランザクション管理装置とから構成される分散トランザクション処理装置のコミット処理方法であって、前記トランザクション管理装置が前記アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求するコミット要求工程と、前記処理装置が装置自身の故障以外では前記トランザクション管理装置からのコミット処理要求に対して必ずコミット処理を行って該トランザクション管理装置に応答するコミット処理工程と、前記コミット要求工程により要求したコミット処理に対して、前記トランザクション管理装置が、いずれかの処理装置から応答があった場合に前記アプリケーションに対してコミットの成功を応答するコミット応答工程と、前記コミット要求工程により要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、前記トランザクション管理装置が、該応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて該故障処理装置に対して指示する復旧指示工程と、故障から復旧した際に、前記故障処理装置が、前記トランザクション管理装置からの指示に基づいて前記未解決トランザクションの処理を行う復旧処理工程と、を含んだことを特徴とする。
この請求項10の発明によれば、トランザクション管理装置がアプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求し、処理装置が装置自身の故障以外ではトランザクション管理装置からのコミット処理要求に対して必ずコミット処理を行ってトランザクション管理装置に応答し、要求したコミット処理に対して、トランザクション管理装置が、いずれかの処理装置から応答があった場合にアプリケーションに対してコミットの成功を応答し、要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、トランザクション管理装置が、応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて故障処理装置に対して指示し、故障から復旧した際に、故障処理装置が、トランザクション管理装置からの指示に基づいて未解決トランザクションの処理を行うよう構成したので、1フェーズコミットによってデータベース間の整合性を維持することができる。
請求項1、7、8、9および10の発明によれば、1フェーズコミットによってデータベース間の整合性を維持することができるので、コミット処理を高速に行うことができるという効果を奏する。
また、請求項2の発明によれば、処理装置によるトランザクションログの管理だけが必要であり、当該分散トランザクション処理プログラムによるトランザクションログの管理を不要とするので、導入・運用の負担を軽減することができるという効果を奏する。
また、請求項3の発明によれば、確実に故障処理装置の復旧を検知するので、データベース間の整合性を確実に維持することができるという効果を奏する。
また、請求項4の発明によれば、当該分散トランザクション処理プログラムを実行するコンピュータが一部の処理装置に対してコミット処理を要求した後に故障した場合にも、復旧後に残りの処理装置のコミット処理を正しく行うことができるので、1フェーズコミットによってデータベース間の整合性を維持することができるという効果を奏する。
また、請求項5の発明によれば、コミット処理を要求した全ての処理装置が故障している場合にアプリケーションに迅速に応答するので、コミット処理を高速に行うことができるという効果を奏する。
また、請求項6の発明によれば、コミット処理を要求した全ての処理装置が要求受付後に故障した場合にもアプリケーションに確実に応答することができるので、アプリケーションは適切な復旧動作行うことができるという効果を奏する。
図1は、本実施例に係る分散トランザクション処理システムのシステム構成を示す機能ブロック図である。
図2は、各レコードに対応してRowIDファイルに作成されるエントリのデータ構造の一例を示す図である。
図3は、ログファイルに含まれる未解決トランザクション一覧のデータ構造の一例を示す図である。
図4は、コンダクタによるコミット処理の処理手順を示すフローチャートである。
図5は、図1に示したディレクタ復旧処理部によるディレクタ復旧処理の処理手順を示すフローチャートである。
図6は、図1に示したコンダクタ復旧処理部によるコミット復旧処理の処理手順を示すフローチャートである。
図7は、図1に示したトランザクション結果決定部によるトランザクション結果決定処理の処理手順を示すフローチャートである。
図8は、2台のディレクタが分散トランザクションを処理する場合に、ディレクタがダウンする各タイミングに対応するデータベース整合性維持動作を示す図である。
図9は、本実施例に係るコンダクタプログラムおよびディレクタプログラムを実行するコンピュータを示す図である。
符号の説明
10 データファイル
20 RowIDファイル
30 ログファイル
40 ネットワーク
100 コンダクタ
110 要求処理部
120 応答処理部
130 ディレクタ復旧処理部
140 コンダクタ復旧処理部
150 トランザクション結果決定部
160 通信部
2001〜200n ディレクタ
210 トランザクション処理部
220 未解決トランザクション応答部
230 通信部
300 コンピュータ
310 HDD
311 コンダクタプログラム
312 ディレクタプログラム
320 RAM
330 ROM
340 CPU
341 コンダクタプロセス
342 ディレクタプロセス
350 LANインタフェース
360 I/Oインタフェース
以下に、本発明に係る分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
まず、本実施例に係る分散トランザクション処理システムの構成について説明する。図1は、本実施例に係る分散トランザクション処理システムのシステム構成を示す機能ブロック図である。
同図に示すように、この分散トランザクション処理システムは、アプリケーションからトランザクションを受け付けるコンダクタ100と、コンダクタ100によって受け付けられたトランザクションを分散処理するn台のディレクタ2001〜200nがネットワーク40を介して接続されて構成される。
コンダクタ100は、ネットワーク40を介してアプリケーションから受け付けたトランザクションの分散処理を関係するディレクタに指示し、各ディレクタの処理結果に基づいてトランザクションの処理結果をアプリケーションに応答する装置である。
なお、この分散トランザクション処理システムでは、コンダクタ100は、1フェーズコミットによってコミット処理を行う。また、ディレクタ2001〜200nは、故障によってコミット処理を行えない場合以外は、コミット処理要求を受け付けると必ずコミット処理を行うことができるものとする。
コンダクタ100は、要求処理部110と、応答処理部120と、ディレクタ復旧処理部130と、コンダクタ復旧処理部140と、トランザクション結果決定部150と、通信部160とを有する。
要求処理部110は、アプリケーションからトランザクションを受け付け、受け付けたトランザクションの分散処理を関係するディレクタに指示する処理部である。この要求処理部110は、アプリケーションからコミット要求を受け付けた場合には、関係するディレクタにコミット処理を要求する。
ここで、関係する全てのディレクタがダウンしていて、いずれのディレクタにもコミット処理を依頼することができない場合には、この要求処理部110は、アプリケーションにコミットの失敗を通知する。
応答処理部120は、要求処理部110によりトランザクションの分散処理を指示されたディレクタから分散トランザクション処理結果を受け取り、各ディレクタの分散トランザクション処理結果に基づいてアプリケーションにトランザクション処理結果を通知する処理部である。
この応答処理部120は、要求処理部110によりコミット処理を指示されたディレクタのうちのいずれかのディレクタから応答を受け取ると、コミットが成功したことをアプリケーションに通知する。
また、この応答処理部120は、要求処理部110によりコミット処理を指示されたいずれのディレクタからも所定の時間内に応答がない場合、すなわち、コミット処理を指示された全てのディレクタがコミット処理の指示を受信後にダウンした場合には、アプリケーションにコミット処理の結果が不明であることを通知する。
ディレクタ復旧処理部130は、ディレクタ2001〜200nの中にダウンしたディレクタがある場合に、ダウンしたディレクタが復旧したか否かを監視し、ディレクタが復旧した際に復旧処理を行う処理部である。
具体的には、このディレクタ復旧処理部130は、復旧したディレクタに対してコミット処理が行われていない未解決トランザクションの問合せを行い、未解決トランザクションがある場合には、トランザクション結果決定部150を用いてその未解決トランザクションに対して行うべき処理を決定し、決定した処理を復旧したディレクタに指示する。
このディレクタ復旧処理部130が、復旧したディレクタに対してコミット処理が行われていない未解決トランザクションの問合せを行い、未解決トランザクションがある場合には、トランザクション結果決定部150を用いてその未解決トランザクションに対して行うべき処理を決定し、決定した処理を復旧したディレクタに指示することによって、コミット処理の際にダウンしたディレクタがある場合にもデータベース間の整合性を保証することができる。
すなわち、応答処理部120がいずれかのディレクタから応答があった場合に直ちにアプリケーションに対してコミットの成功を通知し、残りのディレクタにコミット処理要求受信後コンダクタ100への応答前にダウンしたディレクタがある場合にも、そのディレクタが復旧後コミット処理を行うことができ、データベース間の整合性を保証することができる。
コンダクタ復旧処理部140は、コンダクタ100がダウンして復旧した際に、復旧処理を行う処理部である。このコンダクタ復旧処理部140は、復旧処理の一部として、未解決トランザクションの処理を行う。
具体的には、このコンダクタ復旧処理部140は、全てのディレクタ2001〜200nに対して未解決トランザクションの問合せを行い、あるディレクタが未解決トランザクションがあることを応答した場合には、トランザクション結果決定部150を用いてその未解決トランザクションに対して行うべき処理を決定し、決定した処理を未解決トランザクションを応答したディレクタに指示する。
このコンダクタ復旧処理部140が、復旧処理の一部として、全てのディレクタ2001〜200nに対して未解決トランザクションの問合せを行い、あるディレクタが未解決トランザクションがあることを応答した場合には、トランザクション結果決定部150を用いてその未解決トランザクションに対して行うべき処理を決定し、決定した処理を未解決トランザクションを応答したディレクタに指示することによって、ディレクタ2001〜200nの一部にコミット要求を送信してコンダクタ100がダウンした場合にも、データベース間の整合性を保証することができる。
トランザクション結果決定部150は、ディレクタ復旧処理部130およびコンダクタ復旧処理部140の指示にしたがって、未解決トランザクションに対して行うべき処理を決定する処理部である。
具体的には、このトランザクション結果決定部150は、未解決トランザクションに対するコミット結果を他のディレクタに問い合わせ、他のディレクタのコミット結果に基づいて未解決トランザクションに対して行うべき処理を決定する。
すなわち、このトランザクション結果決定部150は、未解決トランザクションに対して他のディレクタがコミット処理を行った場合には、未解決トランザクションに対して行うべき処理をコミット処理に決定し、未解決トランザクションに対して他のディレクタがロールバックを行った場合には、未解決トランザクションに対して行うべき処理をロールバックに決定する。
通信部160は、アプリケーションを実行するコンピュータやディレクタ2001〜200nなどとネットワーク40を介して通信する処理部であり、アプリケーションからのコミット要求やディレクタ2001〜200nからの応答などを受信し、アプリケーションへのコミット結果の応答やディレクタ2001〜200nへのコミット処理要求などを送信する。
ディレクタ2001〜200nは、分散トランザクションを処理するためにアクセスする必要がある複数のデータベースのそれぞれを管理する装置であり、コンダクタ100からトランザクション処理要求を受け付けてトランザクションを分散処理する。なお、ディレクタ2001〜200nはいずれも同様の構成を有するので、ここではディレクタ2001を例にとって説明する。
ディレクタ2001は、トランザクション処理部210と、未解決トランザクション応答部220と、通信部230とを有する。
トランザクション処理部210は、コンダクタ100からトランザクション処理要求を受け付けてトランザクションを分散処理し、レコード形式でデータを格納するデータファイル10を更新する処理部である。
また、このトランザクション処理部210は、データファイル10のレコードの格納位置を記憶するRowIDファイル20およびトランザクションログを記憶するログファイル30を更新する。
図2は、各レコードに対応してRowIDファイル20に作成されるエントリのデータ構造の一例を示す図である。同図に示すように、このエントリには、レコード格納位置とトランザクションIDとが含まれる。
レコード格納位置は、データファイル10のレコードの格納位置を示す。トランザクションIDは、このエントリに対応するレコードの追加・削除・更新を最後に行ったトランザクションを識別する識別子であり、トランザクションの処理が完了するとトランザクション処理部210によって更新される。
図3は、ログファイル30に含まれる未解決トランザクション一覧のデータ構造の一例を示す図である。同図に示すように、この未解決トランザクション一覧には、コミット処理が行われていないm個のトランザクションの識別子であるトランザクションID1〜トランザクションIDmが記憶されている。
未解決トランザクション応答部220は、コンダクタ100からの未解決トランザクションの問合せに対してログファイル30の未解決トランザクション一覧に記憶されたトランザクションIDをコンダクタ100に応答する処理部である。
この未解決トランザクション応答部220が、コンダクタ100からの問合せに対して未解決トランザクションを応答することによって、コンダクタ100は、このディレクタ2001またはコンダクタ100自身の復旧処理において処理が必要な未解決トランザクションを特定することができる。
また、この未解決トランザクション応答部220は、コンダクタ100からの他のディレクタの未解決トランザクションに関するコミット結果の問合せに対して、ログファイル30の未解決トランザクション一覧およびRowIDファイル20を用いてコンダクタ100に応答する。
具体的には、この未解決トランザクション応答部220は、コンダクタ100から未解決トランザクションのトランザクションIDを受け取り、そのトランザクションIDが未解決トランザクション一覧にあればコミット未完了であることを応答し、未解決トランザクション一覧になければRowIDファイル20内にあるか否かを調べ、RowIDファイル20内にある場合には、トランザクションがコミットされているのでコミット完了を応答し、RowIDファイル20内にない場合には、トランザクションがコミットされていないのでコミット未完了を応答する。
この未解決トランザクション応答部220が、コンダクタ100からの他のディレクタの未解決トランザクションに関するコミット結果の問合せに対して、ログファイル30の未解決トランザクション一覧およびRowIDファイル20を用いてコミットが完了したか否かをコンダクタ100に応答することによって、コンダクタ100は、他のディレクタの未解決トランザクションに対する処理を決定することができる。
通信部230は、コンダクタ100などとネットワーク40を介して通信する処理部であり、例えば、コンダクタ100からコミット処理要求や未解決トランザクションの問合せを受信し、コンダクタ100へコミット結果や未解決トランザクションのトランザクションIDを送信する。
次に、コンダクタ100によるコミット処理の処理手順について説明する。図4は、コンダクタ100によるコミット処理の処理手順を示すフローチャートである。同図に示すように、このコンダクタ100は、要求処理部110がアプリケーションからコミット要求を受信し(ステップS101)、関連するディレクタ群にコミット処理要求を送信する(ステップS102)。
そして、いずれかのディレクタにコミット処理要求を送信できたか否かを判定し(ステップS103)、いずれのディレクタにもコミット処理要求を送信できなかった場合には、全ディレクタがダウンしている場合であるので、アプリケーションにコミットの失敗を通知する(ステップS108)。
一方、いずれかのディレクタにコミット処理要求を送信できた場合には、応答処理部120が、いずれかのディレクタから応答があると(ステップS104、肯定)、アプリケーションへコミットの成功を通知し(ステップS105)、いずれのディレクタからも応答がない場合には、タイムアウトであるか否かを判定する(ステップS106)。
その結果、タイムアウトでない場合には、引き続きディレクタからの応答を待ち、タイムアウトの場合には、コミット処理要求を受け付けた全てのディレクタが要求受付後にダウンした場合であり、各ディレクタでコミット処理がどこまで行われたかわからないので、アプリケーションへコミット結果が不明であることを通知する(ステップS107)。
このように、コンダクタ100がディレクタにコミット処理要求を送信し、いずれかのディレクタから応答があると直ちにアプリケーションにコミットの成功を通知するので、アプリケーションからのコミット要求を高速に処理することができる。
次に、図1に示したディレクタ復旧処理部130によるディレクタ復旧処理の処理手順について説明する。図5は、図1に示したディレクタ復旧処理部130によるディレクタ復旧処理の処理手順を示すフローチャートである。
同図に示すように、このディレクタ復旧処理部130は、ダウンしたディレクタがある場合に、ダウンしたディレクタに定期的に接続を試行し(ステップS201)、接続できると、未解決トランザクションの問合せを行う(ステップS202)。
そして、未解決トランザクションがあるか否かを判定し(ステップS203)、未解決トランザクションがある場合には、未解決トランザクションを一つ選択し(ステップS204)、選択した未解決トランザクションに対して行うべき処理を決定するトランザクション結果決定処理を行う(ステップS205)。
そして、未解決トランザクションに対して行うべき処理が決定したか否か、すなわち、コミットまたはロールバックが決定したか否かを判定し(ステップS206)、コミットかロールバックが決定した場合には、復旧したディレクタに対して決定結果に基づいて未解決トランザクションを処理するように指示し(ステップS207)、ステップS203に戻って次の未解決トランザクションの処理に移る。
一方、コミットかロールバックかが不明な場合には、復旧したディレクタにその未解決トランザクションについては指示することなく、ステップS203に戻って次の未解決トランザクションの処理に移る。
このように、このディレクタ復旧処理部130が、復旧したディレクタの未解決トランザクションの処理をトランザクション結果決定処理によって決定し、決定した処理を復旧したディレクタに指示することによって、コミット処理前にダウンしたディレクタのコミット処理を復旧後に正しく行うことができる。
次に、図1に示したコンダクタ復旧処理部140によるコミット復旧処理の処理手順について説明する。図6は、図1に示したコンダクタ復旧処理部140によるコミット復旧処理の処理手順を示すフローチャートである。
同図に示すように、このコンダクタ復旧処理部140は、ダウンから復旧後にディレクタを一つ選択し(ステップS301)、未解決トランザクションの問合せを行う(ステップS302)。
そして、未解決トランザクションがあるか否かを判定し(ステップS303)、未解決トランザクションがない場合には、全ディレクタを処理したか否かを判定し(ステップS304)、全ディレクタを処理していない場合には、ステップS301に戻って次のディレクタの処理に移り、全ディレクタを処理した場合には、処理を終了する。
一方、未解決トランザクションがある場合には、未解決トランザクションを一つ選択し(ステップS305)、選択した未解決トランザクションに対して行うべき処理を決定するトランザクション結果決定処理を行う(ステップS306)。
そして、未解決トランザクションに対して行うべき処理が決定したか否か、すなわち、コミットまたはロールバックが決定したか否かを判定し(ステップS307)、コミットかロールバックが決定した場合には、選択しているディレクタに対して決定結果に基づいて未解決トランザクションを処理するように指示し(ステップS308)、ステップS303に戻って次の未解決トランザクションの処理に移る。
一方、コミットかロールバックかが不明な場合には、選択しているディレクタにその未解決トランザクションについては指示することなく、ステップS303に戻って次の未解決トランザクションの処理に移る。
このように、このコンダクタ復旧処理部140がディレクタに未解決トランザクションの問合せを行い、未解決トランザクションに対して行うべき処理をトランザクション結果決定処理によって決定し、決定した処理をディレクタに指示することによって、コミット要求を一部のディレクタに送信した後にコンダクタ100がダウンした場合にも、復旧後に残りのディレクタのコミット処理を正しく行うことができる。
次に、図1に示したトランザクション結果決定部150によるトランザクション結果決定処理の処理手順について説明する。図7は、図1に示したトランザクション結果決定部150によるトランザクション結果決定処理の処理手順を示すフローチャートである。なお、このトランザクション結果決定処理は、図5のステップS205の処理および図6のステップS306の処理に対応する。
図7に示すように、このトランザクション結果決定部150は、未解決トランザクションの状態が未完了であるか否かを判定し(ステップS401)、未解決トランザクションの状態が未完了である場合には、結果を未確定として処理を終了する(ステップS412)。
一方、未解決トランザクションの状態が未完了でない場合には、ダウンディレクタの数を数えるための変数としてダウンディレクタ数を「0」に初期化し(ステップS402)、ディレクタを一つ選択する(ステップS403)。
そして、選択したディレクタに対して未解決トランザクションの処理結果の問合せを行い(ステップS404)、ディレクタがダウンしているか否かを判定する(ステップS405)。
その結果、ディレクタがダウンしていない場合には、未解決トランザクションの処理結果の問合せに対する応答がコミットであるか否かを判定し(ステップS406)、コミットである場合には、結果をコミットとして処理を終了する(ステップS407)。
一方、未解決トランザクションの処理結果の問合せに対する応答がコミットでない場合には、未解決トランザクションの処理結果は不明であり、他のディレクタに問い合わせる必要があるので、ステップS409に進んで全ディレクタに対して問い合わせたか否かを判定する。
また、ディレクタがダウンしている場合には、ダウンディレクタ数に「1」を加え(ステップS408)、全ディレクタに対して問い合わせたか否かを判定する(ステップS409)。
その結果、全ディレクタに対して問い合わせていない場合には、ステップS403に戻って次のディレクタを選択し、全ディレクタに対して問い合わせた場合には、ダウンディレクタ数が「0」であるか否かを判定する(ステップS410)。
そして、ダウンディレクタ数が「0」である場合には、全てのディレクタがコミットを行っていないので、結果をロールバックとして処理を終了し(ステップS411)、ダウンディレクタ数が「0」でない場合には、ダウンしているディレクタによる未解決トランザクションの処理結果が不明であるので、結果を未確定として処理を終了する(ステップS412)。
このように、このトランザクション結果決定部150が、未解決トランザクションのコミット結果をディレクタに順に問い合わせ、コミットしたディレクタがある場合には、未解決トランザクションの結果をコミットと決定し、全ディレクタがコミットしなかった場合には、未解決トランザクションの結果をロールバックと決定することによって、コンダクタ100によるトランザクション処理結果のログ記録をなくすことができる。
次に、2台のディレクタが分散トランザクションを処理する場合に、ディレクタがダウンする各タイミングに対応するデータベース整合性維持動作について説明する。図8は、2台のディレクタが分散トランザクションを処理する場合に、ディレクタがダウンする各タイミングに対応するデータベース整合性維持動作を示す図である。
同図に示すように、2台のディレクタD1およびD2がいずれもダウンしない場合には、コミット要求に対するアプリケーションへの応答はコミット成功となり、トランザクションの結果はコミットとなる。また、データベース間の整合性を維持するための動作は何も必要ない。
また、ディレクタD1がダウンせずディレクタD2がダウンした場合には、ディレクタD2がダウンしたタイミングに関係なく、コミット要求に対するアプリケーションへの応答はコミット成功となり、トランザクションの結果はコミットとなる。
ただし、D2がコミット指示を受け付ける前またはコミット処理中にダウンした場合には、D2は再起動後、コンダクタ100を通じてD1でのコミット完了を知り、コミットする。また、D2がコミット応答前にダウンした場合には、データベース間の整合性を維持するための動作は何も必要ない。
また、ディレクタD1がコミット指示を受け付ける前にダウンし、ディレクタD2もコミット指示を受け付ける前にダウンした場合には、コミット要求に対するアプリケーションへの応答はコミット失敗となり、トランザクションの結果はロールバックとなり、D1およびD2は再起動後、コンダクタ100を通じてコミットが完了したディレクタがなかったことを知り、ロールバックする。
また、ディレクタD1がコミット指示を受け付ける前にダウンし、ディレクタD2がコミット処理中にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はロールバックとなり、D1およびD2は再起動後、コンダクタ100を通じてコミットが完了したディレクタがなかったことを知り、ロールバックする。
また、ディレクタD1がコミット指示を受け付ける前にダウンし、ディレクタD2がコミット応答前にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はコミットとなり、D1は再起動後、コンダクタ100を通じてD2でのコミット完了を知り、コミットする。
また、ディレクタD1がコミット処理中にダウンし、ディレクタD2もコミット処理中にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はロールバックとなり、D1およびD2は再起動後、コンダクタ100を通じてコミットが完了したディレクタがなかったことを知り、ロールバックする。
また、ディレクタD1がコミット処理中にダウンし、ディレクタD2がコミット応答前にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はコミットとなり、D1は再起動後、コンダクタ100を通じてD2でのコミット完了を知り、コミットする。
また、ディレクタD1がコミット応答前にダウンし、ディレクタD2もコミット応答前にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はコミットとなり、データベース間の整合性を維持するための動作は何も必要ない。
上述してきたように、本実施例では、アプリケーションからのコミット要求に対して関連するディレクタに要求処理部110がコミット処理要求を送信し、応答処理部120がいずれかのディレクタから応答を受け取った場合にアプリケーションにコミットの成功を通知し、ディレクタがダウンして未解決トランザクションがある場合には、ディレクタが復旧した際に、ディレクタ復旧処理部130が他のディレクタによる未解決トランザクションの処理結果に基づいて未解決トランザクションの処理を復旧したディレクタに指示することとしたので、1フェーズコミットによってデータベース間の整合性を維持し、もってコミット処理を高速化することができる。
また、ディレクタにコミット処理要求を送信中にコンダクタ100がダウンして一部のディレクタにコミット処理要求が送信できなかった場合には、コンダクタ復旧処理部140が復旧後に各ディレクタに対して未解決トランザクションの問合せを行い、ディレクタが応答した未解決トランザクションに対する他のディレクタの処理結果に基づいて未解決トランザクションの処理を、応答したディレクタに指示することとしたので、1フェーズコミットによってデータベース間の整合性を維持し、もってコミット処理を高速化することができる。
また、本実施例では、コンダクタ100は、ダウンから復旧した際にディレクタに未解決トランザクションを問合せることによって復旧処理を行うこととしたので、トランザクションログを保有する必要がなく、システムの導入・運用の負担を軽減することができる。
なお、本実施例では、コンダクタおよびディレクタについて説明したが、コンダクタやディレクタが有する構成をソフトウェアによって実現することで、同様の機能を有するコンダクタプログラムやディレクタプログラムを得ることができる。そこで、これらのコンダクタプログラムやディレクタプログラムを実行するコンピュータについて説明する。
図9は、本実施例に係るコンダクタプログラムおよびディレクタプログラムを実行するコンピュータを示す図である。なお、ここでは、コンダクタプログラムとディレクタプログラムを一つのコンピュータで実行する場合について説明するが、コンダクタプログラムとディレクタプログラムを別のコンピュータで実行することもできる。また、アプリケーションとコンダクタプログラムを一つのコンピュータで実行することもできる。
同図に示すように、このコンピュータ300は、HDD310と、RAM320と、ROM330と、CPU340と、LANインタフェース350と、I/Oインタフェース360とを有する。
HDD310は、コンダクタプログラム311およびディレクタプログラム312を記憶する記憶装置であり、ディレクタプログラム312が使用するデータファイル10、RowIDファイル20およびログファイル30も記憶する。
RAM320は、HDD310から読み出されたコンダクタプログラム311およびディレクタプログラム312やプログラムの実行途中結果などを記憶するメモリであり、ROM330は、定数などを記憶した読み出し専用メモリである。
CPU340は、RAM320からコンダクタプログラム311およびディレクタプログラム312を読み出し、コンダクタプロセス341およびディレクタプロセス342として実行する処理装置である。
LANインタフェース350は、LAN(ネットワーク)と接続するためのインタフェースであり、I/Oインタフェース360は、キーボードやマウスなどの入力装置および表示装置を接続するインタフェースである。
そして、このコンピュータ300において実行されるコンダクタプログラム311およびディレクタプログラム312は、フロッピィディスク(FD)、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの可搬型記憶媒体に記憶され、これらの記憶媒体から読み出されてコンピュータ300にインストールされる。
あるいは、コンダクタプログラム311およびディレクタプログラム312は、LANインタフェース350を介して接続された他のコンピュータのデータベースなどに記憶され、データベースなどから読み出されてコンピュータ300にインストールされる。そして、インストールされたコンダクタプログラム311およびディレクタプログラム312は、HDD310に記憶される。
以上のように、本発明に係る分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置は、分散トランザクションシステムに有用であり、特に、コミット処理を高速化したい場合に適している。
本発明は、装置自身の故障以外ではコミット処理要求に対して必ずコミット処理を行って応答する複数の処理装置にアプリケーションから受け付けたトランザクションの分散処理を指示する分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置に関し、特に、コミット処理を高速に行うとともに、導入・運用の負担を軽減することができる分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置に関するものである。
従来、一つのトランザクションを処理する場合に複数のデータベースに対してアクセスする必要がある分散トランザクション処理では、複数のデータベース間の整合性を保証するために、2フェーズコミットが用いられてきた。
2フェーズコミットでは、コミット処理を2段階のフェーズにわけ、第1段階でデータベースに対してコミットの準備ができているか否かを確認し(プリペア)、全てのデータベースからコミットの準備ができたことが確認できた場合にのみ第2段階でコミットを実行し、それ以外の場合には第2段階でロールバックを行うことによってデータベース間の整合性を保証している(例えば、非特許文献1参照。)。
しかしながら、2フェーズコミットでは、コミット処理を2段階のフェーズにわけて行うために、処理効率が悪いという問題がある。また、分散トランザクション処理を管理するトランザクションマネージャを実行するコンピュータに障害が発生した場合にトランザクションマネージャが復旧処理で使用するトランザクションログが必要であり、トランザクションログのための導入・運用の負担が大きいという問題もある。
本発明は、上記に鑑みてなされたものであって、コミット処理を高速に行うとともに、導入・運用の負担を軽減することができる分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置を提供することを目的とする。
上述した課題を解決し、目的を達成するため、請求項1の発明に係る分散トランザクション処理プログラムは、装置自身の故障以外ではコミット処理要求に対して必ずコミット処理を行って応答する複数の処理装置にアプリケーションから受け付けたトランザクションの分散処理を指示する分散トランザクション処理プログラムであって、前記アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求するコミット要求手順と、前記コミット要求手順により要求したコミット処理に対していずれかの処理装置から応答があった場合に前記アプリケーションに対してコミットの成功を応答するコミット応答手順と、前記コミット要求手順により要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、該応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて該故障処理装置に対して指示する復旧指示手順と、をコンピュータに実行させることを特徴とする。
この請求項1の発明によれば、アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求し、要求したコミット処理に対していずれかの処理装置から応答があった場合にアプリケーションに対してコミットの成功を応答し、要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて故障処理装置に対して指示するよう構成したので、1フェーズコミットによってデータベース間の整合性を維持することができる。
また、請求項2の発明に係る分散トランザクション処理プログラムは、請求項1の発明において、前記復旧指示手順は、前記故障処理装置が復旧したか否かを判定する復旧判定手順と、前記復旧判定手順により故障処理装置が復旧したと判定された場合に、故障処理装置の未解決トランザクションの処理結果について他の処理装置に問合せを行い、問合せ結果に基づいて未解決トランザクションに対する処理を故障処理装置に要求する処理装置復旧処理手順とを、コンピュータに実行させることを特徴とする。
この請求項2の発明によれば、故障処理装置が復旧したか否かを判定し、故障処理装置が復旧したと判定した場合に、故障処理装置の未解決トランザクションの処理結果について他の処理装置に問合せを行い、問合せ結果に基づいて未解決トランザクションに対する処理を故障処理装置に要求するよう構成したので、処理装置によるトランザクションログの管理だけが必要であり、当該分散トランザクション処理プログラムによるトランザクションログの管理を不要とすることができる。
また、請求項3の発明に係る分散トランザクション処理プログラムは、請求項1または2の発明において、自装置の故障からの復旧時に処理装置に対して未解決トランザクションを問い合わせる未解決問合せを行い、該未解決問合せに対して処理装置から応答された未解決トランザクションの処理結果について他の処理装置に問い合わせる処理結果問合せを行う未解決トランザクション処理結果問合せ手順と、前記未解決トランザクション処理結果問合せ手順による処理結果問合せに対する応答結果に基づいて該未解決トランザクションに対する処理を未解決問合せに対して未解決トランザクションを応答した処理装置に要求する自装置復旧処理手順とを、さらにコンピュータに実行させることを特徴とする。
この請求項3の発明によれば、自装置の故障からの復旧時に処理装置に対して未解決トランザクションを問い合わせる未解決問合せを行い、未解決問合せに対して処理装置から応答された未解決トランザクションの処理結果について他の処理装置に問い合わせる処理結果問合せを行い、処理結果問合せに対する応答結果に基づいて未解決トランザクションに対する処理を未解決問合せに対して未解決トランザクションを応答した処理装置に要求するよう構成したので、当該分散トランザクション処理プログラムを実行するコンピュータが一部の処理装置に対してコミット処理を要求した後に故障した場合にも、復旧後に残りの処理装置のコミット処理を正しく行うことができる。
また、請求項4の発明に係る分散トランザクション処理方法は、装置自身の故障以外ではコミット処理要求に対して必ずコミット処理を行って応答する複数の処理装置にアプリケーションから受け付けたトランザクションの分散処理を指示する分散トランザクション処理方法であって、前記アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求するコミット要求工程と、前記コミット要求工程により要求したコミット処理に対していずれかの処理装置から応答があった場合に前記アプリケーションに対してコミットの成功を応答するコミット応答工程と、前記コミット要求工程により要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、該応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて該故障処理装置に対して指示する復旧指示工程と、を含んだことを特徴とする。
この請求項4の発明によれば、アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求し、要求したコミット処理に対していずれかの処理装置から応答があった場合にアプリケーションに対してコミットの成功を応答し、要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて故障処理装置に対して指示するよう構成したので、1フェーズコミットによってデータベース間の整合性を維持することができる。
また、請求項5の発明に係る分散トランザクション処理装置は、装置自身の故障以外ではコミット処理要求に対して必ずコミット処理を行って応答する複数の処理装置にアプリケーションから受け付けたトランザクションの分散処理を指示する分散トランザクション処理装置であって、前記アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求するコミット要求手段と、前記コミット要求手段により要求したコミット処理に対していずれかの処理装置から応答があった場合に前記アプリケーションに対してコミットの成功を応答するコミット応答手段と、前記コミット要求手段により要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、該応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて該故障処理装置に対して指示する復旧指示手段と、を備えたことを特徴とする。
この請求項5の発明によれば、アプリケーションからのコミット要求に対して複数の処理装置にコミット処理を要求し、要求したコミット処理に対していずれかの処理装置から応答があった場合にアプリケーションに対してコミットの成功を応答し、要求したコミット処理に対して故障に起因して応答を行うことができなかった処理装置である故障処理装置が故障から復旧した際に、応答が行われなかったトランザクションである未解決トランザクションの処理について他の処理装置の処理結果に基づいて故障処理装置に対して指示するよう構成したので、1フェーズコミットによってデータベース間の整合性を維持することができる。
請求項1、4および5の発明によれば、1フェーズコミットによってデータベース間の整合性を維持することができるので、コミット処理を高速に行うことができるという効果を奏する。
また、請求項2の発明によれば、処理装置によるトランザクションログの管理だけが必要であり、当該分散トランザクション処理プログラムによるトランザクションログの管理を不要とするので、導入・運用の負担を軽減することができるという効果を奏する。
また、請求項3の発明によれば、当該分散トランザクション処理プログラムを実行するコンピュータが一部の処理装置に対してコミット処理を要求した後に故障した場合にも、復旧後に残りの処理装置のコミット処理を正しく行うことができるので、1フェーズコミットによってデータベース間の整合性を維持することができるという効果を奏する。
以下に、本発明に係る分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
まず、本実施例に係る分散トランザクション処理システムの構成について説明する。図1は、本実施例に係る分散トランザクション処理システムのシステム構成を示す機能ブロック図である。
同図に示すように、この分散トランザクション処理システムは、アプリケーションからトランザクションを受け付けるコンダクタ100と、コンダクタ100によって受け付けられたトランザクションを分散処理するn台のディレクタ2001〜200nがネットワーク40を介して接続されて構成される。
コンダクタ100は、ネットワーク40を介してアプリケーションから受け付けたトランザクションの分散処理を関係するディレクタに指示し、各ディレクタの処理結果に基づいてトランザクションの処理結果をアプリケーションに応答する装置である。
なお、この分散トランザクション処理システムでは、コンダクタ100は、1フェーズコミットによってコミット処理を行う。また、ディレクタ2001〜200nは、故障によってコミット処理を行えない場合以外は、コミット処理要求を受け付けると必ずコミット処理を行うことができるものとする。
コンダクタ100は、要求処理部110と、応答処理部120と、ディレクタ復旧処理部130と、コンダクタ復旧処理部140と、トランザクション結果決定部150と、通信部160とを有する。
要求処理部110は、アプリケーションからトランザクションを受け付け、受け付けたトランザクションの分散処理を関係するディレクタに指示する処理部である。この要求処理部110は、アプリケーションからコミット要求を受け付けた場合には、関係するディレクタにコミット処理を要求する。
ここで、関係する全てのディレクタがダウンしていて、いずれのディレクタにもコミット処理を依頼することができない場合には、この要求処理部110は、アプリケーションにコミットの失敗を通知する。
応答処理部120は、要求処理部110によりトランザクションの分散処理を指示されたディレクタから分散トランザクション処理結果を受け取り、各ディレクタの分散トランザクション処理結果に基づいてアプリケーションにトランザクション処理結果を通知する処理部である。
この応答処理部120は、要求処理部110によりコミット処理を指示されたディレクタのうちのいずれかのディレクタから応答を受け取ると、コミットが成功したことをアプリケーションに通知する。
また、この応答処理部120は、要求処理部110によりコミット処理を指示されたいずれのディレクタからも所定の時間内に応答がない場合、すなわち、コミット処理を指示された全てのディレクタがコミット処理の指示を受信後にダウンした場合には、アプリケーションにコミット処理の結果が不明であることを通知する。
ディレクタ復旧処理部130は、ディレクタ2001〜200nの中にダウンしたディレクタがある場合に、ダウンしたディレクタが復旧したか否かを監視し、ディレクタが復旧した際に復旧処理を行う処理部である。
具体的には、このディレクタ復旧処理部130は、復旧したディレクタに対してコミット処理が行われていない未解決トランザクションの問合せを行い、未解決トランザクションがある場合には、トランザクション結果決定部150を用いてその未解決トランザクションに対して行うべき処理を決定し、決定した処理を復旧したディレクタに指示する。
このディレクタ復旧処理部130が、復旧したディレクタに対してコミット処理が行われていない未解決トランザクションの問合せを行い、未解決トランザクションがある場合には、トランザクション結果決定部150を用いてその未解決トランザクションに対して行うべき処理を決定し、決定した処理を復旧したディレクタに指示することによって、コミット処理の際にダウンしたディレクタがある場合にもデータベース間の整合性を保証することができる。
すなわち、応答処理部120がいずれかのディレクタから応答があった場合に直ちにアプリケーションに対してコミットの成功を通知し、残りのディレクタにコミット処理要求受信後コンダクタ100への応答前にダウンしたディレクタがある場合にも、そのディレクタが復旧後コミット処理を行うことができ、データベース間の整合性を保証することができる。
コンダクタ復旧処理部140は、コンダクタ100がダウンして復旧した際に、復旧処理を行う処理部である。このコンダクタ復旧処理部140は、復旧処理の一部として、未解決トランザクションの処理を行う。
具体的には、このコンダクタ復旧処理部140は、全てのディレクタ2001〜200nに対して未解決トランザクションの問合せを行い、あるディレクタが未解決トランザクションがあることを応答した場合には、トランザクション結果決定部150を用いてその未解決トランザクションに対して行うべき処理を決定し、決定した処理を未解決トランザクションを応答したディレクタに指示する。
このコンダクタ復旧処理部140が、復旧処理の一部として、全てのディレクタ2001〜200nに対して未解決トランザクションの問合せを行い、あるディレクタが未解決トランザクションがあることを応答した場合には、トランザクション結果決定部150を用いてその未解決トランザクションに対して行うべき処理を決定し、決定した処理を未解決トランザクションを応答したディレクタに指示することによって、ディレクタ2001〜200nの一部にコミット要求を送信してコンダクタ100がダウンした場合にも、データベース間の整合性を保証することができる。
トランザクション結果決定部150は、ディレクタ復旧処理部130およびコンダクタ復旧処理部140の指示にしたがって、未解決トランザクションに対して行うべき処理を決定する処理部である。
具体的には、このトランザクション結果決定部150は、未解決トランザクションに対するコミット結果を他のディレクタに問い合わせ、他のディレクタのコミット結果に基づいて未解決トランザクションに対して行うべき処理を決定する。
すなわち、このトランザクション結果決定部150は、未解決トランザクションに対して他のディレクタがコミット処理を行った場合には、未解決トランザクションに対して行うべき処理をコミット処理に決定し、未解決トランザクションに対して他のディレクタがロールバックを行った場合には、未解決トランザクションに対して行うべき処理をロールバックに決定する。
通信部160は、アプリケーションを実行するコンピュータやディレクタ2001〜200nなどとネットワーク40を介して通信する処理部であり、アプリケーションからのコミット要求やディレクタ2001〜200nからの応答などを受信し、アプリケーションへのコミット結果の応答やディレクタ2001〜200nへのコミット処理要求などを送信する。
ディレクタ2001〜200nは、分散トランザクションを処理するためにアクセスする必要がある複数のデータベースのそれぞれを管理する装置であり、コンダクタ100からトランザクション処理要求を受け付けてトランザクションを分散処理する。なお、ディレクタ2001〜200nはいずれも同様の構成を有するので、ここではディレクタ2001を例にとって説明する。
ディレクタ2001は、トランザクション処理部210と、未解決トランザクション応答部220と、通信部230とを有する。
トランザクション処理部210は、コンダクタ100からトランザクション処理要求を受け付けてトランザクションを分散処理し、レコード形式でデータを格納するデータファイル10を更新する処理部である。
また、このトランザクション処理部210は、データファイル10のレコードの格納位置を記憶するRowIDファイル20およびトランザクションログを記憶するログファイル30を更新する。
図2は、各レコードに対応してRowIDファイル20に作成されるエントリのデータ構造の一例を示す図である。同図に示すように、このエントリには、レコード格納位置とトランザクションIDとが含まれる。
レコード格納位置は、データファイル10のレコードの格納位置を示す。トランザクションIDは、このエントリに対応するレコードの追加・削除・更新を最後に行ったトランザクションを識別する識別子であり、トランザクションの処理が完了するとトランザクション処理部210によって更新される。
図3は、ログファイル30に含まれる未解決トランザクション一覧のデータ構造の一例を示す図である。同図に示すように、この未解決トランザクション一覧には、コミット処理が行われていないm個のトランザクションの識別子であるトランザクションID1〜トランザクションIDmが記憶されている。
未解決トランザクション応答部220は、コンダクタ100からの未解決トランザクションの問合せに対してログファイル30の未解決トランザクション一覧に記憶されたトランザクションIDをコンダクタ100に応答する処理部である。
この未解決トランザクション応答部220が、コンダクタ100からの問合せに対して未解決トランザクションを応答することによって、コンダクタ100は、このディレクタ2001またはコンダクタ100自身の復旧処理において処理が必要な未解決トランザクションを特定することができる。
また、この未解決トランザクション応答部220は、コンダクタ100からの他のディレクタの未解決トランザクションに関するコミット結果の問合せに対して、ログファイル30の未解決トランザクション一覧およびRowIDファイル20を用いてコンダクタ100に応答する。
具体的には、この未解決トランザクション応答部220は、コンダクタ100から未解決トランザクションのトランザクションIDを受け取り、そのトランザクションIDが未解決トランザクション一覧にあればコミット未完了であることを応答し、未解決トランザクション一覧になければRowIDファイル20内にあるか否かを調べ、RowIDファイル20内にある場合には、トランザクションがコミットされているのでコミット完了を応答し、RowIDファイル20内にない場合には、トランザクションがコミットされていないのでコミット未完了を応答する。
この未解決トランザクション応答部220が、コンダクタ100からの他のディレクタの未解決トランザクションに関するコミット結果の問合せに対して、ログファイル30の未解決トランザクション一覧およびRowIDファイル20を用いてコミットが完了したか否かをコンダクタ100に応答することによって、コンダクタ100は、他のディレクタの未解決トランザクションに対する処理を決定することができる。
通信部230は、コンダクタ100などとネットワーク40を介して通信する処理部であり、例えば、コンダクタ100からコミット処理要求や未解決トランザクションの問合せを受信し、コンダクタ100へコミット結果や未解決トランザクションのトランザクションIDを送信する。
次に、コンダクタ100によるコミット処理の処理手順について説明する。図4は、コンダクタ100によるコミット処理の処理手順を示すフローチャートである。同図に示すように、このコンダクタ100は、要求処理部110がアプリケーションからコミット要求を受信し(ステップS101)、関連するディレクタ群にコミット処理要求を送信する(ステップS102)。
そして、いずれかのディレクタにコミット処理要求を送信できたか否かを判定し(ステップS103)、いずれのディレクタにもコミット処理要求を送信できなかった場合には、全ディレクタがダウンしている場合であるので、アプリケーションにコミットの失敗を通知する(ステップS108)。
一方、いずれかのディレクタにコミット処理要求を送信できた場合には、応答処理部120が、いずれかのディレクタから応答があると(ステップS104、肯定)、アプリケーションへコミットの成功を通知し(ステップS105)、いずれのディレクタからも応答がない場合には、タイムアウトであるか否かを判定する(ステップS106)。
その結果、タイムアウトでない場合には、引き続きディレクタからの応答を待ち、タイムアウトの場合には、コミット処理要求を受け付けた全てのディレクタが要求受付後にダウンした場合であり、各ディレクタでコミット処理がどこまで行われたかわからないので、アプリケーションへコミット結果が不明であることを通知する(ステップS107)。
このように、コンダクタ100がディレクタにコミット処理要求を送信し、いずれかのディレクタから応答があると直ちにアプリケーションにコミットの成功を通知するので、アプリケーションからのコミット要求を高速に処理することができる。
次に、図1に示したディレクタ復旧処理部130によるディレクタ復旧処理の処理手順について説明する。図5は、図1に示したディレクタ復旧処理部130によるディレクタ復旧処理の処理手順を示すフローチャートである。
同図に示すように、このディレクタ復旧処理部130は、ダウンしたディレクタがある場合に、ダウンしたディレクタに定期的に接続を試行し(ステップS201)、接続できると、未解決トランザクションの問合せを行う(ステップS202)。
そして、未解決トランザクションがあるか否かを判定し(ステップS203)、未解決トランザクションがある場合には、未解決トランザクションを一つ選択し(ステップS204)、選択した未解決トランザクションに対して行うべき処理を決定するトランザクション結果決定処理を行う(ステップS205)。
そして、未解決トランザクションに対して行うべき処理が決定したか否か、すなわち、コミットまたはロールバックが決定したか否かを判定し(ステップS206)、コミットかロールバックが決定した場合には、復旧したディレクタに対して決定結果に基づいて未解決トランザクションを処理するように指示し(ステップS207)、ステップS203に戻って次の未解決トランザクションの処理に移る。
一方、コミットかロールバックかが不明な場合には、復旧したディレクタにその未解決トランザクションについては指示することなく、ステップS203に戻って次の未解決トランザクションの処理に移る。
このように、このディレクタ復旧処理部130が、復旧したディレクタの未解決トランザクションの処理をトランザクション結果決定処理によって決定し、決定した処理を復旧したディレクタに指示することによって、コミット処理前にダウンしたディレクタのコミット処理を復旧後に正しく行うことができる。
次に、図1に示したコンダクタ復旧処理部140によるコミット復旧処理の処理手順について説明する。図6は、図1に示したコンダクタ復旧処理部140によるコミット復旧処理の処理手順を示すフローチャートである。
同図に示すように、このコンダクタ復旧処理部140は、ダウンから復旧後にディレクタを一つ選択し(ステップS301)、未解決トランザクションの問合せを行う(ステップS302)。
そして、未解決トランザクションがあるか否かを判定し(ステップS303)、未解決トランザクションがない場合には、全ディレクタを処理したか否かを判定し(ステップS304)、全ディレクタを処理していない場合には、ステップS301に戻って次のディレクタの処理に移り、全ディレクタを処理した場合には、処理を終了する。
一方、未解決トランザクションがある場合には、未解決トランザクションを一つ選択し(ステップS305)、選択した未解決トランザクションに対して行うべき処理を決定するトランザクション結果決定処理を行う(ステップS306)。
そして、未解決トランザクションに対して行うべき処理が決定したか否か、すなわち、コミットまたはロールバックが決定したか否かを判定し(ステップS307)、コミットかロールバックが決定した場合には、選択しているディレクタに対して決定結果に基づいて未解決トランザクションを処理するように指示し(ステップS308)、ステップS303に戻って次の未解決トランザクションの処理に移る。
一方、コミットかロールバックかが不明な場合には、選択しているディレクタにその未解決トランザクションについては指示することなく、ステップS303に戻って次の未解決トランザクションの処理に移る。
このように、このコンダクタ復旧処理部140がディレクタに未解決トランザクションの問合せを行い、未解決トランザクションに対して行うべき処理をトランザクション結果決定処理によって決定し、決定した処理をディレクタに指示することによって、コミット要求を一部のディレクタに送信した後にコンダクタ100がダウンした場合にも、復旧後に残りのディレクタのコミット処理を正しく行うことができる。
次に、図1に示したトランザクション結果決定部150によるトランザクション結果決定処理の処理手順について説明する。図7は、図1に示したトランザクション結果決定部150によるトランザクション結果決定処理の処理手順を示すフローチャートである。なお、このトランザクション結果決定処理は、図5のステップS205の処理および図6のステップS306の処理に対応する。
図7に示すように、このトランザクション結果決定部150は、未解決トランザクションの状態が未完了であるか否かを判定し(ステップS401)、未解決トランザクションの状態が未完了である場合には、結果を未確定として処理を終了する(ステップS412)。
一方、未解決トランザクションの状態が未完了でない場合には、ダウンディレクタの数を数えるための変数としてダウンディレクタ数を「0」に初期化し(ステップS402)、ディレクタを一つ選択する(ステップS403)。
そして、選択したディレクタに対して未解決トランザクションの処理結果の問合せを行い(ステップS404)、ディレクタがダウンしているか否かを判定する(ステップS405)。
その結果、ディレクタがダウンしていない場合には、未解決トランザクションの処理結果の問合せに対する応答がコミットであるか否かを判定し(ステップS406)、コミットである場合には、結果をコミットとして処理を終了する(ステップS407)。
一方、未解決トランザクションの処理結果の問合せに対する応答がコミットでない場合には、未解決トランザクションの処理結果は不明であり、他のディレクタに問い合わせる必要があるので、ステップS409に進んで全ディレクタに対して問い合わせたか否かを判定する。
また、ディレクタがダウンしている場合には、ダウンディレクタ数に「1」を加え(ステップS408)、全ディレクタに対して問い合わせたか否かを判定する(ステップS409)。
その結果、全ディレクタに対して問い合わせていない場合には、ステップS403に戻って次のディレクタを選択し、全ディレクタに対して問い合わせた場合には、ダウンディレクタ数が「0」であるか否かを判定する(ステップS410)。
そして、ダウンディレクタ数が「0」である場合には、全てのディレクタがコミットを行っていないので、結果をロールバックとして処理を終了し(ステップS411)、ダウンディレクタ数が「0」でない場合には、ダウンしているディレクタによる未解決トランザクションの処理結果が不明であるので、結果を未確定として処理を終了する(ステップS412)。
このように、このトランザクション結果決定部150が、未解決トランザクションのコミット結果をディレクタに順に問い合わせ、コミットしたディレクタがある場合には、未解決トランザクションの結果をコミットと決定し、全ディレクタがコミットしなかった場合には、未解決トランザクションの結果をロールバックと決定することによって、コンダクタ100によるトランザクション処理結果のログ記録をなくすことができる。
次に、2台のディレクタが分散トランザクションを処理する場合に、ディレクタがダウンする各タイミングに対応するデータベース整合性維持動作について説明する。図8は、2台のディレクタが分散トランザクションを処理する場合に、ディレクタがダウンする各タイミングに対応するデータベース整合性維持動作を示す図である。
同図に示すように、2台のディレクタD1およびD2がいずれもダウンしない場合には、コミット要求に対するアプリケーションへの応答はコミット成功となり、トランザクションの結果はコミットとなる。また、データベース間の整合性を維持するための動作は何も必要ない。
また、ディレクタD1がダウンせずディレクタD2がダウンした場合には、ディレクタD2がダウンしたタイミングに関係なく、コミット要求に対するアプリケーションへの応答はコミット成功となり、トランザクションの結果はコミットとなる。
ただし、D2がコミット指示を受け付ける前またはコミット処理中にダウンした場合には、D2は再起動後、コンダクタ100を通じてD1でのコミット完了を知り、コミットする。また、D2がコミット応答前にダウンした場合には、データベース間の整合性を維持するための動作は何も必要ない。
また、ディレクタD1がコミット指示を受け付ける前にダウンし、ディレクタD2もコミット指示を受け付ける前にダウンした場合には、コミット要求に対するアプリケーションへの応答はコミット失敗となり、トランザクションの結果はロールバックとなり、D1およびD2は再起動後、コンダクタ100を通じてコミットが完了したディレクタがなかったことを知り、ロールバックする。
また、ディレクタD1がコミット指示を受け付ける前にダウンし、ディレクタD2がコミット処理中にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はロールバックとなり、D1およびD2は再起動後、コンダクタ100を通じてコミットが完了したディレクタがなかったことを知り、ロールバックする。
また、ディレクタD1がコミット指示を受け付ける前にダウンし、ディレクタD2がコミット応答前にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はコミットとなり、D1は再起動後、コンダクタ100を通じてD2でのコミット完了を知り、コミットする。
また、ディレクタD1がコミット処理中にダウンし、ディレクタD2もコミット処理中にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はロールバックとなり、D1およびD2は再起動後、コンダクタ100を通じてコミットが完了したディレクタがなかったことを知り、ロールバックする。
また、ディレクタD1がコミット処理中にダウンし、ディレクタD2がコミット応答前にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はコミットとなり、D1は再起動後、コンダクタ100を通じてD2でのコミット完了を知り、コミットする。
また、ディレクタD1がコミット応答前にダウンし、ディレクタD2もコミット応答前にダウンした場合には、コミット要求に対するアプリケーションへの応答は不明となり、トランザクションの結果はコミットとなり、データベース間の整合性を維持するための動作は何も必要ない。
上述してきたように、本実施例では、アプリケーションからのコミット要求に対して関連するディレクタに要求処理部110がコミット処理要求を送信し、応答処理部120がいずれかのディレクタから応答を受け取った場合にアプリケーションにコミットの成功を通知し、ディレクタがダウンして未解決トランザクションがある場合には、ディレクタが復旧した際に、ディレクタ復旧処理部130が他のディレクタによる未解決トランザクションの処理結果に基づいて未解決トランザクションの処理を復旧したディレクタに指示することとしたので、1フェーズコミットによってデータベース間の整合性を維持し、もってコミット処理を高速化することができる。
また、ディレクタにコミット処理要求を送信中にコンダクタ100がダウンして一部のディレクタにコミット処理要求が送信できなかった場合には、コンダクタ復旧処理部140が復旧後に各ディレクタに対して未解決トランザクションの問合せを行い、ディレクタが応答した未解決トランザクションに対する他のディレクタの処理結果に基づいて未解決トランザクションの処理を、応答したディレクタに指示することとしたので、1フェーズコミットによってデータベース間の整合性を維持し、もってコミット処理を高速化することができる。
また、本実施例では、コンダクタ100は、ダウンから復旧した際にディレクタに未解決トランザクションを問合せることによって復旧処理を行うこととしたので、トランザクションログを保有する必要がなく、システムの導入・運用の負担を軽減することができる。
なお、本実施例では、コンダクタおよびディレクタについて説明したが、コンダクタやディレクタが有する構成をソフトウェアによって実現することで、同様の機能を有するコンダクタプログラムやディレクタプログラムを得ることができる。そこで、これらのコンダクタプログラムやディレクタプログラムを実行するコンピュータについて説明する。
図9は、本実施例に係るコンダクタプログラムおよびディレクタプログラムを実行するコンピュータを示す図である。なお、ここでは、コンダクタプログラムとディレクタプログラムを一つのコンピュータで実行する場合について説明するが、コンダクタプログラムとディレクタプログラムを別のコンピュータで実行することもできる。また、アプリケーションとコンダクタプログラムを一つのコンピュータで実行することもできる。
同図に示すように、このコンピュータ300は、HDD310と、RAM320と、ROM330と、CPU340と、LANインタフェース350と、I/Oインタフェース360とを有する。
HDD310は、コンダクタプログラム311およびディレクタプログラム312を記憶する記憶装置であり、ディレクタプログラム312が使用するデータファイル10、RowIDファイル20およびログファイル30も記憶する。
RAM320は、HDD310から読み出されたコンダクタプログラム311およびディレクタプログラム312やプログラムの実行途中結果などを記憶するメモリであり、ROM330は、定数などを記憶した読み出し専用メモリである。
CPU340は、RAM320からコンダクタプログラム311およびディレクタプログラム312を読み出し、コンダクタプロセス341およびディレクタプロセス342として実行する処理装置である。
LANインタフェース350は、LAN(ネットワーク)と接続するためのインタフェースであり、I/Oインタフェース360は、キーボードやマウスなどの入力装置および表示装置を接続するインタフェースである。
そして、このコンピュータ300において実行されるコンダクタプログラム311およびディレクタプログラム312は、フロッピィディスク(FD)、CD−ROM、DVDディスク、光磁気ディスク、ICカードなどの可搬型記憶媒体に記憶され、これらの記憶媒体から読み出されてコンピュータ300にインストールされる。
あるいは、コンダクタプログラム311およびディレクタプログラム312は、LANインタフェース350を介して接続された他のコンピュータのデータベースなどに記憶され、データベースなどから読み出されてコンピュータ300にインストールされる。そして、インストールされたコンダクタプログラム311およびディレクタプログラム312は、HDD310に記憶される。
以上のように、本発明に係る分散トランザクション処理プログラム、分散トランザクション処理方法および分散トランザクション処理装置は、分散トランザクションシステムに有用であり、特に、コミット処理を高速化したい場合に適している。
図1は、本実施例に係る分散トランザクション処理システムのシステム構成を示す機能ブロック図である。
図2は、各レコードに対応してRowIDファイルに作成されるエントリのデータ構造の一例を示す図である。
図3は、ログファイルに含まれる未解決トランザクション一覧のデータ構造の一例を示す図である。
図4は、コンダクタによるコミット処理の処理手順を示すフローチャートである。
図5は、図1に示したディレクタ復旧処理部によるディレクタ復旧処理の処理手順を示すフローチャートである。
図6は、図1に示したコンダクタ復旧処理部によるコミット復旧処理の処理手順を示すフローチャートである。
図7は、図1に示したトランザクション結果決定部によるトランザクション結果決定処理の処理手順を示すフローチャートである。
図8は、2台のディレクタが分散トランザクションを処理する場合に、ディレクタがダウンする各タイミングに対応するデータベース整合性維持動作を示す図である。
図9は、本実施例に係るコンダクタプログラムおよびディレクタプログラムを実行するコンピュータを示す図である。
符号の説明
10 データファイル
20 RowIDファイル
30 ログファイル
40 ネットワーク
100 コンダクタ
110 要求処理部
120 応答処理部
130 ディレクタ復旧処理部
140 コンダクタ復旧処理部
150 トランザクション結果決定部
160 通信部
2001〜200n ディレクタ
210 トランザクション処理部
220 未解決トランザクション応答部
230 通信部
300 コンピュータ
310 HDD
311 コンダクタプログラム
312 ディレクタプログラム
320 RAM
330 ROM
340 CPU
341 コンダクタプロセス
342 ディレクタプロセス
350 LANインタフェース
360 I/Oインタフェース