(57)【要約】【課題】ミラーリングによるトランザクション性能の悪化を防ぐこと。【解決手段】仮トランＩＤ生成部６７が仮トランＩＤを生成し、要求送信部６８が仮トランＩＤを付加して第１要求電文を現用サーバと待機サーバに送信する。第１要求電文を現用サーバが受信すると、トランＩＤ生成部５５ｃがトランＩＤを生成し、データＩＤ生成部５５ｄがデータＩＤを生成する。そして、トラン処理部５５ｂがトランＩＤとデータＩＤを付加した応答電文をクライアント＃１に返信する。そして、要求送信部６８は、トランＩＤとデータＩＤを付加して第２要求電文を現用サーバと待機サーバに送信する。第１要求電文と第２要求電文を受信したデータ管理部５５ｆが、仮トランＩＤとトランＩＤとデータＩＤを対応付けたトラン情報を管理する。そして、クライアント＃１からコミット要求を受信すると、データ管理部５５ｆはトラン情報に基づいてコミット処理を行う。【選択図】図１１
2018014049.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションが動作する第１情報処理装置と、前記アプリケーションが使用するデータを記憶して前記第１情報処理装置から該データに対するトランザクションを受け付ける第２情報処理装置と、前記第２情報処理装置が現用装置として動作するときに待機装置として動作する第３情報処理装置とを有する情報処理システムにおいて、
前記第１情報処理装置は、
前記トランザクションを識別する仮の識別子として仮トランザクション識別子を生成する生成部と、
前記生成部により生成された仮トランザクション識別子を付加して前記トランザクションに関する第１要求を前記第２情報処理装置及び前記第３情報処理装置に送信する送信部とを有し、
前記第２情報処理装置は、
前記第１要求を受け取ると前記トランザクションを識別するトランザクション識別子を決定する第１決定部と、
前記第１要求により処理が行われるデータを識別するデータ識別子を決定する第２決定部と、
前記第１要求に対する応答に前記トランザクション識別子及び前記データ識別子を付加して前記第１情報処理装置に送信する処理部とを有し、
前記送信部は、前記応答を受信した場合には、該応答に付加された前記トランザクション識別子及び前記データ識別子を付加して前記トランザクションに関する第２要求を前記第２情報処理装置及び前記第３情報処理装置に送信し、
前記第３情報処理装置は、
前記第１要求に含まれる前記仮トランザクション識別子と前記第２要求に含まれる前記トランザクション識別子及び前記データ識別子を対応付けたトラン情報を管理し、前記第１情報処理装置から前記トランザクションに関するコミット要求を受け取ると、前記トランザクションについて前記トラン情報に基づいてコミット処理を行う管理部を有する
ことを特徴とする情報処理システム。
【請求項２】
前記第１情報処理装置は、
前記仮トランザクション識別子と前記トランザクション識別子と前記データ識別子を対応付けて記憶する第１トラン情報記憶部をさらに有し、
前記送信部は、前記第１トラン情報記憶部を用いて前記第２要求を作成して送信し、
前記第２情報処理装置は、
前記仮トランザクション識別子と前記トランザクション識別子と前記データ識別子を対応付けて記憶する第２トラン情報記憶部と、
前記第１情報処理装置から前記トランザクションに関するコミット要求を受け取ると、前記第２トラン情報記憶部を用いてコミット処理を行う処理部とをさらに有し、
前記第３情報処理装置は、
前記仮トランザクション識別子と前記トランザクション識別子と前記データ識別子を対応付けて記憶する第３トラン情報記憶部をさらに有し、
前記管理部は、前記第３トラン情報記憶部を用いて前記コミット処理を行う
ことを特徴とする請求項１に記載の情報処理システム。
【請求項３】
前記送信部は、前記第２要求に対する応答を前記第２情報処理装置から受け取る一方で前記第３情報処理装置から受け取ることなく前記コミット要求を行う場合には、ミラーリングを行うように前記第２情報処理装置及び前記第３情報処理装置に指示し、
前記処理部は、前記コミット処理を行った後で前記第３情報処理装置にミラーリングを行うためのミラーリング用情報を送信し、
前記管理部は、前記ミラーリング用情報を受け取って前記コミット処理を行う
ことを特徴とする請求項１又は２に記載の情報処理システム。
【請求項４】
前記処理部は、前記コミット処理の後で前記第１情報処理装置から新たなトランザクションに関する要求を受け取ると前記第２トラン情報記憶部が前記コミット処理を行ったトランザクションに関して記憶する情報を消去し、前記コミット処理後に前記第１情報処理装置とは異なる第４情報処理装置からデータ識別子が前記第１情報処理装置のトランザクションと同じである新たなトランザクションに関する要求を受け取ると前記第２トラン情報記憶部がデータ識別子が同じであるトランザクションに関して記憶する前記仮トランザクション識別子を付加して応答を前記第４情報処理装置に送信し、
前記管理部は、前記コミット処理の後で前記第１情報処理装置から新たなトランザクションに関する要求を受け取ると前記第３トラン情報記憶部が前記コミット処理を行ったトランザクションに関して記憶する情報を消去し、前記コミット処理の前に前記第４情報処理装置からデータ識別子が前記第１情報処理装置のトランザクションと同じであると推定される新たなトランザクションに関する要求を受け取ると前記第３トラン情報記憶部がデータ識別子が同じであるトランザクションに関して記憶する前記仮トランザクション識別子を付加して応答を前記第４情報処理装置に送信し、
前記第４情報処理装置は、前記処理部から送信された応答に含まれる仮トランザクション識別子と前記管理部から送信された応答に含まれる仮トランザクション識別子が同一である場合には、前記第２情報処理装置と前記第３情報処理装置にロールバックを依頼する
ことを特徴とする請求項２に記載の情報処理システム。
【請求項５】
アプリケーションが使用するデータを記憶して該データに対するトランザクションを受け付ける第１の他の情報処理装置と、前記第１の他の情報処理装置が現用装置として動作するときに待機装置として動作する第２の他の情報処理装置とともに情報処理システムを構築する情報処理装置において、
前記トランザクションを識別する仮の識別子として仮トランザクション識別子を生成する生成部と、
前記生成部により生成された仮トランザクション識別子を付加して前記トランザクションに関する第１要求を前記第１の他の情報処理装置及び前記第２の他の情報処理装置に送信し、前記第１要求に対する応答を前記第１の他の情報処理装置から受信すると、該応答から前記トランザクションを識別するトランザクション識別子及び前記データを識別するデータ識別子を取り出して前記トランザクションに関する第２要求に付加し、該第２要求を前記第１の他の情報処理装置及び前記第２の他の情報処理装置に送信する送信部と
を有することを特徴とする情報処理装置。
【請求項６】
アプリケーションが動作する第１情報処理装置と、前記アプリケーションが使用するデータを記憶して前記第１情報処理装置から該データに対するトランザクションを受け付ける第２情報処理装置と、前記第２情報処理装置が現用装置として動作するときに待機装置として動作する第３情報処理装置とを有する情報処理システムによる情報処理方法において、
前記第１情報処理装置が、
前記トランザクションを識別する仮の識別子として仮トランザクション識別子を生成し、
生成した仮トランザクション識別子を付加して前記トランザクションに関する第１要求を前記第２情報処理装置及び前記第３情報処理装置に送信し、
前記第２情報処理装置が、
前記第１要求を受け取ると前記トランザクションを識別するトランザクション識別子を決定し、
前記第１要求により処理が行われるデータを識別するデータ識別子を決定し、
前記第１要求に対する応答に前記トランザクション識別子及び前記データ識別子を付加して前記第１情報処理装置に送信し、
前記第１情報処理装置が、
前記応答を受信した場合には、該応答に付加された前記トランザクション識別子及び前記データ識別子を付加して前記トランザクションに関する第２要求を前記第２情報処理装置及び前記第３情報処理装置に送信し、
前記第３情報処理装置が、
前記第１要求に含まれる前記仮トランザクション識別子と前記第２要求に含まれる前記トランザクション識別子及び前記データ識別子を対応付けたトラン情報を管理し、前記第１情報処理装置から前記トランザクションに関するコミット要求を受け取ると、前記トランザクションについて前記トラン情報に基づいてコミット処理を行う
ことを特徴とする情報処理方法。
【請求項７】
アプリケーションが使用するデータを記憶して該データに対するトランザクションを受け付ける第１の他の情報処理装置と、前記第１の他の情報処理装置が現用装置として動作するときに待機装置として動作する第２の他の情報処理装置とともに情報処理システムを構築する情報処理装置で実行されるプログラムにおいて、
前記トランザクションを識別する仮の識別子として仮トランザクション識別子を生成し、
生成した仮トランザクション識別子を付加して前記トランザクションに関する第１要求を前記第１の他の情報処理装置及び前記第２の他の情報処理装置に送信し、前記第１要求に対する応答を前記第１の他の情報処理装置から受信すると、該応答から前記トランザクションを識別するトランザクション識別子及び前記データを識別するデータ識別子を取り出して前記トランザクションに関する第２要求に付加し、該第２要求を前記第１の他の情報処理装置及び前記第２の他の情報処理装置に送信する
処理を前記情報処理装置に実行させることを特徴とするプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システム、情報処理装置、情報処理方法及びプログラムに関する。
【背景技術】
【０００２】
銀行のオンラインシステムや電子商取引等の障害や中断が許されない業務では、複数のハードウェア機器にデータを冗長化することで、１台のハードウェア機器が故障してもデータロストを発生させず、業務処理の継続を可能としている。ただし、データを冗長化した場合、複数のハードウェア機器間でデータの整合性を確保する必要があり、現用装置から待機装置にデータのミラーリングを行う必要がある。
【０００３】
図３９は、従来のミラーリングを説明するための図である。図３９において、サーバ＃９０１は、現用サーバとして動作し、クライアント＃９で動作するアプリケーションが使用するデータを記憶する。サーバ＃９０２は、現用サーバに障害が発生した場合に現用サーバの機能を代替する待機サーバとして動作する。
【０００４】
サーバ＃９０１において、１つのトランザクションで一連のデータ操作が行われると、サーバ＃９０１は、トランザクションに対するコミット処理が終了した時点で、一連のデータ操作に関する情報をミラーリングのためにサーバ＃９０２に送信する。ここで、データ操作とは、データの追加、削除又は更新である。このように、ミラーリングを行うことで、サーバ＃９０１とサーバ＃９０２との間でデータの整合性が確保される。
【０００５】
なお、関連する技術として、正ＤＢサーバが、アプリケーションサーバからの操作命令を実行し、確定命令が送信されると実行結果を自装置に反映させ、副ＤＢサーバに自装置の実行結果を送信することで、操作命令を１フェーズで確定する技術がある。また、マスタとレプリカのデータベースサーバの交代を要求する交代パケットの送信、交代処理同期のパケットの送信にデータベースサーバ群をマルチキャストグループとするマルチキャスト通信を用いることで、高速に交代処理を行う技術がある。
【先行技術文献】
【特許文献】
【０００６】
【特許文献１】特開２０１２−１５５４９９号公報
【特許文献２】特開２００３−１８６７２２号公報
【発明の概要】
【発明が解決しようとする課題】
【０００７】
図３９に示したミラーリングには、ミラーリングに時間を要するため、トランザクション性能が悪化するという問題がある。例えば、サーバ＃９０１で処理した追加データが１００件あり、１件のデータが１ＭＢｙｔｅ（メガバイト）であるとすると、ミラーリングで１００ＭＢｙｔｅの通信が発生し、トランザクション性能が悪化する。
【０００８】
特に、クラウドコンピューティングにおいては、物理的なサーバラック、ネットワーク、電源設備等が分離されているアベイラビリティゾーン間でのデータの冗長化が必要であり、アベイラビリティゾーン間でのルータを経由する通信に時間がかかる。
【０００９】
本発明は、１つの側面では、ミラーリングによるトランザクション性能の悪化を防ぐことすることを目的とする。
【課題を解決するための手段】
【００１０】
１つの態様では、情報処理システムは、アプリケーションが動作する第１情報処理装置と、アプリケーションが使用するデータを記憶して第１情報処理装置から該データに対するトランザクションを受け付ける第２情報処理装置とを有する。また、情報処理システムは、第２情報処理装置が現用装置として動作するときに待機装置として動作する第３情報処理装置とを有する。そして、第１情報処理装置は、トランザクションを識別する仮の識別子として仮トランザクション識別子を生成する生成部を有する。また、第１情報処理装置は、生成部により生成された仮トランザクション識別子を付加してトランザクションに関する第１要求を第２情報処理装置及び第３情報処理装置に送信する送信部を有する。また、第２情報処理装置は、第１要求を受け取るとトランザクションを識別するトランザクション識別子を決定する第１決定部と、第１要求により処理が行われるデータを識別するデータ識別子を決定する第２決定部とを有する。また、第２情報処理装置は、第１要求に対する応答にトランザクション識別子及びデータ識別子を付加して第１情報処理装置に送信する処理部を有する。そして、送信部は、応答を受信した場合には、該応答に付加されたトランザクション識別子及びデータ識別子を付加してトランザクションに関する第２要求を第２情報処理装置及び第３情報処理装置に送信する。また、第３情報処理装置は、第１要求に含まれる仮トランザクション識別子と第２要求に含まれるトランザクション識別子及びデータ識別子を対応付けたトラン情報を管理する管理部を有する。そして、管理部は、第１情報処理装置からトランザクションに関するコミット要求を受け取ると、トランザクションについてトラン情報に基づいてコミット処理を行う。
【発明の効果】
【００１１】
１つの側面では、ミラーリングによるトランザクション性能の悪化を防ぐことができる。
【図面の簡単な説明】
【００１２】
【図１Ａ】図１Ａは、実施例に係る情報処理システムの処理の流れを示す第１の図である。
【図１Ｂ】図１Ｂは、実施例に係る情報処理システムの処理の流れを示す第２の図である。
【図１Ｃ】図１Ｃは、実施例に係る情報処理システムの処理の流れを示す第３の図である。
【図２】図２は、仮トランＩＤの構造の一例を示す図である。
【図３】図３は、クライアント装置及び待機サーバがトランＩＤ及びデータＩＤを取得するタイミングを示す図である。
【図４】図４は、現用サーバで操作電文のロストが発生した時の処理の流れを示す図である。
【図５Ａ】図５Ａは、待機サーバで操作電文のロストが発生した時の処理の流れを示す第１の図である。
【図５Ｂ】図５Ｂは、待機サーバで操作電文のロストが発生した時の処理の流れを示す第２の図である。
【図６】図６は、待機サーバでコミット電文のロストが発生した時の処理の流れを示す図である。
【図７Ａ】図７Ａは、通信遅延により電文追越しが発生した時の処理の流れを示す第１の図である。
【図７Ｂ】図７Ｂは、通信遅延により電文追越しが発生した時の処理の流れを示す第２の図である。
【図７Ｃ】図７Ｃは、通信遅延により電文追越しが発生した時の処理の流れを示す第３の図である。
【図８】図８は、実施例に係る情報処理システムの構成を示す図である。
【図９】図９は、サーバ装置のハードウェア構成の一例を示す図である。
【図１０】図１０は、クライアント装置のハードウェア構成の一例を示す図である。
【図１１】図１１は、サーバ装置及びクライアント装置の機能構成を示す図である。
【図１２】図１２は、データ記憶部の一例を示す図である。
【図１３】図１３は、トラン情報記憶部の一例を示す図である。
【図１４Ａ】図１４Ａは、待機応答記憶部の一例（待機サーバが１台の場合）を示す図である。
【図１４Ｂ】図１４Ｂは、待機応答記憶部の一例（待機サーバが２台の場合）を示す図である。
【図１５】図１５は、データＩＤ記憶部の一例を示す図である。
【図１６】図１６は、仮トランＩＤの例を示す図である。
【図１７】図１７は、要求電文（データ操作）の例を示す図である。
【図１８】図１８は、応答電文（データ操作）の例を示す図である。
【図１９】図１９は、要求電文（コミット）の例を示す図である。
【図２０】図２０は、応答電文（コミット）の例を示す図である。
【図２１Ａ】図２１Ａは、全体フローを示す第１の図である。
【図２１Ｂ】図２１Ｂは、全体フローを示す第２の図である。
【図２２】図２２は、クライアント＃１による初回のデータ操作処理（フェーズ＃１）のフローを示すフローチャートである。
【図２３】図２３は、現用サーバによる初回のデータ操作処理（フェーズ＃１）のフローを示すフローチャートである。
【図２４】図２４は、待機サーバによる初回のデータ操作処理（フェーズ＃１）のフローを示すフローチャートである。
【図２５】図２５は、クライアント＃１による２回目以降のデータ操作処理（フェーズ＃２）のフローを示すフローチャートである。
【図２６】図２６は、現用サーバによる２回目以降のデータ操作処理（フェーズ＃２）のフローを示すフローチャートである。
【図２７】図２７は、待機サーバによる２回目以降のデータ操作処理（フェーズ＃２）のフローを示すフローチャートである。
【図２８】図２８は、クライアント＃１によるコミット処理（フェーズ＃３）のフローを示すフローチャートである。
【図２９】図２９は、現用サーバによるコミット処理（フェーズ＃３）のフローを示すフローチャートである。
【図３０】図３０は、待機サーバによるコミット処理（フェーズ＃３）のフローを示すフローチャートである。
【図３１】図３１は、データ操作依頼に対して現用サーバから応答がない場合のフローを示す図である。
【図３２】図３２は、データ操作依頼に対して待機サーバから応答がない場合のフローを示す図である。
【図３３】図３３は、コミット依頼に対して現用サーバから応答がない場合のフローを示す図である。
【図３４】図３４は、コミット依頼に対して待機サーバから応答がない場合のフローを示す図である。
【図３５】図３５は、コミット操作依頼に対して待機サーバからの応答がなく、リトライ中に他アプリで同一データを操作した場合のフローを示す図である。
【図３６】図３６は、クライアント＃２が先行トランをチェックする処理のフローを示すフローチャートである。
【図３７】図３７は、現用サーバがクライアント＃２からのデータ操作依頼を受けて先行トランをチェックする処理のフローを示すフローチャートである。
【図３８】図３８は、待機サーバがクライアント＃２からのデータ操作依頼を受けて先行トランをチェックする処理のフローを示すフローチャートである。
【図３９】図３９は、従来のミラーリングを説明するための図である。
【発明を実施するための形態】
【００１３】
以下に、本願の開示する情報処理システム、情報処理装置、情報処理方法及びプログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００１４】
まず、実施例に係る情報処理システムの処理の流れについて説明する。図１Ａ〜図１Ｃは、実施例に係る情報処理システムの処理の流れを示す第１の図〜第３の図である。図１Ａは、データを追加する場合を示し、図１Ｂはデータを更新する場合を示し、図１Ｃはコミットする場合を示す。図１Ａにおいて、サーバ＃１０１及びサーバ＃２０１は、クライアント＃１で動作するアプリケーションが使用するデータを記憶し、クライアント＃１からのトランザクション要求を受信してトランザクション処理を行うサーバ装置２である。サーバ＃１０１は現用サーバとして動作し、サーバ＃２０１は待機サーバとして動作する。
【００１５】
クライアント＃１は、サーバ装置２が記憶するデータを使用するアプリケーションが動作するクライアント装置３である。クライアント＃１とサーバ＃１０１とサーバ＃２０１は、業務ＬＡＮ（Local  Area  Network）４ａで接続される。また、サーバ＃１０１とサーバ＃２０１は、同期ＬＡＮ４ｂで接続される。
【００１６】
図１Ａに示すように、クライアント＃１は、データ追加の要求電文１１をサーバ＃１０１、＃２０１に送信する。クライアント＃１は、トランザクションの最初に電文を送信する際、仮トランＩＤ「Ｔ−ＣＬ＃１」を生成し、電文に付加する（１）。ここで、「トラン」は、トランザクションを表し、以下の記載においても同様である。仮トランＩＤは、トランザクションを識別する仮の識別子である。要求電文１１には、仮トランＩＤとして「Ｔ−ＣＬ＃１」、追加されるデータとして「ｒｅｃ＃１」が含まれる。
【００１７】
クライアント＃１は、仮トランＩＤをトランＩＤとして待機応答記憶部６５に格納し、管理する。トランザクションの正式な識別子が現用サーバにより決定されると待機応答記憶部６５のトランＩＤは、正式な識別子で書き換えられる。待機応答記憶部６５のＮｏは、データ操作の通番である。また、クライアント＃１は、仮トランＩＤをデータＩＤ記憶部６６に格納し、管理する。
【００１８】
要求電文１１を受信すると、現用サーバは、トランザクション処理を実施し、トランザクション処理の実施後に、トランＩＤ、データＩＤを決定する（２）。ここで、トランＩＤは、トランザクションを識別する識別子であり、データＩＤは、データを識別する識別子である。そして、現用サーバは、トランＩＤ、仮トランＩＤ、Ｎｏ、データＩＤ及びデータをトラン情報記憶部５５ａに格納して管理する。図１Ａでは、トランＩＤとして「Ｔ＃００１」、仮トランＩＤとして「Ｔ−ＣＬ＃１」、ＮＯとして「１」、データＩＤとして「１００」、データとして「ｒｅｃ＃１」がトラン情報記憶部５５ａを用いて管理される。
【００１９】
一方、要求電文１１を受信すると、待機サーバは、仮トランＩＤでデータ「ｒｅｃ＃１」を管理する（３）。待機サーバは、仮トランＩＤ、Ｎｏ及びデータをトラン情報記憶部５５ｅに格納して管理する。このタイミングでは、トランＩＤ及びデータＩＤは空白である。待機サーバは、次回電文受信時に、トランＩＤ及びデータＩＤを含めてトラン情報記憶部５５ｅを更新する。そして、待機サーバはクライアント＃１に応答する。クライアント＃１は、待機サーバから応答があれば、待機サーバの識別番号を待機応答記憶部６５のサーバＮｏに追記する（４）。図１Ａでは、「＃２０１」が追記されている。
【００２０】
現用サーバは、処理したデータのデータＩＤと処理したトランザクションのトランＩＤを応答電文１２に埋め込み返却する（５）。図１Ａでは、トランＩＤとして「Ｔ＃００１」、データＩＤとして「１００」が応答電文１２に含まれる。クライアント＃１は、応答電文１２を受け取ると、処理対象データのデータＩＤ「１００」とトランＩＤ「Ｔ＃００１」をデータＩＤ記憶部６６に保存する（６）。また、クライアント＃１は、待機応答記憶部６５のトランＩＤを応答電文１２に含まれるトランＩＤ「Ｔ＃００１」で書き換える。
【００２１】
そして、図１Ｂに示すように、クライアント＃１は、次のデータ更新の要求電文１３を送信する際にデータＩＤ記憶部６６を参照して要求電文１３にトランＩＤ及びデータＩＤを付与する（７）。そして、クライアント＃１は、データ更新の要求電文１３をサーバ＃１０１、サーバ＃２０１に送信する（８）。クライアント＃１は、仮トランＩＤ、更新データに加え、正式なトランＩＤ、前回のデータのデータＩＤを同時に送信する。図１Ｂでは、仮トランＩＤ「Ｔ−ＣＬ＃１」、更新データ「ｒｅｃ＃２」に加え、データＩＤ記憶部６６が記憶するトランＩＤ「Ｔ＃００１」とデータＩＤ「１００」が要求電文１３に含まれる。
【００２２】
要求電文１３を受信すると、現用サーバは、トランザクション処理を実施し、トランザクション処理の実施後に、処理対象データのデータＩＤを決定する（９）。そして、現用サーバは、トラン情報記憶部５５ａにトランＩＤ、仮トランＩＤ、Ｎｏ、データＩＤ及びデータを格納する。図１Ｂでは、トランＩＤ「Ｔ＃００１」、仮トランＩＤ「Ｔ−ＣＬ＃１」、ＮＯ「２」、データＩＤ「１０１」、データ「ｒｅｃ＃２」がトラン情報記憶部５５ａに格納される。
【００２３】
一方、要求電文１３を受信すると、待機サーバは、トラン情報記憶部５５ｅにおいて、仮トランＩＤ「Ｔ−ＣＬ＃１」と正式なトランＩＤ「Ｔ＃００１」を対応付け、前回操作したデータ「ｒｅｃ＃１」のデータＩＤとトランＩＤを更新する（１０）。そして、待機サーバはクライアント＃１に応答する。クライアント＃１は、待機サーバから応答があれば、待機サーバの識別番号を待機応答記憶部６５のサーバＮｏに追記する。図１Ｂでは、「＃２０１」が追記されている。また、クライアント＃１は、データＩＤ記憶部６６からＮｏが「１」であるデータＩＤに関する情報を削除する（１１）。図１Ｂでは、データＩＤ「１００」に関する情報が削除される。
【００２４】
現用サーバは、データＩＤとトランザクションのトランＩＤを応答電文１４に埋め込み返却する（１２）。図１Ｂでは、トランＩＤとして「Ｔ＃００１」、データＩＤとして「１０１」が応答電文１４に含まれる。クライアント＃１は、応答電文１４を受け取ると、データＩＤ「１０１」とトランＩＤ「Ｔ＃００１」をデータＩＤ記憶部６６に保存する（１３）。
【００２５】
そして、図１Ｃに示すように、クライアント＃１は、次のコミットの要求電文１５を送信する際にデータＩＤ記憶部６６を参照して要求電文１５にトランＩＤ及びデータＩＤを付与する（１４）。そして、クライアント＃１は、コミットの要求電文１５をサーバ＃１０１、サーバ＃２０１に送信する（１５）。すなわち、クライアント＃１は、仮トランＩＤに加え、トランＩＤ、前回のデータのデータＩＤを同時に送信する。図１Ｂでは、仮トランＩＤ「Ｔ−ＣＬ＃１」に加え、データＩＤ記憶部６６が記憶するトランＩＤ「Ｔ＃００１」とデータＩＤ「１０１」が要求電文１５に含まれる。
【００２６】
要求電文１５を受信すると、現用サーバは、コミット処理を実施する（１６）。すなわち、現用サーバは、トラン情報記憶部５５ａの情報をデータ記憶部５ｂに反映させる。そして、現用サーバは、この時点では、トラン情報記憶部５５ａが記憶する情報を消さずに残しておく。
【００２７】
一方、要求電文１５を受信すると、待機サーバは、要求電文１５とトラン情報記憶部５５ｅの情報に基づいてコミット処理を実施する（１７）。すなわち、待機サーバは、要求電文１５とトラン情報記憶部５５ｅの情報をデータ記憶部５ｂに反映させる。そして、待機サーバは、この時点では、トラン情報記憶部５５ｅが記憶する情報を消さずに残しておく。
【００２８】
上記（１６）、（１７）では、現用サーバ及び待機サーバは、それぞれトラン情報記憶部５５ａ及び５５ｅの情報を消さないで、次回にクライアント＃１から要求が来るまで保持しておく。すなわち、次回にクライアント＃１から要求が来ると、トラン情報記憶部５５ａ及び５５ｅの情報は消される。
【００２９】
クライアント＃１は、サーバ＃１０１及びサーバ＃２０１の両方から応答があるのを待つ（１８）。サーバ＃１０１からの応答電文１６には、トランＩＤが含まれる。図１Ｃでは、「Ｔ＃００１」が応答電文１６に含まれる。
【００３０】
なお、複数のクライアント装置３からの要求を、サーバ装置２においてマルチスレッドで同時に処理する場合、トランザクションの実行順序が重要になる。例えば、同一データに対する更新処理では、クライアント＃１が先に動作したか、クライアント＃２が先に動作したかで結果が異なる場合がある。本実施例では、唯一の現用サーバでトランザクションの実行順序を決定し、現用サーバで採番したトランＩＤを基に待機サーバでデータを管理することで、冗長構成を含めた全てのサーバ装置２でトランザクションの整合性を保証することができる。
【００３１】
トランザクションで処理するデータについても、現用サーバで一意に特定する必要がある。例えば、以下のような場合は、待機サーバでもデータを一意に特定することは可能である。
・ＲＤＢ（Relational  Data  Base）のように、事前に一意性制約（主キーなど）が定義されている場合
・Ｋｅｙ−Ｖａｌｕｅ方式のように、データと対応するキー値が事前に分っている場合
【００３２】
しかし、Ｋｅｙ−Ｖａｌｕｅ方式でない、又は、一意性制約が定義されていない場合には、クライアント装置３側で事前にデータを特定する情報がないため、現用サーバ及び待機サーバそれぞれで、処理対象のデータを一意に特定することはできない。データ操作のトランザクションが複数のクライアント装置３から同時に実行される場合、トランザクションの実行順序が決定されて、初めて「データ」を一意に決定することができる。
【００３３】
本実施例では、トランＩＤと同様に、唯一の現用サーバがデータを一意に特定する情報である「データＩＤ」を決定し、現用サーバで採番されたデータＩＤを基に待機サーバでデータを管理する。したがって、冗長構成を含めた構成でトランザクションの整合性を保証することができる。データＩＤは、データ追加時は新規に採番され、データ更新時は更新対象のデータのデータＩＤとなる。
【００３４】
冗長構成を含めた全てのサーバ装置２で、トランザクションの整合性を保証するためには、トランザクションの実行順序及びトランザクションで操作したデータを情報処理システム内で一致させる必要がある。しかし、トランザクション実行順序、トランザクションを一意に特定するためのトランザクションＩＤ、処理対象データを一意に特定するためのデータＩＤは、現用サーバでのみ採番・特定される。このため、従来の方式では、トランザクションの実行順序及びトランザクションで操作したデータを情報処理システム内で一致させることができない。そこで、本実施例では、クライアント装置３で「仮トランＩＤ」を採番し、「仮トランＩＤ」を基に現用サーバと待機サーバのトランザクション情報を管理することで、トランザクションの整合性を保証することができる。
【００３５】
図２は、仮トランＩＤの構造の一例を示す図である。図２に示すように、仮トランＩＤには、ＩＰアドレスとプロセスＩＤとスレッドＩＤと通番が含まれる。ＩＰアドレスは、クライアント装置３のＩＰアドレスである。プロセスＩＤ及びスレッドＩＤは、要求電文を送信するアプリケーションのプロセス及びスレッドの識別子である。通番は、プロセス内の通番である。
【００３６】
図３は、クライアント装置３及び待機サーバがトランＩＤ及びデータＩＤを取得するタイミングを示す図である。図３において、Ｄ［ｎ］は、ｎ回目に操作したデータを表す。トランザクションの初回の処理の場合は、クライアント装置３では、事前にトランＩＤを取得できないため、クライアント装置３で仮トランＩＤを生成し、待機サーバに送信する（図３の１ａ）。要求電文を受信した待機サーバは、仮トランＩＤでデータを管理する（図３の１ｂ）。この時点では、待機サーバではトランＩＤ及びデータＩＤは特定されていない。
【００３７】
正式なトランＩＤ及びデータＩＤは、現用サーバが応答電文に付加し、クライアント装置３に通知する。通知されたトランＩＤ及びデータＩＤは、クライアント装置３のデータＩＤ記憶部６６に記録される（図３の１ｃ）。次に、クライアント装置３は、要求電文を送信する際に、一つ前に処理したデータのデータＩＤとトランＩＤをデータＩＤ記憶部６６から読み出して要求電文に付加して送信する（図３の２ａ）。
【００３８】
すなわち、実施例では、現用サーバで採番されたトランＩＤ及びデータＩＤを、クライアント装置３が次の処理の要求電文で待機サーバに送信することで、トランＩＤ及びデータＩＤを情報処理システム内で一致させるようにしている（待機サーバでは、情報通知が１処理分遅延する）。トランザクションが開始すれば、クライアント装置３でトランＩＤを取得することが可能になるため、トランザクション処理の２回目以降は、待機サーバでも要求電文受信時にトランＩＤを取得できる（図３の２ｂ）。
【００３９】
次に、操作電文ロスト時の処理の流れについて図４〜図５Ｂを用いて説明する。図４は、現用サーバで操作電文のロストが発生した時の処理の流れを示す図である。本実施例では、現用サーバが唯一トランザクション処理（各種ＩＤ採番、排他制御等）を行うため、現用サーバに対する操作電文がロストした場合、現用サーバから応答が来ない状態となる。クライアント装置３は、現用サーバからの応答を一定時間待ち合わせ、一定時間を越えても現用サーバから応答がない場合は、現用サーバに対して、操作電文の再送を行う。一定回数再送しても、現用サーバから応答がなかった場合は、クライアント装置３は、永続的な通信異常であると判断し、ロールバックを行い（待機サーバに蓄積されているトラン情報をクリアする）、アプリケーションにエラーを通知する。
【００４０】
すなわち、図４に示すように、クライアント＃１は、データ追加の要求電文１１をサーバ＃１０１、＃２０１に送信する（１）。そして、現用サーバに至る経路上で電文ロストが発生する（２）。一方、要求電文１１を受信すると、待機サーバは、仮トランＩＤでデータ「ｒｅｃ＃１」を管理する（３）。このタイミングでは、トランＩＤ及びデータＩＤは空白であり、次回要求電文受信時に更新される。そして、待機サーバはクライアント＃１に応答する。クライアント＃１は、待機サーバから応答があれば、待機サーバの識別番号を待機応答記憶部６５のサーバＮｏに追記する（４）。
【００４１】
また、クライアント＃１は、現用サーバからの応答を待ち、一定時間現用サーバから応答がなければ、要求電文１１を再送する（５）。そして、クライアント＃１は、一定回数再送しても、現用サーバから応答がなければ、処理をロールバックし、エラー復帰する。
【００４２】
図５Ａ及び図５Ｂは、待機サーバで操作電文のロストが発生した時の処理の流れを示す第１の図及び第２の図である。本実施例では、トランザクション処理のレスポンス向上のため、以下の方式で応答を待合わせる。
・コミットの要求電文：現用サーバおよび待機サーバからの応答を同期方式で待合わせる。
・追加・更新・削除の要求電文：現用サーバからの応答は同期方式で待合わせ、待機サーバからの応答は非同期方式で待合わせる。
【００４３】
クライアント装置３は、コミット実行時に追加・更新・削除の要求電文に対する待機サーバの応答が確認できていない場合は、待機サーバへの電文がロストしたと判断し、コミット依頼時に現用サーバから待機サーバにデータをミラーリングする方式に切替える。
【００４４】
例えば、図５Ａに示すように、クライアント＃１が、データ更新の要求電文１３にトランＩＤ及びデータＩＤを付与する（１）。そして、クライアント＃１は、データ更新の要求電文１３をサーバ＃１０１、サーバ＃２０１に送信する（２）。
【００４５】
待機サーバへの要求電文がパケットロストしたため、待機サーバは、データ「ｒｅｃ＃１」のデータＩＤの更新ができない（３）。一方、現用サーバは、応答電文１４を送信し、クライアント＃１は、現用サーバの応答電文１４に含まれるデータＩＤ及びトランＩＤをデータＩＤ記憶部６６に保存する（４）。ただし、待機サーバへの要求電文の送信に失敗したので、クライアント＃１は、待機サーバからの応答は受信できない。したがって、クライアント＃１は待機応答記憶部６５のサーバＮｏに情報を書き込むことができず、処理完了とならない。また、トランＩＤ及びデータＩＤの送達確認ができないため、データＩＤ記憶部６６のＮｏが「１」である情報は削除されない（５）。
【００４６】
そして、クライアント＃１は、図５Ｂに示すように、待機応答記憶部６５で、トランＩＤが「Ｔ＃００１」のトランザクションに関して待機サーバの処理が完了になっていないので、ミラーリングコミットフラグをＯＮにしてコミットの要求電文１７を送信する（６）。クライアント＃１は、コミット時点で待機応答記憶部６５に未応答のエントリが１個以上記録されていれば、ミラーリング方式に切替える。
【００４７】
現用サーバは、要求電文１７を受信すると、コミット処理を実行する（７）。一方、待機サーバは、要求電文１７を受信すると、ミラーリングコミットフラグがＯＮなので、現用サーバからの指示を待つ（８）。そして、現用サーバは、ミラーリングコミットフラグがＯＮなので、コミット対象のデータをミラーリングする（９）。そして、待機サーバは、ミラーリングによるコミットを行う（１０）。
【００４８】
次に、コミット電文ロスト時の処理の流れについて説明する。現用サーバと待機サーバに同時にコミット処理の要求電文を送信し、並列にコミット処理を行った場合、一部のサーバはコミットが成功、一部のサーバはコミットが失敗という状態になると、サーバ間でデータの整合性がとれていない状態となる。このため、別のクライアント装置３から同一データに対する操作が来た場合にトランザクションの整合性がとれない。
【００４９】
そこで、本実施例では、情報処理システムは以下の処理を行う。なお、ここでは、トランザクションのコミット電文再送中のクライアント装置３をクライアント＃１とし、クライアント＃１のコミット電文再送中に、同一データに対するトランザクションを行ったクライアント装置３をクライアント＃２とする。
【００５０】
・コミットの要求電文ロスト時は、クライアント＃１側で要求電文の再送を行う。
・現用サーバへのコミットの要求電文がロストした場合は、クライアント＃２の操作要求時に、現用サーバは、トラン情報記憶部５５ａの情報から同一データに対してクライアント＃１がトランザクション中であることを検知し、クライアント＃２にリトライさせる。
・待機サーバへのコミットの要求電文がロストした場合は、現用サーバは、クライアント＃１に対するトランザクション処理が完了した後も、トラン情報記憶部５５ａの情報を残しておく。そして、後続するクライアント＃２に対するトランザクション処理開始時に、現用サーバ及び待機サーバは、それぞれのトラン情報記憶部５５ａ及び５５ｅに格納されているトランＩＤ及び仮トランＩＤから、同一データがコミット中であることを検知する。そして、現用サーバ及び待機サーバは、クライアント＃２にリトライさせるように、先行トランの情報を送信する。
【００５１】
現用サーバに対するコミット要求の電文がロストした場合、現用サーバ及び待機サーバは以下の状態となる。
・現用サーバ：コミット失敗。トランザクション中の状態。データに対するロック(排他)獲得済み。
・待機サーバ：コミット成功。トランザクションはコミットされている状態。
【００５２】
この場合、先行するクライアント＃１が現用サーバに対するコミット要求再送中に、後続するクライアント＃２から同一データに対する更新操作の要求電文が来たとしても、現用サーバ側で、既にクライアント＃１でデータに対してロック獲得済みである。このため、クライアント＃２の更新操作の要求電文が届いた時点で、現用サーバは、クライアント＃２の更新操作をキャンセル（ロールバック）させることができる。
【００５３】
待機サーバに対するコミット要求の電文がロストした場合、現用サーバ及び待機サーバは以下の状態となる。
・現用サーバ：コミット成功。トランザクションはコミットされている状態。
・待機サーバ：コミット失敗。トランザクション中の状態。トランＩＤ、データＩＤ未特定の状態あり。
【００５４】
現用サーバは、クライアント＃１に対するトランザクション処理が完了した後も、トラン情報記憶部５５ａの情報を残しておく。そして、現用サーバは、後続するクライアント＃２に対するトランザクション処理を開始する際に、同一データ（同一データＩＤ）に対してトラン情報記憶部５５ａに残っているトランＩＤ及び仮トランＩＤをクライアント＃２に通知する。
【００５５】
一方、待機サーバは、データ比較（文字列・バイナリ比較等）やインデックスキー値比較等から、クライアント＃２と「同一データらしきデータ（データＩＤ不定のため同一性を確定できない）」をコミット中であるクライアント＃１がいることを予測する。そして、待機サーバは、予測した先行トランのトランＩＤ及び仮トランＩＤをクライアント＃２に通知する。
【００５６】
クライアント＃２は、待機サーバで予測した先行トランの情報と、現用サーバの応答から得られた先行トランの情報を、仮トランＩＤで対応付けることで、同一データに対して、コミット中のトランザクションが存在することを検知する。
【００５７】
なお、操作（更新、追加、削除）するデータを特定するためにインデックスを使用する場合が多いが、インデックスに一意性制約がついていない場合もあるため、待機サーバは、インデックスキー値による比較を行っても、あくまで先行トランを予測しかできない。クライアント＃２は、現用サーバからの応答と待機サーバからの応答を突合せることで、始めて、先行トランの有無を判断できる。
【００５８】
図６は、待機サーバでコミット電文のロストが発生した時の処理の流れを示す図である。図６に示すように、現用サーバでは、トランＩＤ「Ｔ＃００１」のコミットが成功する（１）。そして、待機サーバは、次回、クライアント＃１から要求が来るまで、すなわち、クライアント＃１で待機サーバのコミットが完了するまでトラン情報記憶部５５ａが記憶する情報を保持する（２）。
【００５９】
このとき、クライアント＃１は、待機サーバへのトランＩＤ「Ｔ＃００１」のコミット電文がロストしたため、待機サーバにコミット電文を再送中の状態にある（３）。また、クライアント＃２がデータＩＤ「１００」に対する更新処理を仮トランＩＤを「Ｔ−ＣＬ＃２」として要求する（４）。
【００６０】
すると、現用サーバで、クライアント＃２のトラン（仮トランＩＤ：「Ｔ−ＣＬ＃２」）の処理を実施する。現用サーバは、加えて、処理するデータ「ｒｅｃ＃１」と同一データＩＤ「１００」のデータを先行してトランＩＤ「Ｔ＃００１」（Ｔ−ＣＬ＃１）で処理していたことを検知する（５）。そして、現用サーバは、クライアント＃２へ、トランＩＤ「Ｔ＃００２」及び仮トランＩＤ「Ｔ−ＣＬ＃２」の応答と同時に、先行トランのトランＩＤ「Ｔ＃００１」及び仮トランＩＤ「Ｔ−ＣＬ＃１」を応答する（６）。
【００６１】
一方、待機サーバは、クライアント＃２の仮トランＩＤ「Ｔ−ＣＬ＃２」で処理するデータ又はインデックスキー値を比較し、同一らしきデータを処理している先行トラン（Ｔ−ＣＬ＃１）があることを検知する（７）。そして、待機サーバは、クライアント＃２のトラン（Ｔ−ＣＬ＃２）の情報に加え、先行トラン（Ｔ−ＣＬ＃１）の情報も応答する（８）。
【００６２】
そして、現用サーバ及び待機サーバからの応答を受け取ると、クライアント＃２は、待機サーバに、同一データを操作する先行トラン（Ｔ−ＣＬ＃１）が存在することを検知する。そして、クライアント＃２は、トラン（Ｔ＃００２、Ｔ−ＣＬ＃２）をロールバックし、アプリにリトライさせる（９）。ここで、「アプリ」は、アプリケーションである。
【００６３】
次に、通信遅延により電文追越しが発生した時の処理の流れについて説明する。実施例に係る情報処理システムでは、現用サーバは、処理依頼の要求電文が到着した順番で、トランザクションを開始する。同一データを操作する場合は、後続のトランザクションは先行するトランザクションが完了するのを待たされるか、又は、クライアント装置３はアプリケーションにエラー通知を行う。一方、待機サーバは応答電文を非同期方式で待合わせており、かつ、電文の追越しを保証しない一般的なネットワーク環境を考えると、現用サーバにおける要求電文の到着順と異なる順番で待機サーバが要求電文を受信する場合がありえる。
【００６４】
実施例に係る情報処理システムでは、現用サーバは、唯一トランザクション処理を行い、クライアント装置３を介して、現用サーバの情報（トランＩＤやデータＩＤ）を待機サーバに通知する。このため、待機サーバ側の受信順番が異なっても、現用サーバと待機サーバでデータの整合性を維持することができる。
【００６５】
図７Ａ〜図７Ｃは、通信遅延により電文追越しが発生した時の処理の流れを示す第１の図〜第３の図である。図７Ａは、電文追越しが発生しない正常な場合を示し、図７Ｂは、現用サーバと待機サーバとの間で電文の到着順が一致していない場合を示し、図７Ｃは、複数クライアントの電文が現用サーバと待機サーバとの間で到着順が一致していない場合を示す。
【００６６】
図７Ａに示すように、正常な場合には、現用サーバがクライアント＃１から要求電文＃１を受信し（ｔ１）、待機サーバがクライアント＃１から要求電文＃１を受信する（ｔ２）。そして、現用サーバがトラン情報記憶部５５ａを更新してクライアント＃１に応答し（ｔ３）、待機サーバがトラン情報記憶部５５ｅを更新してクライアント＃１に応答する（ｔ４）。
【００６７】
そして、現用サーバがクライアント＃１から要求電文＃２を受信し（ｔ５）、待機サーバがクライアント＃１から要求電文＃２を受信する（ｔ６）。そして、現用サーバがトラン情報記憶部５５ａを更新してクライアント＃１に応答し（ｔ７）、待機サーバがトラン情報記憶部５５ｅを更新してクライアント＃１に応答する（ｔ８）。
【００６８】
一方、図７Ｂでは、現用サーバは要求電文＃１、要求電文＃２の順番で受信し、待機サーバは要求電文＃２、要求電文＃１の順番で受信する。このような電文の追越しは、オンプレミス環境ではほとんど発生しないが、ネットワーク機器を複数介し、かつ、通信品質が保証されないネットワーク環境（安価で低速なネットワーク機器やインターネット環境）等を利用するクラウド環境では、考慮が必要である。
【００６９】
図７Ｂに示すように、現用サーバは、クライアント＃１から要求電文＃１を受信し（ｔ１１）、トラン情報記憶部５５ａを更新してクライアント＃１に応答する（ｔ１２）。そして、現用サーバがクライアント＃１から要求電文＃２を受信し（ｔ１３）、待機サーバがクライアント＃１から要求電文＃２を受信する（ｔ１４）。
【００７０】
そして、現用サーバがトラン情報記憶部５５ａを更新してクライアント＃１に応答し（ｔ１５）、待機サーバがトラン情報記憶部５５ｅを更新してクライアント＃１に応答する（ｔ１６）。そして、待機サーバが遅れて到着した要求電文＃１を受信し（ｔ１７）、トラン情報記憶部５５ｅを更新してクライアント＃１に応答する（ｔ１８）。この時点での待機サーバのトラン情報記憶部５５ｅの状態を図７Ａと比較すると、トラン情報記憶部５５ｅの状態は状態Ｓ＃２で同じである。
【００７１】
また、図７Ｃでは、異なるクライアント装置３から送信された要求電文の到着順番が、現用サーバと待機サーバで異なった場合であっても、現用サーバに到着した順番で要求電文が処理される。同一データに対する操作要求であれば、先に現用サーバに要求電文が到着した方が優先され、トランザクションの処理が開始される。後から現用サーバに要求電文が到着したクライアント装置３は、排他獲得に失敗する。このため、先に待機サーバに到着したトランザクション（仮トランＩＤ：「Ｔ−ＣＬ＃２」）は、ロールバック（又はは、リトライ）される。
【００７２】
図７Ｃに示すように、現用サーバは、クライアント＃１から要求電文＃１１を受信し（ｔ２１）、トラン情報記憶部５５ａを更新してクライアント＃１に応答する（ｔ２２）。そして、現用サーバは、クライアント＃２から要求電文＃２１を受信する（ｔ２３）が、既にＴ−ＣＬ＃１でｒｅｃ＃１の排他を獲得済みであるので、クライアント＃２にＴ−ＣＬ＃２の失敗を応答する（ｔ２５）。
【００７３】
一方、待機サーバは、クライアント＃２から要求電文＃２１を受信し（ｔ２４）、トラン情報記憶部５５ｅを更新してクライアント＃２に応答する（ｔ２６）。そして、待機サーバは、遅れて到着した要求電文＃１１を受信し（ｔ２７）、トラン情報記憶部５５ｅを更新してクライアント＃１に応答する（ｔ２８）。
【００７４】
また、クライアント＃２は、Ｔ−ＣＬ＃２の失敗を通知されると、Ｔ−ＣＬ＃２のロールバックを現用サーバと待機サーバに指示する（ｔ２９，ｔ３０）。指示を受けた現用サーバは何もしないが、指示を受けた待機サーバはロールバックにより、トラン情報記憶部５５ｅのＴ−ＣＬ＃２の情報をクリアする。そして、現用サーバと待機サーバは、クライアント＃２に応答を返す（ｔ３１，ｔ３２）。
【００７５】
次に、実施例に係る情報処理システムの構成について説明する。図８は、実施例に係る情報処理システムの構成を示す図である。図８に示すように、実施例に係る情報処理システム１は、サーバ装置＃１〜サーバ装置＃３で表される３台のサーバ装置２と、クライアント＃１及びクライアント＃２で表される２台のクライアント装置３を有する。
【００７６】
クライアント装置３とサーバ装置２は、業務用の通信を行うための業務ＬＡＮ４ａ及びネットワーク４を介して接続される。また、サーバ装置２は、ミラーリングを行うための同期ＬＡＮ４ｂで接続される。サーバ装置＃１は、現用サーバとして動作し、サーバ装置＃２及びサーバ装置＃３は待機サーバとして動作する。なお、図８では、２台のクライアント装置３及び待機サーバを示すが、情報処理システム１は、３台以上のクライアント装置３及び待機サーバを有してよい。
【００７７】
図９は、サーバ装置２のハードウェア構成の一例を示す図である。図９に示すように、サーバ装置２は、ＣＰＵ（Central  Processing  Unit）２１と、メモリ２２と、ＨＤＤ（Hard  Disk  Drive）２３と、画像信号処理部２４と、入力信号処理部２５と、磁気ディスクドライブ２６と、通信インタフェース２７とを有する。ＣＰＵ２１、メモリ２２、ＨＤＤ２３、画像信号処理部２４、入力信号処理部２５、磁気ディスクドライブ２６及び通信インタフェース２７は、バス２８により接続される。
【００７８】
ＣＰＵ２１は、メモリ２２からプログラムを読み出して実行する中央処理装置である。メモリ２２は、プログラムやプログラムの実行途中結果などを記憶するＲＡＭ（Random  Access  Memory）である。ＨＤＤ２３は、プログラムやデータを格納するディスク装置である。ＨＤＤ２３は、サーバ装置２を制御するサーバ制御プログラム５ａを記憶する。
【００７９】
画像信号処理部２４は、ディスプレイ４１への表示を制御する。入力信号処理部２５は、入力デバイス４２からの入力を制御する。磁気ディスクドライブ２６は、磁気ディスク４３を制御する。通信インタフェース２７は、業務ＬＡＮ４ａ及びネットワーク４を介した通信を制御する。また、通信インタフェース２７は、同期ＬＡＮ４ｂを介した通信を制御する。
【００８０】
そして、サーバ制御プログラム５ａは、ＣＤ・ＤＶＤ等の磁気ディスクに記憶され、磁気ディスクから読み出されてサーバ装置２にインストールされる。あるいは、サーバ制御プログラム５ａは、ネットワーク４を介して接続された他のサーバ装置のデータベースなどに記憶され、これらのデータベースから読み出されてサーバ装置２にインストールされる。そして、インストールされたサーバ制御プログラム５ａは、ＨＤＤ２３からメモリ２２に読出されてＣＰＵ２１によって実行される。
【００８１】
図１０は、クライアント装置３のハードウェア構成の一例を示す図である。図１０に示すように、クライアント装置３は、ＣＰＵ３１と、メモリ３２と、ＨＤＤ３３と、画像信号処理部３４と、入力信号処理部３５と、磁気ディスクドライブ３６と、通信インタフェース３７とを有する。ＣＰＵ３１、メモリ３２、ＨＤＤ３３、画像信号処理部３４、入力信号処理部３５、磁気ディスクドライブ３６及び通信インタフェース３７は、バス３８により接続される。
【００８２】
ＣＰＵ３１は、メモリ３２からプログラムを読み出して実行する中央処理装置である。メモリ３２は、プログラムやプログラムの実行途中結果などを記憶するＲＡＭである。ＨＤＤ３３は、プログラムやデータを格納するディスク装置である。ＨＤＤ３３は、クライアント装置３を制御するクライアント制御プログラム６ａを記憶する。また、ＨＤＤ３３は、クライアント装置３で実行されるアプリケーションプログラム７ａを記憶する。
【００８３】
画像信号処理部３４は、ディスプレイ４６への表示を制御する。入力信号処理部３５は、入力デバイス４７からの入力を制御する。磁気ディスクドライブ３６は、磁気ディスク４８を制御する。通信インタフェース３７は、ネットワーク４を介した通信を制御する。
【００８４】
そして、クライアント制御プログラム６ａ及びアプリケーションプログラム７ａは、ＣＤ・ＤＶＤ等の磁気ディスクに記憶され、磁気ディスクから読み出されてクライアント装置３にインストールされる。あるいは、クライアント制御プログラム６ａ及びアプリケーションプログラム７ａは、ネットワーク４を介して接続された他のサーバ装置のデータベースなどに記憶され、これらのデータベースから読み出されてクライアント装置３にインストールされる。そして、インストールされたクライアント制御プログラム６ａ及びアプリケーションプログラム７ａは、ＨＤＤ３３からメモリ３２に読出されてＣＰＵ３１によって実行される。
【００８５】
次に、サーバ装置２及びクライアント装置３の機能構成について説明する。図１１は、サーバ装置２及びクライアント装置３の機能構成を示す図である。図１１に示すように、サーバ装置２は、データ記憶部５ｂとサーバ制御部５とを有する。
【００８６】
データ記憶部５ｂは、クライアント装置３で動作するアプリケーション７が使用するデータを記憶する。データ記憶部５ｂは、メモリ２２上に実現されるがＨＤＤ２３上に実現されてもよい。図１２は、データ記憶部５ｂの一例を示す図である。図１２に示すように、データ記憶部５ｂは、データＩＤとデータを対応付けて記憶する。データＩＤは、データを識別する識別子である。例えば、データＩＤが「０００００１０１」であるデータは「“ａｂｃｄｅｆ”」である。
【００８７】
サーバ制御部５は、サーバ装置２を制御する。サーバ制御部５は、図９に示したサーバ制御プログラム５ａがＣＰＵ２１により実行されることで実現される。サーバ制御部５は、処理制御部５１と通信制御部５２とを有する。処理制御部５１は、トランザクションに関する処理を制御する。通信制御部５２は、通信インタフェース２７を用いてクライアント装置３及び他のサーバ装置２との通信を制御する。
【００８８】
処理制御部５１は、現用系処理制御部５１ａと待機系処理制御部５１ｂとを有する。現用系処理制御部５１ａは、サーバ装置２が現用サーバとして動作する時に、トランザクションに関する処理を制御し、待機系処理制御部５１ｂは、サーバ装置２が待機サーバとして動作する時に、トランザクションに関する処理を制御する。
【００８９】
現用系処理制御部５１ａは、トラン情報記憶部５５ａと、トラン処理部５５ｂと、トランＩＤ生成部５５ｃと、データＩＤ生成部５５ｄとを有する。待機系処理制御部５１ｂは、トラン情報記憶部５５ｅとデータ管理部５５ｆを有する。
【００９０】
トラン情報記憶部５５ａは、トランザクションに関する情報を記憶する。図１３は、トラン情報記憶部５５ａの一例を示す図である。図１３に示すように、トラン情報記憶部５５ａは、コミット状態と、トランＩＤと、仮トランＩＤと、Ｎｏと、インデックスキー値と、データＩＤと、データとを対応付けて要求電文毎に記憶する。
【００９１】
コミット状態は、コミットが完了したか否かを示す。コミット状態が「１」である場合には、コミットが完了し、コミット状態が「０」である場合には、コミットが未完である。インデックスキー値は、データのインデックスキーの値である。例えば、トランＩＤが「０１０００００１」であり、仮トランＩＤが「ｘｘｘ．ｘｘｘ．ｘｘｘ．１０１−１２３４５−６７８９０−２０１」であり、Ｎｏが「１」である要求電文のデータは「“ａｂｃｄｅｆ”」であり、コミットが未完了である。データの識別子は「０００００００１０１」であり、インデックスキー値は「“ｋｅｙ１”」である。なお、図１Ａ〜図７Ｃでは、コミット状態、インデックスキー値は省略されている。
【００９２】
トラン処理部５５ｂは、クライアント装置３から要求電文を受信し、要求電文に応じた処理を行って、クライアント装置３に応答電文を送信する。
【００９３】
具体的には、トラン処理部５５ｂは、データの追加を要求する要求電文を受信すると、トランザクション処理を実行する。トランザクション処理には、排他処理等が含まれる。そして、トラン処理部５５ｂは、トランＩＤ生成部５５ｃにトランＩＤの生成を指示し、データＩＤ生成部５５ｄにデータＩＤの生成を指示する。
【００９４】
そして、トラン処理部５５ｂは、生成されたトランＩＤ及びデータＩＤと要求電文の情報に基づいてトラン情報記憶部５５ａを更新する。そして、トラン処理部５５ｂは、生成されたトランＩＤ及びデータＩＤを応答電文に含め、クライアント装置３に応答電文を送信する。
【００９５】
また、トラン処理部５５ｂは、データの更新を要求する要求電文を受信すると、トランザクション処理を実行する。そして、トラン処理部５５ｂは、データＩＤ生成部５５ｄにデータＩＤの生成を指示し、生成されたデータＩＤと要求電文の情報に基づいてトラン情報記憶部５５ａを更新する。そして、トラン処理部５５ｂは、生成されたデータＩＤを応答電文に含め、クライアント装置３に応答電文を送信する。
【００９６】
また、トラン処理部５５ｂは、コミットを要求する要求電文を受信すると、トラン情報記憶部５５ａが記憶する情報をデータ記憶部５ｂに反映させるコミット処理を行う。コミット処理を行ったトランザクションに関して、トラン処理部５５ｂは、トラン情報記憶部５５ａが記憶する情報を消さずに保持する。そして、トラン処理部５５ｂは、同じクライアント装置３から次の要求電文を受信すると、コミット処理を行ったトランザクションに関して、トラン情報記憶部５５ａが記憶する情報を消す。
【００９７】
また、トラン処理部５５ｂは、コミット要求のミラーリングフラグがＯＮである場合には、トラン情報記憶部５５ａが記憶する情報を待機サーバに送信し、コミットを指示する。また、トラン処理部５５ｂは、クライアント装置３からの要求に基づいて待機サーバが処理中のデータについて別のクライアント装置３から要求電文を受信したことをトラン情報記憶部５５ａを用いて検知する。そして、トラン処理部５５ｂは、応答電文に先行トランの情報を含めて別のクライアント装置３に応答する。
【００９８】
トランＩＤ生成部５５ｃは、トラン処理部５５ｂの指示に基づいてトランＩＤを生成する。データＩＤ生成部５５ｄは、トラン処理部５５ｂの指示に基づいてデータＩＤを生成する。
【００９９】
トラン情報記憶部５５ｅは、トランザクションに関する情報を記憶する。トラン情報記憶部５５ｅは、トラン情報記憶部５５ａと同様のデータ構造を有する。
【０１００】
データ管理部５５ｆは、クライアント装置３から要求電文を受信し、要求電文に応じた処理を行って、クライアント装置３に応答電文を送信する。具体的には、トラン処理部５５ｂは、データ操作を要求する要求電文を受信すると、要求電文に含まれる情報に基づいてトラン情報記憶部５５ｅを更新し、クライアント装置３に応答電文を送信する。
【０１０１】
データ管理部５５ｆは、要求電文に前回の要求電文に関するトランＩＤ及びデータＩＤが含まれる場合には、トラン情報記憶部５５ｅが記憶する前回の要求電文に関する情報を更新する。すなわち、データ管理部５５ｆは、トラン情報記憶部５５ｅが記憶する前回の要求電文に関する情報において、トランＩＤが空白である場合には、トランＩＤを追記し、データＩＤが空白である場合には、データＩＤを追記する。
【０１０２】
また、データ管理部５５ｆは、クライアント装置３からコミットを要求する要求電文を受信すると、トラン情報記憶部５５ｅが記憶する情報をデータ記憶部５ｂに反映させるコミット処理を行う。コミット処理を行ったトランザクションに関して、データ管理部５５ｆは、トラン情報記憶部５５ｅが記憶する情報を消さずに保持する。そして、データ管理部５５ｆは、同じクライアント装置３から次の要求電文を受信すると、コミット処理を行ったトランザクションに関して、トラン情報記憶部５５ｅが記憶する情報を消す。
【０１０３】
また、データ管理部５５ｆは、コミット要求のミラーリングフラグがＯＮである場合には、コミット処理を行うことなく現用サーバからの指示を待つ。そして、現用サーバからミラーリング指示を受信すると、データ管理部５５ｆは、現用サーバから送信された情報に基づいてコミット処理を行う。
【０１０４】
また、データ管理部５５ｆは、クライアント装置３からの要求電文により処理するデータと同一の可能性があるデータをトラン情報記憶部５５ｅが記憶しているか否かをインデックスキー値又はデータを比較することにより判定する。そして、同一の可能性があるデータをトラン情報記憶部５５ｅが記憶している場合には、データ管理部５５ｆは、同一の可能性があるデータに対応する仮トランＩＤを付加してクライアント装置３に応答する。
【０１０５】
クライアント装置３は、クライアント装置３を制御するクライアント制御部６とアプリケーション７を有する。クライアント制御部６は、図１０に示したクライアント制御プログラム６ａがＣＰＵ３１により実行されることで実現される。アプリケーション７は、図１０に示したアプリケーションプログラム７ａがＣＰＵ３１により実行されることでクライアント装置３上で実現される。
【０１０６】
クライアント制御部６１は、処理制御部６１と通信制御部６２とを有する。処理制御部６１は、トランザクションに関する処理を制御する。通信制御部６２は、通信インタフェース３７を用いてサーバ装置２との通信を制御する。
【０１０７】
処理制御部６１は、待機応答記憶部６５と、データＩＤ記憶部６６と、仮トランＩＤ生成部６７と、要求送信部６８と、応答受信部６９とを有する。
【０１０８】
待機応答記憶部６５は、待機サーバの応答状態に関する情報を記憶する。図１４Ａ及び図１４Ｂは、それぞれ待機応答記憶部６５の一例を示す図である。図１４Ａは、待機サーバが１台の場合を示し、図１４Ｂは、待機サーバが２台の場合を示す。
【０１０９】
図１４Ａ及び１４Ｂに示すように、待機応答記憶部６５は、トランＩＤとＮｏと待機サーバＮｏ＃１とを要求電文毎に記憶する。待機サーバが２台の場合には、待機応答記憶部６５は、さらに待機サーバＮｏ＃２を記憶する。
【０１１０】
待機サーバＮｏ＃１及び待機サーバＮｏ＃２は、クライアント装置３により応答が受信された待機サーバを識別する番号である。応答を受信していない場合には、待機サーバＮｏ＃１及び待機サーバＮｏ＃２は、空白である。例えば、図１４Ａでは、トランＩＤが「０１０００００１」であり、Ｎｏが「１」である要求電文については、待機サーバＮｏ＃１が「１」であるクライアント装置３から応答が来ている。
【０１１１】
データＩＤ記憶部６６は、データＩＤ及び関連する情報を記憶する。図１５は、データＩＤ記憶部６６の一例を示す図である。図１５に示すように、データＩＤ記憶部６６は、トランＩＤと、仮トランＩＤと、Ｎｏと、データＩＤとを対応付けて記憶する。例えば、トランＩＤが「０１０００００１」であり、仮トランＩＤが「ｘｘｘ．ｘｘｘ．ｘｘｘ．１０１−１２３４５−６７８９０−２０１」であり、Ｎｏが「１」である要求電文のデータの識別子は「０００００１０１」である。
【０１１２】
仮トランＩＤ生成部６７は、仮トランＩＤを生成する。図１６は、仮トランＩＤの例を示す図である。図２に示したように、仮トランＩＤは、ＩＰアドレスとプロセスＩＤとスレッドＩＤと通番とから構成される。図１６に示すように、ＩＰアドレスが「ｘｘｘ．ｘｘｘ．ｘｘｘ．１０１」であり、プロセスＩＤが「１２３４５」であり、スレッドＩＤが「６７８９０」であり、通番が「２０１」である場合には、仮トランＩＤは、それらを「−」で結合した値である。すなわち、仮トランＩＤは、「ｘｘｘ．ｘｘｘ．ｘｘｘ．１０１−１２３４５−６７８９０−２０１」である。
【０１１３】
要求送信部６８は、要求電文を作成し、現用サーバと待機サーバへ送信する。具体的には、要求送信部６８は、トランザクションの最初の要求電文を送信する時に、仮トランＩＤ生成部６７に仮トランＩＤの生成を指示し、待機応答記憶部６５及びデータＩＤ記憶部６６に通番とともに書き込む。そして、要求送信部６８は、要求電文に仮トランＩＤを加え、現用サーバと待機サーバへ送信する。
【０１１４】
また、要求送信部６８は、２回目以降に要求電文を送信する場合には、データＩＤ記憶部６６を参照し、現用サーバから１つ前の要求電文に対する応答電文で送信されたトランＩＤとデータＩＤを要求電文に追加して現用サーバと待機サーバへ送信する。
【０１１５】
また、要求送信部６８は、コミットの要求電文を送信する場合には、待機応答記憶部６５を確認する。そして、要求送信部６８は、全ての待機サーバから応答を受信している場合には、ミラーリングコミットフラグを「０」に設定し、応答を受信していない待機サーバがある場合には、ミラーリングコミットフラグを「１」に設定する。そして、要求送信部６８は、現用サーバから１つ前の要求電文に対する応答電文で送信されたトランＩＤとデータＩＤを要求電文に追加して現用サーバと待機サーバへ送信する。
【０１１６】
応答受信部６９は、サーバ装置２から送信された応答電文を受信して処理する。応答受信部６９は、現用応答処理部６９ａと待機応答処理部６９ｂとを有する。現用応答処理部６９ａは、現用サーバから送信された応答電文を受信して処理する。待機応答処理部６９ｂは、待機サーバから送信された応答電文を受信して処理する。
【０１１７】
具体的には、現用応答処理部６９ａは、現用サーバからデータ操作に対する応答電文を受信すると、応答電文に含まれるトランＩＤとデータＩＤを仮トランＩＤに対応付けてデータＩＤ記憶部６６に格納する。また、現用応答処理部６９ａは、現用サーバからトランＩＤを最初に受信した場合には、待機応答記憶部６５の仮トランＩＤをトランＩＤで書き換える。
【０１１８】
また、現用応答処理部６９ａは、データ操作に対する応答電文を一定時間現用サーバから受信できない場合には、データ操作の要求電文を再送する。一定回数再送しても現用サーバから応答がない場合には、現用応答処理部６９ａは、処理をロールバックし、エラー復帰する。
【０１１９】
また、現用応答処理部６９ａは、要求電文に対する応答電文に他のクライアント装置３による先行トランの情報が含まれている場合には、待機応答処理部６９ｂに先行トランの情報を通知する。
【０１２０】
待機応答処理部６９ｂは、待機サーバから応答を受信すると、応答を送信した待機サーバの識別子を待機応答記憶部６５のサーバＮｏに追記する。また、待機応答処理部６９ｂは、待機サーバから応答を受信すると、データＩＤ記憶部６６から１つ前の通番の情報を削除する。
【０１２１】
また、待機応答処理部６９ｂは、応答に他のクライアント装置３による先行トランの情報が含まれている場合には、現用応答処理部６９ａから通知された先行トラン情報に含まれる仮トランＩＤと応答に含まれる仮トランＩＤが一致するか否かを判定する。そして、一致した場合には、待機応答処理部６９ｂは、現用サーバと待機サーバにロールバックを指示し、アプリケーション７にリトライを要求する。
【０１２２】
次に、電文の例について図１７〜図２０を用いて説明する。図１７は、要求電文（データ操作）の例を示す図である。図１７に示すように、要求電文（データ操作）には、制御情報、データ、仮トランＩＤ、トランＩＤ、Ｎｏ及びデータＩＤが含まれる。
【０１２３】
制御情報は、データ操作が追加、更新、削除のいずれであるかを示す。データは、操作対象のデータである。制御情報とデータがデータ操作の要求情報である。トランＩＤ、Ｎｏ及びデータＩＤは、以前処理したデータの管理情報である。なお、図１Ａ〜図７Ｃでは、制御情報は省略されている。
【０１２４】
図１８は、応答電文（データ操作）の例を示す図である。図１８（ａ）は、直前でコミットされたトランザクションがない場合を示し、図１８（ｂ）は、直前でコミットされたトランザクションが１つある場合を示し、図１８（ｃ）は、直前でコミットされたトランザクションが２つある場合を示す。
【０１２５】
図１８に示すように、応答電文（データ操作）には、制御情報、トランＩＤ、データＩＤ及びＰＲＥＶ−ＴＩＤ数が含まれる。また、応答電文（データ操作）には、直前でコミットされたトランザクションが１つある場合には、ＰＲＥＶ仮トランＩＤ＃１が含まれ、２つある場合には、ＰＲＥＶ仮トランＩＤ＃１及びＰＲＥＶ仮トランＩＤ＃２が含まれる。
【０１２６】
図１８において、トランＩＤとデータＩＤは今回処理したデータの管理情報である。ＰＲＥＶ−ＴＩＤ数は、直前でコミットされたトランザクションの数であり、図１８（ａ）では「０」であり、図１８（ｂ）では「１」であり、図１８（ｃ）では「２」である。ＰＲＥＶ仮トランＩＤ＃１及びＰＲＥＶ仮トランＩＤ＃２は、直前でコミットされたトランザクションの仮トランＩＤである。
【０１２７】
図１９は、要求電文（コミット）の例を示す図である。図１９（ａ）は、ミラーリングコミットフラグがＯＦＦ（０）である場合を示し、図１９（ｂ）は、ミラーリングコミットフラグがＯＮ（１）である場合を示す。図１９に示すように、要求電文（コミット）には、制御情報、ミラーリングコミットフラグ、仮トランＩＤ、トランＩＤ、Ｎｏ及びデータＩＤが含まれる。
【０１２８】
制御情報とミラーリングコミットフラグはコミットの要求情報であり、トランＩＤとＮｏとデータＩＤは、以前処理したデータの管理情報である。なお、ミラーリングする場合には、ＮｏとデータＩＤは不要である。
【０１２９】
図２０は、応答電文（コミット）の例を示す図である。図２０に示すように、応答電文（コミット）には、制御情報とトランＩＤが含まれる。トランＩＤは、今回処理したデータの管理情報である。
【０１３０】
次に、情報処理システム１の処理の全体フローについて説明する。なお、以下では、クライアント＃１を１台のクライアント装置３の例とし、クライアント＃１及びクライアント＃２を２台のクライアント装置３の例として説明する。
【０１３１】
図２１Ａは、全体フローを示す第１の図である。図２１Ａに示すように、クライアント＃１のクライアント制御部６は、仮トランＩＤを作成し（ｔ４１）、データ操作依頼＃１を現用サーバと待機サーバに送信する（ｔ４２）。なお、現用サーバと待機サーバへのデータ送信は、マルチキャスト通信等の一斉通信でもよい。
【０１３２】
そして、現用サーバのサーバ制御部５は、トランザクション処理を行い、トランＩＤ、データＩＤを決定する（ｔ４３）。一方、待機サーバのサーバ制御部５は、トラン情報を記憶する（ｔ４４）。ここで、トラン情報とは、トラン情報記憶部５５ｅが要求電文毎に記憶する情報である。ただし、この時点では、トランＩＤ、データＩＤは未確定である。
【０１３３】
そして、クライアント制御部６は、現用サーバからの応答電文を受信すると、データＩＤ記憶部６６に１回目のトランＩＤ、データＩＤを記憶する（ｔ４５）。また、クライアント制御部６は、待機サーバからの応答を受信すると、待機応答記憶部６５に待機サーバの応答結果を記憶する（ｔ４６）。ｔ４１〜ｔ４６の処理は、１回目のデータ操作に対応する処理である。
【０１３４】
そして、クライアント制御部６は、データ操作依頼＃２を現用サーバと待機サーバに送信する（ｔ４７）。この時、クライアント制御部６は、１回目のトランＩＤ、データＩＤを付加する。そして、現用サーバのサーバ制御部５は、トランザクション処理を行う（ｔ４８）。一方、待機サーバのサーバ制御部５は、トラン情報を記憶する（ｔ４９）。この時、待機サーバのサーバ制御部５は、１回目のトランＩＤ、データＩＤを記録する。
【０１３５】
そして、クライアント制御部６は、現用サーバからの応答電文を受信すると、データＩＤ記憶部６６に２回目のデータＩＤを記憶する（ｔ５０）。また、クライアント制御部６は、待機サーバからの応答を受信すると、待機応答記憶部６５に待機サーバの応答結果を記憶する（ｔ５１）。ｔ４７〜ｔ５１の処理は、２回目のデータ操作に対応する処理である。データ操作が繰り返された場合には、ｔ４７〜ｔ５１の処理が繰り返される。
【０１３６】
そして、クライアント制御部６は、コミット依頼を現用サーバと待機サーバに送信する（ｔ５２）。この時、クライアント制御部６は、２回目のデータＩＤを付加する。そして、クライアント制御部６は、現用サーバと待機サーバの両方から応答が来るのを待つ（ｔ５３）。
【０１３７】
現用サーバのサーバ制御部５は、コミット依頼を受信すると、コミット処理を行う（ｔ５４）。また、待機サーバのサーバ制御部５は、コミット依頼を受信すると、トラン情報を記憶する（ｔ５５）。この時、待機サーバのサーバ制御部５は、２回目のデータＩＤを記録する。そして、待機サーバのサーバ制御部５は、コミット処理を行う（ｔ５６）。ｔ５２〜ｔ５６の処理は、コミット処理である。
【０１３８】
図２１Ｂは、全体フローを示す第２の図である。図２１Ｂは、図２１Ａと比較して、電文を示す一方でクライアント＃１がデータを記憶する処理を省略している。図２１Ｂにおいて、仮ＴＩＤは仮トランＩＤであり、ＴＩＤはトランＩＤである。また、ＭＲＲは、ミラーリングコミットフラグである。
【０１３９】
図２１Ｂでは、初回のデータ操作に対応する処理をフェーズ＃１とし、２回目以降のデータ操作に対応する処理をフェーズ＃２とし、コミット処理をフェーズ＃３としている。以下の図２２〜図３０は、クライアント＃１、現用サーバ及び待機サーバの処理のフローをフェーズ毎に示す。
【０１４０】
図２２は、クライアント＃１による初回のデータ操作処理（フェーズ＃１）のフローを示すフローチャートである。図２２に示すように、クライアント＃１は、仮トランＩＤ（仮ＴＩＤ＃１）を作成し（ステップＳ１）、仮トランＩＤ（仮ＴＩＤ＃１）とデータ＃１を要求電文に設定する（ステップＳ２）。
【０１４１】
そして、クライアント＃１は、要求電文を現用サーバと待機サーバに送信する（ステップＳ３）。その後、クライアント＃１は、応答電文を受信する（ステップＳ４）と、応答電文の送信元は現用サーバであるか待機サーバであるかを判定する（ステップＳ５）。そして、現用サーバである場合には、クライアント＃１は、ＴＩＤ（ＴＩＤ＃１）とデータＩＤ（データＩＤ＃１）をデータＩＤ記憶部６６に格納し、仮トランＩＤと紐づける（ステップＳ６）。
【０１４２】
一方、応答電文の送信元が待機サーバである場合には、クライアント＃１は、待機応答記憶部６５に送信元の識別番号を格納し（ステップＳ７）、現用サーバの応答を受信済みか否かを判定する（ステップＳ８）。そして、クライアント＃１は、現用サーバの応答を受信済みである場合には、フェーズ＃１の処理を終了し、現用サーバの応答を受信済みでない場合には、ステップＳ４に戻る。
【０１４３】
図２３は、現用サーバによる初回のデータ操作処理（フェーズ＃１）のフローを示すフローチャートである。図２３に示すように、現用サーバは、クライアント＃１からの要求電文を受信する（ステップＳ１１）。そして、現用サーバは、仮トランＩＤに含まれるクライアント＃１の情報からクライアント＃１が前回コミットした情報（コミット状態「１」）をトラン情報記憶部５５ａから削除する（ステップＳ１２）。
【０１４４】
そして、現用サーバは、トランザクション処理を行い（ステップＳ１３）、トランザクション処理が成功か否かを判定する（ステップＳ１４）。ここで、トランザクション処理が成功か否かの判定は排他処理等の成功か否かにより行われる。そして、トランザクション処理が成功しなかった場合には、現用サーバは、ステップＳ１８に進む。
【０１４５】
一方、トランザクション処理が成功した場合には、現用サーバは、ＴＩＤ（ＴＩＤ＃１）及びデータＩＤ（データＩＤ＃１）を取得する（ステップＳ１５）。そして、現用サーバは、ＴＩＤ（ＴＩＤ＃１）、仮トランＩＤ、データＩＤ（データＩＤ＃１）及びデータをトラン情報記憶部５５ａに格納する（ステップＳ１６）。そして、現用サーバは、ＴＩＤ（ＴＩＤ＃１）とデータＩＤ（データＩＤ＃１）を応答電文に設定し（ステップＳ１７）、クライアント＃１に応答電文を返信する（ステップＳ１８）。
【０１４６】
図２４は、待機サーバによる初回のデータ操作処理（フェーズ＃１）のフローを示すフローチャートである。図２４に示すように、待機サーバは、クライアント＃１からの要求電文を受信する（ステップＳ２１）。そして、待機サーバは、仮トランＩＤに含まれるクライアント＃１の情報からクライアント＃１が前回コミットした情報（コミット状態「１」）をトラン情報記憶部５５ｅから削除する（ステップＳ２２）。
【０１４７】
そして、待機サーバは、仮トランＩＤ（仮ＴＩＤ＃１）とデータをトラン情報記憶部５５ｅに格納する（ステップＳ２３）。そして、待機サーバは、仮ＴＩＤ（仮ＴＩＤ＃１）を応答電文に設定し（ステップＳ２４）、クライアント＃１に応答電文を返信する（ステップＳ２５）。
【０１４８】
図２５は、クライアント＃１による２回目以降のデータ操作処理（フェーズ＃２）のフローを示すフローチャートである。図２５に示すように、クライアント＃１は、仮トランＩＤ（仮ＴＩＤ＃１）とデータ＃２を要求電文に設定する（ステップＳ３１）。そして、クライアント＃１は、データＩＤ記憶部６６に格納されている前回処理分のデータＩＤ（データＩＤ＃１）とトランＩＤ（ＴＩＤ＃１）を要求電文に設定する（ステップＳ３２）。
【０１４９】
そして、クライアント＃１は、要求電文を現用サーバと待機サーバに送信する（ステップＳ３３）。その後、クライアント＃１は、応答電文を受信する（ステップＳ３４）と、応答電文の送信元は現用サーバであるか待機サーバであるかを判定する（ステップＳ３５）。そして、現用サーバである場合には、クライアント＃１は、ＴＩＤ（ＴＩＤ＃１）とデータＩＤ（データＩＤ＃２）をデータＩＤ記憶部６６に格納し、仮トランＩＤと紐づける（ステップＳ３６）。
【０１５０】
一方、応答電文の送信元が待機サーバである場合には、クライアント＃１は、待機応答記憶部６５に送信元の識別番号を格納し（ステップＳ３７）、現用サーバの応答を受信済みか否かを判定する（ステップＳ３８）。そして、クライアント＃１は、現用サーバの応答を受信済みである場合には、フェーズ＃１の処理を終了し、現用サーバの応答を受信済みでない場合には、ステップＳ３４に戻る。
【０１５１】
このように、クライアント＃１は、待機サーバの応答を待たず（送達確認やリトライ制御を実施せず）に、現用サーバからの応答があった時点で、処理を先に進めるので、処理を高速化することができる。なお、クライアント＃１は、コミット依頼までに待機サーバの応答がなければ、ミラーリングコミットフラグを「１」にしてコミット依頼を送信する（通常の処理では、ミラーリングコミットフラグは「０」）ことで、待機サーバの応答確認を非同期で実現している。なお、クライアント＃１は、待機サーバに対しても、同期型で待合わせても良い。
【０１５２】
図２６は、現用サーバによる２回目以降のデータ操作処理（フェーズ＃２）のフローを示すフローチャートである。図２６に示すように、現用サーバは、クライアント＃１からの要求電文を受信する（ステップＳ４１）。そして、現用サーバは、トランザクション処理を行い（ステップＳ４２）、トランザクション処理が成功か否かを判定する（ステップＳ４３）。そして、トランザクション処理が成功しなかった場合には、現用サーバは、ステップＳ４７に進む。
【０１５３】
一方、トランザクション処理が成功した場合には、現用サーバは、ＴＩＤ（ＴＩＤ＃１）及びデータＩＤ（データＩＤ＃２）を取得する（ステップＳ４４）。そして、現用サーバは、ＴＩＤ（ＴＩＤ＃１）、仮トランＩＤ、データＩＤ（データＩＤ＃２）及びデータをトラン情報記憶部５５ａに格納する（ステップＳ４５）。そして、現用サーバは、ＴＩＤ（ＴＩＤ＃１）とデータＩＤ（データＩＤ＃２）を応答電文に設定し（ステップＳ４６）、クライアント＃１に応答電文を返信する（ステップＳ４７）。
【０１５４】
図２７は、待機サーバによる２回目以降のデータ操作処理（フェーズ＃２）のフローを示すフローチャートである。図２７に示すように、待機サーバは、クライアント＃１からの要求電文を受信する（ステップＳ５１）。そして、待機サーバは、仮トランＩＤ（仮ＴＩＤ＃１）とデータ（データ＃２）をトラン情報記憶部５５ｅに格納する（ステップＳ５２）。
【０１５５】
そして、待機サーバは、仮トランＩＤを基に、前回処理分のＴＩＤ（ＴＩＤ＃１）とデータＩＤ（データＩＤ＃１）をトラン情報記憶部５５ｅに格納する（ステップＳ５３）。
そして、待機サーバは、仮ＴＩＤ（仮ＴＩＤ＃１）を応答電文に設定し（ステップＳ５４）、クライアント＃１に応答電文を返信する（ステップＳ５５）。
【０１５６】
図２８は、クライアント＃１によるコミット処理（フェーズ＃３）のフローを示すフローチャートである。図２８に示すように、クライアント＃１は、待機応答記憶部６５を確認し、全ての待機サーバから応答を受信したか否かを判定する（ステップＳ６１）。そして、クライアント＃１は、全ての待機サーバから応答を受信していれば、ミラーリングコミットフラグを「０」に設定し（ステップＳ６２）、応答を受信していない待機サーバがあれば、ミラーリングコミットフラグを「１」に設定する（ステップＳ６３）。
【０１５７】
そして、クライアント＃１は、データＩＤ記憶部６６に格納されている前回処理分のデータＩＤ（データＩＤ＃２）とトランＩＤ（ＴＩＤ＃１）を要求電文に設定する（ステップＳ６４）。そして、クライアント＃１は、仮トランＩＤを要求電文に設定する（ステップＳ６５）。
【０１５８】
そして、クライアント＃１は、要求電文を現用サーバと待機サーバに送信する（ステップＳ６６）。その後、クライアント＃１は、現用サーバと待機サーバの両方の応答電文を受信する（ステップＳ６７）。
【０１５９】
図２９は、現用サーバによるコミット処理（フェーズ＃３）のフローを示すフローチャートである。図２９に示すように、現用サーバは、クライアント＃１からの要求電文を受信し（ステップＳ７１）、指定されたＴＩＤ（ＴＩＤ＃１）を持つデータとデータＩＤをトラン情報記憶部５５ａからデータ記憶部５ｂにコミットする（ステップＳ７２）。
【０１６０】
そして、現用サーバは、要求電文のミラーリングコミットフラグが「０」であるか否かを判定し（ステップＳ７３）、「０」である場合には、ステップＳ７６へ進む。一方、「０」でない場合には、現用サーバは、コミット対象の全てのデータを全ての待機サーバに送信する（ミラーリング）（ステップＳ７４）。そして、現用サーバは、全ての待機サーバからコミット完了の応答が来るのを待つ（ステップＳ７５）。
【０１６１】
そして、現用サーバは、トラン情報記憶部５５ａのＴＩＤ＃１のコミット状態をコミット済み「１」に変更し（ステップＳ７６）、トランザクションを終了する（ステップＳ７７）。トランザクションの終了処理には排他解除等が含まれる。そして、現用サーバは、コミットしたトランザクションのＴＩＤ（ＴＩＤ＃１）を応答電文に設定し（ステップＳ７８）、クライアント＃１に応答電文を返信する（ステップＳ７９）。
【０１６２】
図３０は、待機サーバによるコミット処理（フェーズ＃３）のフローを示すフローチャートである。図３０に示すように、待機サーバは、要求電文を受信し（ステップＳ８１）、コミット要求電文の送信元はクライアント＃１であるか現用サーバであるかを判定する（ステップＳ８２）。
【０１６３】
そして、待機サーバは、コミット要求電文の送信元がクライアント＃１である場合には、前回処理分のＴＩＤ（ＴＩＤ＃１）とデータＩＤ（データＩＤ＃２）をトラン情報記憶部５５ｅに格納する（ステップＳ８３）。そして、待機サーバは、要求電文のミラーリングコミットフラグが「０」であるか否かを判定し（ステップＳ８４）、「０」でない場合には処理を終了する。
【０１６４】
一方、ミラーリングコミットフラグが「０」である場合には、待機サーバは、指定されたＴＩＤ（ＴＩＤ＃１）を持つデータとデータＩＤをトラン情報記憶部５５ｅからデータ記憶部５ｂにコミットする（ステップＳ８５）。
【０１６５】
そして、待機サーバは、トラン情報記憶部５５ｅのＴＩＤ＃１のコミット状態をコミット済み「１」に変更する（ステップＳ８６）。そして、待機サーバは、コミットしたトランザクションの仮ＴＩＤ（仮ＴＩＤ＃１）を応答電文に設定し（ステップＳ８７）、クライアント＃１に応答電文を返信する（ステップＳ８８）。
【０１６６】
一方、コミット要求電文の送信元が現用サーバである場合には、待機サーバは、現用サーバから、コミット対象のデータを全て受信する（ステップＳ８９）。すなわち、待機サーバは、現用サーバからミラーリングに用いるデータを受信する。そして、待機サーバは、受信したデータをデータ記憶部５ｂにコミットする（ステップＳ９０）。そして、待機サーバは、トラン情報記憶部５５ｅのＴＩＤ＃１のコミット状態をコミット済み「１」に変更し（ステップＳ９１）、現用サーバにコミット完了を応答する（ステップＳ９２）。
【０１６７】
このように、待機サーバに対して、コミット要求電文（コミット指示）を出すのは、現用サーバとクライアント＃１の２種類がある。クライアント＃１から直接コミット指示を出すか、現用サーバからコミット指示を出すかは、クライアント＃１で決定する（コミット要求電文のミラーリングコミットフラグで切り分ける）。クライアント＃１から直接コミット指示が来た場合は、待機サーバに対するトランザクション処理のすべての要求電文及び応答電文を確認できている状態なので、待機サーバは、自身で保有するトラン情報記憶部５５ｅの情報を基に、コミット処理を行う。
【０１６８】
次に、クライアント＃１と現用サーバ又は待機サーバとの間で通信異常（パケットロス等）が発生した場合の処理のフローについて図３１〜図３４を用いて説明する。図３１は、データ操作依頼時にクライアント＃１と現用サーバとの間の通信経路で異常が発生した場合を示し、図３２は、データ操作依頼時にクライアント＃１と待機サーバとの間の通信経路で異常が発生した場合を示す。図３３は、コミット依頼時にクライアント＃１と現用サーバとの間の通信経路で異常が発生した場合を示し、図３４は、コミット依頼時にクライアント＃１と待機サーバとの間の通信経路で異常が発生した場合を示す。
【０１６９】
図３１は、データ操作依頼に対して現用サーバから応答がない場合のフローを示す図である。図３１に示すように、クライアント＃１は、仮ＴＩＤ＃１を作成し（ｔ６１）、データ操作依頼を現用サーバと待機サーバに送信する（ｔ６２）。そして、クライアント＃１と現用サーバとの間で通信異常が発生する。
【０１７０】
データ操作依頼を受信した待機サーバは、トラン情報を記憶し（ｔ６３）、クライアント＃１に応答する。ここで、トラン情報は、データ＃１と仮ＴＩＤ＃１である。一方、クライアント＃１と現用サーバとの間の通信異常のため、現用サーバからの応答がないので、クライアント＃１は、データ操作依頼を現用サーバに送信する（ｔ６４）。
【０１７１】
そして、データ操作依頼を受信した現用サーバは、トランザクション処理を実施し（ｔ６５）、ＴＩＤ＃１とデータＩＤ＃１を含む応答電文をクライアント＃１に送信する。このように、データ操作依頼時にクライアント＃１と現用サーバとの間で通信異常が発生した場合には、クライアント＃１は、リトライを行うことで、一時的な通信異常に対応することができる。
【０１７２】
図３２は、データ操作依頼に対して待機サーバから応答がない場合のフローを示す図である。図３２に示すように、クライアント＃１は、仮ＴＩＤ＃１を作成し（ｔ７１）、データ操作依頼を現用サーバと待機サーバに送信する（ｔ７２）。そして、クライアント＃１と待機サーバとの間で通信異常が発生する。
【０１７３】
データ操作依頼を受信した現用サーバは、トランザクション処理を実施し（ｔ７３）、ＴＩＤ＃１とデータＩＤ＃１を含む応答電文をクライアント＃１に送信する。クライアント＃１は、現用サーバからの応答を受信し（ｔ７４）、データＩＤ記憶部６６にて、データ＃１とＴＩＤ＃１を対応付ける。
【０１７４】
そして、クライアント＃１は、コミット依頼を現用サーバと待機サーバに送信する（ｔ７５）。この時、クライアント＃１は、ＭＲＲを「１」に設定する。そして、現用サーバは、コミット処理を行い（ｔ７６）、データのミラーリングを行う。ミラーリング指示を受信した待機サーバは、現用サーバから送信されたコミットデータを反映する（ｔ７７）。
【０１７５】
このように、データ操作依頼時にクライアント＃１と待機サーバとの間で通信異常が発生した場合には、クライアント＃１は、ＭＲＲを「１」に設定することで、現用サーバにミラーリングを指示することができる。
【０１７６】
図３３は、コミット依頼に対して現用サーバから応答がない場合のフローを示す図である。図３３に示すように、クライアント＃１は、仮ＴＩＤ＃１を作成し（ｔ８１）、データ操作依頼を現用サーバと待機サーバに送信する（ｔ８２）。
【０１７７】
データ操作依頼を受信した現用サーバは、トランザクション処理を実施し（ｔ８３）、ＴＩＤ＃１とデータＩＤ＃１を含む応答電文をクライアント＃１に送信する。また、データ操作依頼を受信した待機サーバは、トラン情報を記憶し（ｔ８４）、仮ＴＩＤ＃１を含む応答電文をクライアント＃１に送信する。
【０１７８】
クライアント＃１は、現用サーバと待機サーバからの応答を受信し、コミット依頼を現用サーバと待機サーバに送信する（ｔ８５）。この時、クライアント＃１は、ＭＲＲを「０」に設定する。そして、クライアント＃１と現用サーバとの間で通信異常が発生し、現用サーバはコミット依頼を受信できない。一方、待機サーバは、コミット処理を行い（ｔ８６）、応答をクライアント＃１に返す。
【０１７９】
クライアント＃１は、再度コミット依頼を現用サーバに送信する（ｔ８７）。そして、現用サーバは、コミット処理を行い（ｔ８８）、応答をクライアント＃１に返す。
【０１８０】
このように、コミット依頼時にクライアント＃１と現用サーバとの間で通信異常が発生した場合には、クライアント＃１は、リトライを行うことで、一時的な通信異常に対応することができる。
【０１８１】
図３４は、コミット依頼に対して待機サーバから応答がない場合のフローを示す図である。図３４に示すように、クライアント＃１は、仮ＴＩＤ＃１を作成し（ｔ９１）、データ操作依頼を現用サーバと待機サーバに送信する（ｔ９２）。
【０１８２】
データ操作依頼を受信した現用サーバは、トランザクション処理を実施し（ｔ９３）、ＴＩＤ＃１とデータＩＤ＃１を含む応答電文をクライアント＃１に送信する。また、データ操作依頼を受信した待機サーバは、トラン情報を記憶し（ｔ９４）、仮ＴＩＤ＃１を含む応答電文をクライアント＃１に送信する。
【０１８３】
クライアント＃１は、現用サーバと待機サーバからの応答を受信し、コミット依頼を現用サーバと待機サーバに送信する（ｔ９５）。この時、クライアント＃１は、ＭＲＲを「０」に設定する。そして、クライアント＃１と待機サーバとの間で通信異常が発生し、待機サーバはコミット依頼を受信できない。一方、現用サーバは、コミット処理を行い（ｔ９６）、応答をクライアント＃１に返す。
【０１８４】
クライアント＃１は、再度コミット依頼を待機サーバに送信する（ｔ９７）。そして、待機サーバは、コミット処理を行い（ｔ９８）、応答をクライアント＃１に返す。
【０１８５】
このように、コミット依頼時にクライアント＃１と待機サーバとの間で通信異常が発生した場合には、クライアント＃１は、リトライを行うことで、一時的な通信異常に対応することができる。
【０１８６】
次に、図３４において、クライアント＃１が待機サーバに対してコミット依頼をリトライしているタイミングで、クライアント＃２が、クライアント＃１と同じデータを操作した場合の処理の流れについて図３５〜図３８を用いて説明する。クライアント＃１とクライアント＃２で操作するデータが同一であるかどうかは、現用サーバで採番するデータＩＤでのみ判定できる。クライアント＃２は、現用サーバ及び待機サーバから応答された仮トランＩＤを比較することで、クライアント＃１がコミット中（コミット依頼のリトライ中）であることを検知できる。
【０１８７】
図３５は、コミット操作依頼に対して待機サーバからの応答がなく、リトライ中に他アプリで同一データを操作した場合のフローを示す図である。図３５に示すように、クライアント＃１は、仮ＴＩＤ＃１を作成し（ｔ１０１）、データ操作依頼を現用サーバと待機サーバに送信する（ｔ１０２）。
【０１８８】
データ操作依頼でクライアント＃１は、インデックスキー値が「ＩＸ＃１」のデータを「１１」に更新する。現用サーバは、データ操作依頼を受信すると、ＴＩＤ＃１でデータＩＤ＃１のデータをロックする。なお、現用サーバのＴ−ＩＮＦＯはトラン情報記憶部５５ａを示し、待機サーバのＴ−ＩＮＦＯはトラン情報記憶部５５ｅを示す。
【０１８９】
クライアント＃１は、現用サーバと待機サーバからの応答を受信すると、コミット依頼を現用サーバと待機サーバに送信する（ｔ１０３）。そして、クライアント＃１と待機サーバとの間で通信異常が発生し、待機サーバはコミット依頼を受信できない。一方、現用サーバは、コミット処理を行い、応答をクライアント＃１に返す。この時、現用サーバは、ＴＩＤ＃１で獲得していたデータＩＤ＃１のロックを解放する。
【０１９０】
一方、クライアント＃２は、仮ＴＩＤ＃２を作成し（ｔ１０４）、データ操作依頼を現用サーバと待機サーバに送信する（ｔ１０５）。データ操作依頼でクライアント＃２は、インデックスキー値が「ＩＸ＃１」のデータを「２２」に更新する。
【０１９１】
現用サーバは、クライアント＃２からデータ操作依頼を受信すると、トラン情報記憶部５５ａの情報に基づいて同一データの更新を検知し、クライアント＃２に先行トランの仮ＴＩＤを応答電文Ａで応答する（ｔ１０６）。この時、現用サーバは、ＴＩＤ＃１のトラン中だが、ＴＩＤ＃２でデータＩＤ＃１のデータをロックしてしまう。
【０１９２】
一方、待機サーバは、クライアント＃２からデータ操作依頼を受信すると、トラン情報記憶部５５ｅの情報に基づいて、インデックスキー値から同一データの重複更新を予測し、他トランの仮ＴＩＤを応答電文Ｓでクライアント＃２に応答する（ｔ１０７）。
【０１９３】
クライアント＃２は、応答電文Ａと応答電文Ｓを比較し、待機サーバで、先行トラン（ＴＩＤ＃１）がコミット中であることを検知し（ｔ１０８）、現用サーバと待機サーバにロールバック依頼を行う（ｔ１０９）。
【０１９４】
その後、クライアント＃１は、再度コミット依頼を待機サーバに送信し（ｔ１１０）、待機サーバがコミット依頼を受信してコミット処理を行うと、コミットが完了する。
【０１９５】
このように、クライアント＃２は、応答電文Ａと応答電文Ｓを比較することで、先行トランがコミット中であることを検知し、ロールバックを行うことができる。
【０１９６】
図３６は、クライアント＃２が先行トランをチェックする処理のフローを示すフローチャートである。図３６に示すように、クライアント＃２は、仮トランＩＤ（仮ＴＩＤ＃２）を生成し（ステップＳ１０１）、現用サーバと待機サーバにデータ操作依頼を送信する（ステップＳ１０２）。データ操作依頼には、仮ＴＩＤ＃２が付与されている。
【０１９７】
そして、クライアント＃２は、現用サーバからの応答（応答電文Ａ）を受信し（ステップＳ１０３）、待機サーバからの応答（応答電文Ｓ）を受信する（ステップＳ１０４）。そして、クライアント＃２は、応答電文Ｓと応答電文Ａの仮トランＩＤが一致しているかを判定する（ステップＳ１０５）。クライアント＃２は、この判定を応答電文Ｓに付与されている先行トランの数分繰り返す。
【０１９８】
そして、応答電文Ｓと応答電文Ａの仮トランＩＤが一致している場合には、クライアント＃２は、仮ＴＩＤ＃２で処理するデータに対して、別トランザクションがコミット中であることを検知する（ステップＳ１０６）。そして、クライアント＃２は、ロールバック依頼を現用サーバと待機サーバに送信する（ステップＳ１０７）。
【０１９９】
一方、応答電文Ｓと応答電文Ａの仮トランＩＤが一致していない場合には、クライアント＃２は、仮ＴＩＤ＃２のデータに対して、処理継続可能と判断する（ステップＳ１０８）。
【０２００】
図３７は、現用サーバがクライアント＃２からのデータ操作依頼を受けて先行トランをチェックする処理のフローを示すフローチャートである。図３７に示すように、現用サーバは、クライアント＃２からのデータ操作依頼を受信する（ステップＳ１１１）。そして、現用サーバは、トランザクション処理を行い、データＩＤ（データＩＤ＃１）等を取得する（ステップＳ１１２）。
【０２０１】
そして、現用サーバは、トランザクション処理が成功したか否かを判定し（ステップＳ１１３）、成功しなかった場合には、ステップＳ１１８に進む。一方、成功した場合には、現用サーバは、ＴＩＤ（ＴＩＤ＃２）等を応答電文Ａに設定し（ステップＳ１１４）、ステップＳ１１５〜ステップＳ１１７の処理をトラン情報記憶部５５ａのエントリ数分繰り返す。
【０２０２】
現用サーバは、各エントリについて、データＩＤ＃１に対するトラン情報か否かを判定し（ステップＳ１１５）、データＩＤ＃１に対するトラン情報でない場合には、次のエントリに進む。一方、データＩＤ＃１に対するトラン情報である場合には、現用サーバは、先行トラン数をカウントアップし（ステップＳ１１６）、先行トランの仮ＴＩＤを応答電文Ａに設定する（ステップＳ１１７）。ここで、先行トラン数は、図１８に示したＰＲＥＶ−ＴＩＤ数である。
【０２０３】
そして、現用サーバは、クライアント＃２に応答電文Ａを返信する（ステップＳ１１８）。
【０２０４】
図３８は、待機サーバがクライアント＃２からのデータ操作依頼を受けて先行トランをチェックする処理のフローを示すフローチャートである。図３８に示すように、待機サーバは、クライアント＃２からの処理依頼を受信する（ステップＳ１２１）。そして、待機サーバは、トラン情報記憶部５５ｅに仮ＴＩＤ（仮ＴＩＤ＃２）を保存する（ステップＳ１２２）。
【０２０５】
そして、待機サーバは、仮ＴＩＤ（仮ＴＩＤ＃２）を応答電文Ｓに設定し（ステップＳ１２３）、ステップＳ１２４〜ステップＳ１２６の処理をトラン情報記憶部５５ｅのエントリ数分繰り返す。
【０２０６】
待機サーバは、各エントリについて、データ操作依頼に含まれるデータと同一インデックスキーを持つトラン情報か否かを判定し（ステップＳ１２４）、同一インデックスキーを持つトラン情報でない場合には、次のエントリに進む。一方、同一インデックスキーを持つトラン情報である場合には、待機サーバは、先行トラン数をカウントアップし（ステップＳ１２５）、先行トランの仮ＴＩＤを応答電文Ｓに設定する（ステップＳ１２６）。
【０２０７】
そして、待機サーバは、クライアント＃２に応答電文Ｓを返信する（ステップＳ１２７）。
【０２０８】
上述してきたように、実施例では、クライアント＃１の仮トランＩＤ生成部６７が仮トランＩＤを生成し、要求送信部６８が仮トランＩＤを付加して第１要求電文を現用サーバと待機サーバに送信する。第１要求電文を現用サーバが受信すると、現用サーバのトランＩＤ生成部５５ｃがトランＩＤを生成し、データＩＤ生成部５５ｄがデータＩＤを生成する。そして、トラン処理部５５ｂがトランＩＤとデータＩＤを付加した応答電文をクライアント＃１に返信する。そして、要求送信部６８は、トランＩＤとデータＩＤを付加して第２要求電文を現用サーバと待機サーバに送信する。第１要求電文と第２要求電文を受信した待機サーバのデータ管理部５５ｆが、仮トランＩＤとトランＩＤとデータＩＤを対応付けたトラン情報を管理する。そして、クライアント＃１からコミット要求を受信すると、データ管理部５５ｆはトラン情報に基づいてコミット処理を行う。
【０２０９】
したがって、情報処理システム１は、ミラーリングをすることなく、現用サーバと待機サーバの整合性を保つことができ、ミラーリングによるトランザクション性能の悪化を防ぐことができる。
【０２１０】
また、実施例では、クライアント＃１のデータＩＤ記憶部６６が、仮トランＩＤとトランＩＤとデータＩＤとを対応付けて記憶し、要求送信部６８は、データＩＤ記憶部６６を用いて第２要求電文を作成して送信する。また、現用サーバのトラン情報記憶部５５ａが、仮トランＩＤとトランＩＤとデータＩＤとを対応付けて記憶し、クライアント＃１からコミット要求を受信すると、トラン処理部５５ｂが、トラン情報記憶部５５ａを用いてコミット処理を行う。また、待機サーバのトラン情報記憶部５５ｅが、仮トランＩＤとトランＩＤとデータＩＤとを対応付けて記憶し、クライアント＃１からコミット要求を受信すると、データ管理部５５ｆが、トラン情報記憶部５５ｅを用いてコミット処理を行う。
【０２１１】
したがって、クライアント＃１、現用サーバ及び待機サーバは、仮トランＩＤとトランＩＤとデータＩＤとを対応づけることができる。
【０２１２】
また、実施例では、要求送信部６８は、データ操作要求に対する応答を待機サーバから受け取ることなくコミット要求を行う場合には、ミラーリングコミットフラグを「ＯＮ」にして現用サーバと待機サーバにコミットを指示する。そして、ミラーリングコミットフラグが「ＯＮ」である場合には、トラン処理部５５ｂは、ミラーリング用情報を待機サーバに送信し、データ管理部５５ｆは、現用サーバからミラーリング用情報を受信してコミット処理を行う。
【０２１３】
したがって、クライアント＃１と待機サーバの間で通信異常が発生した場合にも、情報処理システム１は、現用サーバと待機サーバの整合性を保つことができる。
【０２１４】
また、実施例では、トラン処理部５５ｂは、クライアント＃１からのトランをコミット処理した後にクライアント＃１からデータ操作要求を受信するとコミット処理を行ったトランに関してトラン情報記憶部５５ａの情報を消去する。一方、クライアント＃１からのトランのコミット処理後にクライアント＃２からデータＩＤが同じデータの操作要求を受信すると、トラン処理部５５ｂは、データＩＤが同じトランの仮ＴＩＤを付加して応答をクライアント＃２に送信する。また、データ管理部５５ｆは、クライアント＃１からのトランをコミット処理した後にクライアント＃１からデータ操作要求を受信するとコミット処理を行ったトランに関してトラン情報記憶部５５ｅの情報を消去する。一方、クライアント＃１からのトランのコミット処理前にクライアント＃２からデータＩＤが同じと推定されるデータの操作要求を受信すると、データ管理部５５ｆは、データＩＤが同じと推定されるトランの仮ＴＩＤを付加して応答をクライアント＃２に送信する。そして、クライアント＃２は、現用サーバからの応答に含まれる仮ＴＩＤと待機サーバからの応答に含まれると仮ＴＩＤが等しい場合には、現用サーバと待機サーバにロールバックを依頼する。
【０２１５】
したがって、クライアント＃１と待機サーバの間で通信異常が発生した場合にも、情報処理システム１は、現用サーバと待機サーバの整合性を保つことができる。
【０２１６】
なお、現用サーバと待機サーバで同一処理を行わせる場合はリソースが倍増する。そこで、本実施例では、待機サーバは、現用サーバでトランザクション順序制御及びデータ特定の結果として採番された情報（トランＩＤ、データＩＤ）を基にデータを管理するだけとする。したがって、待機サーバは、現用サーバほどのリソースは使用しないですむ。また、本実施例では、現用サーバでトランザクション順序制御及びデータ特定の結果として採番された情報（トランＩＤ、データＩＤ）を基に、クライアント・サーバ間でトランザクションの整合性や処理順序を保証できる。このため、トランザクションの整合性や処理順序保証のための振り分け用の装置は不要になる。
【０２１７】
また、複数サーバでそれぞれトランザクション処理を行った場合（例えば、現用サーバ、待機サーバそれぞれでトランザクション処理を行った場合）、冗長構成を含めた全てのサーバ装置２でトランザクションの処理順序を統一できないことがある。そこで、本実施例では、現用サーバ一箇所でトランザクションに関わる情報（トランＩＤ、データＩＤ）の採番及び処理順番の決定を行い、これらの情報をクライアント装置３との要求電文と応答電文を介して受け渡す。したがって、冗長構成を含めた全てのサーバ装置２で、トランザクションの一意性を保証することができる。
【０２１８】
また、クライアント装置３側で、現用サーバと待機サーバの両方の応答を待合わせると、処理のレスポンスが悪くなる。そこで、本実施例では、現用サーバの応答は同期方式で待合わせ、待機サーバの応答は非同期方式で待合わせるようにすることで、現用サーバで行っている業務処理のレスポンスを維持したまま、現用サーバ及び待機サーバの応答確認を行うことができる。
【符号の説明】
【０２１９】
１    情報処理システム
２    サーバ装置
３    クライアント装置
４    ネットワーク
４ａ    業務ＬＡＮ
４ｂ    同期ＬＡＮ
５    サーバ制御部
５ａ    サーバ制御プログラム
５ｂ    データ記憶部
６    クライアント制御部
６ａ    クライアント制御部プログラム
７    アプリケーション
７ａ    アプリケーションプログラム
１１，１３，１５，１７    要求電文
１２，１４，１６    応答電文
２１，３１    ＣＰＵ
２２，３２    メモリ
２３，３３    ＨＤＤ
２４，３４    画像信号処理部
２５，３５    入力信号処理部
２６，３６    磁気ディスクドライブ
２７，３７    通信インタフェース
２８，３８    バス
４１，４６    ディスプレイ
４２，４７    入力デバイス
４３，４８    磁気ディスク
５１    処理制御部
５１ａ    現用系処理制御部
５１ｂ    待機系処理制御部
５２    通信制御部
５５ａ    トラン情報記憶部
５５ｂ    トラン処理部
５５ｃ    トランＩＤ生成部
５５ｄ    データＩＤ生成部
５５ｅ    トラン情報記憶部
５５ｆ    データ管理部
６１    処理制御部
６２    通信制御部
６５    待機応答記憶部
６６    データＩＤ記憶部
６７    仮トランＩＤ生成部
６８    要求送信部
６９    応答受信部
６９ａ    現用応答処理部
６９ｂ    待機応答処理部
【図１Ａ】
2018014049.tif 000003
【図１Ｂ】
2018014049.tif 000004
【図１Ｃ】
2018014049.tif 000005
【図２】
2018014049.tif 000006
【図３】
2018014049.tif 000007
【図４】
2018014049.tif 000008
【図５Ａ】
2018014049.tif 000009
【図５Ｂ】
2018014049.tif 000010
【図６】
2018014049.tif 000011
【図７Ａ】
2018014049.tif 000012
【図７Ｂ】
2018014049.tif 000013
【図７Ｃ】
2018014049.tif 000014
【図８】
2018014049.tif 000015
【図９】
2018014049.tif 000016
【図１０】
2018014049.tif 000017
【図１１】
2018014049.tif 000018
【図１２】
2018014049.tif 000019
【図１３】
2018014049.tif 000020
【図１４Ａ】
2018014049.tif 000021
【図１４Ｂ】
2018014049.tif 000022
【図１５】
2018014049.tif 000023
【図１６】
2018014049.tif 000024
【図１７】
2018014049.tif 000025
【図１８】
2018014049.tif 000026
【図１９】
2018014049.tif 000027
【図２０】
2018014049.tif 000028
【図２１Ａ】
2018014049.tif 000029
【図２１Ｂ】
2018014049.tif 000030
【図２２】
2018014049.tif 000031
【図２３】
2018014049.tif 000032
【図２４】
2018014049.tif 000033
【図２５】
2018014049.tif 000034
【図２６】
2018014049.tif 000035
【図２７】
2018014049.tif 000036
【図２８】
2018014049.tif 000037
【図２９】
2018014049.tif 000038
【図３０】
2018014049.tif 000039
【図３１】
2018014049.tif 000040
【図３２】
2018014049.tif 000041
【図３３】
2018014049.tif 000042
【図３４】
2018014049.tif 000043
【図３５】
2018014049.tif 000044
【図３６】
2018014049.tif 000045
【図３７】
2018014049.tif 000046
【図３８】
2018014049.tif 000047
【図３９】
2018014049.tif 000048