以下、本実施形態について、図面を参照しながら詳細に説明する。
図1は、本実施形態に係る分散トランザクション処理の例を説明するシステム構成図である。図1を参照しながら、分散トランザクション処理が口座Aから口座Bに金銭を振り込む処理である場合の例について説明する。口座のデータを管理するシステム100は、例えば、銀行の口座のデータを保持するデータベース121を備えるDBサーバ120と、データベース121の更新処理をする複数のサーバ110(110a、110b)を備える。サーバ110とDBサーバ120とは、ネットワークで接続されている。DBサーバ120は、全サーバ110が参照可能なデータを記憶する記憶領域を保持する。DBサーバ120及びサーバ110は、サーバの数を限定するものではない。
サーバ110は、制御部111、要求部112、RPC(Remote Procedure Call)送信部113、RPC受信部114、処理部115、記憶部116を有する。制御部111は、データベース121のデータを更新する際に、他のプロセスとの競合を避けるために用いる同期プリミティブを制御する。また、制御部111に含まれる取得部117は、制御情報122の情報を取得する。要求部112は、DBサーバ120に、データベース121のデータの更新要求を出力する。
RPC送信部113とRPC受信部114は、サーバ111aとサーバ111b間で整合性を取るために実施されるサーバ間での呼び出し処理に用いられるメッセージ(RPC)の送受信を行う。一例として、RPCは、サーバ111bで実行される処理を、サーバ111a側からサーバ111bに要求する要求信号である。処理部115は、RPCより要求された処理を実行する。記憶部116は、制御部111、要求部112、RPC送信部113、RPC受信部114、処理部115で使用するデータを記憶する。
次に、DBサーバ120は、記憶部121と、処理部124を備える。処理部124は、サーバ110からの要求に応じた処理を実行する。記憶部121は、制御情報122とデータベース123を有する。制御情報122は、制御部111から送信されてきた同期プリミティブにより更新される制御情報であり、各サーバが、更新中のデータの状況をチェックするために用いられる。データベース123は、例えば、口座の残金などの情報を保持する。制御情報122は、各サーバ111から共通でアクセス可能な記憶領域に記憶されている。
口座Aから口座Bに金銭を振り込む分散トランザクション処理は、口座Aのデータから取引金額分を減算する減算要求と、口座Bのデータに取引金額分を加算する加算要求を、DBサーバ120に通知する不可分の処理である。
以下の(A1)〜(A14)に、本実施形態に係る障害がない場合の分散トランザクション処理を順に説明する。口座Aの減算処理と口座Bの加算処理の一連の不可分な処理では、まず、サーバ110a側から、分散トランザクション処理を開始するプログラムが起動される。
(A1)サーバ110aの制御部111aは、サーバ110aがサーバ110b側のRPC処理が開始されたことをチェックするために用いる情報であるチェックレコードをDBサーバ120に書き込む信号を、DBサーバ120に通知する。チェックレコードを書き込む信号は、プリミティブで実現される。チェックレコードを書き込む信号のプリミティブには、一例として、putIfAbsent命令が用いられる。putIfAbsent命令は、トランザクション処理が完了するまで、他のプロセスからはその途中データを観測できないようにする性質を持つ命令である。以降、putIfAbsent命令を用いたプリミティブを、プリミティブ(putIfAbsent)と記載する。
(A2)DBサーバ120の処理部124は、記憶部121に、サーバ110b側のRPC処理が開始されていないことを示す制御情報を記憶させる。制御情報には、サーバ110aからの要求処理であることを示す情報が含まれてもよい。
(A3)サーバ110aの要求部112aは、DBサーバ120に、口座Aのデータから取引金額分を減算させる減算要求を出す。
(A4)DBサーバ120の処理部123は、要求に応じて、口座Aのデータから取引金額分を減算させる処理を実行する。この時点で、サーバ110aは、口座Aのデータの更新をコミットしない。
(A5)口座Aの減算処理と口座Bの加算処理は、一連の不可分な処理である。そのため、サーバ110aのRPC送信部113aは、口座Aのデータをコミットする前に、口座Bのデータ更新をするサーバ110bにRPC信号を送信する。RPC信号は、口座Aからの減算分を口座Bに加算する処理を開始する要求である。サーバ110bのRPC受信部113bは、RPC信号を受信する。
(A6)サーバ110bは、トランザクション処理を開始する。サーバ110bの制御部111bは、サーバ110bがRPC処理を開始したことを示す信号をDBサーバ120に通知する。RPC処理を開始したことを示す信号は、例えば、プリミティブで実現される。RPC処理を開始したことを示す信号のプリミティブには、一例としてremove命令が用いられる。remove命令は、プリミティブ(putIfAbsent)による、他のプロセスからは途中データが観測できない状態を解除する命令である。以降、remove命令を用いたプリミティブを、プリミティブ(remove)と記載する。
(A7)DBサーバ120の処理部124は、記憶部121から、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)を削除する。
(A8)サーバ110bの制御部111bは、サーバ110aがサーバ110b側のRPC処理が失敗したかのチェックをするために用いる情報であるキャンセルレコードをDBサーバ120に書き込む信号を、DBサーバ120に通知する。キャンセルレコードを書き込む信号は、プリミティブで実現される。キャンセルレコードを書き込む信号のプリミティブには、一例として、putIfAbsent命令が用いられる。DBサーバ120の処理部124は、記憶部121に、サーバ110aがサーバ110b側のRPC処理が失敗したかのチェックをするために用いる制御情報(キャンセルレコード)を記憶させる。
(A9)サーバ110bのRPC送信部113bは、RPC信号を正常に受信したことを示すRPC_ACK信号を、サーバ110aに送信する。サーバ110aのRPC受信部114aは、RPC_ACK信号を受信する。
(A10)サーバ110bの要求部112bは、DBサーバ120に、口座Bのデータに取引金額分を加算させる加算要求を出す。
(A11)DBサーバ120の処理部123は、要求に応じて、口座Bのデータに取引金額分を加算させる処理を実行する。
(A12)サーバ110bの処理部115bは、口座Bのデータの更新をコミットする。
(A13)サーバ110bのRPC送信部113bは、RPC信号から呼び出された処理が正常に終了したことを示す情報を含む応答信号をサーバ110aに送信する。応答信号は、(A5)で受信したRPC信号に対する処理の成否応答である。サーバ110aのRPC受信部114aは、応答信号を受信する。
(A14)サーバ110aの処理部115aは、口座Aのデータの更新をコミットする。
(A1)〜(A14)の処理により、RPCの呼び出し元のサーバ110aは、RPCの呼び出し先のサーバ110b側の処理がコミットされた後から、自身の処理をコミットする。これにより、呼び出し元の口座Aのデータと呼び出し先の口座Bのデータは、整合性を取ることができる。なお、(A14)で一連のトランザクション処理が終了すると、(A8)で記憶部に記憶されたキャンセルレコードは、削除される。
以下に、サーバ110b側の処理について、障害が発生した場合の分散トランザクション処理を順に説明する。なお、(A1)〜(A7)の処理が、(B1)の処理の前に行われる。
(B1)(A8)又は(A9)で処理が失敗した場合、サーバ110bのRPC送信部113bは、RPC信号を正常に受信したことを示すRPC_ACK信号を、サーバ110aに送信しない。サーバ110bの要求部112bは、口座Bに関するトランザクション処理を、(A5)のRPC信号を受信した時点までロールバックする要求をDBサーバ120に出す。DBサーバ120は、ロールバックの要求を受けると、(A7)で削除されたサーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)を再生成する。DBサーバ120は、(A5)の時点の制御情報及び口座Bのデータを記憶している。
(B2)RPC信号から呼び出された処理が失敗したことを示す情報を含む応答信号を、サーバ110aのRPC受信部114aが受信した場合、サーバ110aの処理部115aは、サーバ110b側の処理が失敗し、サーバ110bから要求された処理が、DBサーバ120でロールバックされたと判定する。
(B3)所定の時間が経過しても、RPC_ACK信号や応答信号を、サーバ110aのRPC受信部114aが受信できない場合、サーバ110aの取得部117aは、制御情報122から、制御情報を取得する。サーバ110aの制御部111aは、サーバ110b側のRPC処理が行われているにも関わらず、チェックレコードを取得した場合、サーバ110b側の処理が失敗し、サーバ110bから要求された処理が、DBサーバ120でロールバックされたと判定する。再生成されたチェックレコードは、サーバ110bから要求された処理が、DBサーバ120でロールバックされたことを示す情報である。
(B4)サーバ110bから要求された処理がDBサーバ120でロールバックされた場合、サーバ110aの要求部112aは、口座Aに関するトランザクション処理を、(A1)の時点までロールバックする要求をDBサーバ120に出す。DBサーバ120は、(A1)の時点まで口座Aのデータをロールバックする。
(B2)の処理により、サーバ110aは、DBサーバ120の制御情報に基づいて、サーバ110b側から要求された処理がロールバックしたことを検知することができる。そのため、サーバ110a側も、自身が要求したトランザクション処理をロールバックさせる。このようにしてトランザクション処理は、口座Aと口座Bのデータの整合性が保たれる。また、2フェーズコミットのように、加算及び減算処理を管理する管理サーバを備えなくとも、口座Aと口座Bのデータの整合性が保たれる。
以下に、サーバ110b側の処理について、障害が発生した場合の分散トランザクション処理の別の例を順に説明する。なお、(A1)〜(A7)の処理が、(C1)の処理の前に行われる。(C1)の処理の後には、(B2)〜(B4)の処理が実行される。
(C1)(A10)〜(A11)で処理が失敗した場合、サーバ110bのRPC送信部113bは、RPC信号から呼び出された処理が正常に終了したことを示す情報を含む応答信号をサーバ110a側に送信しない。サーバ110bの要求部112bは、口座Bに関するトランザクション処理を、(A5)のRPC信号を受信した時点までロールバックする要求をDBサーバ120に出す。DBサーバ120は、(A5)の時点の制御情報及び口座Bのデータを記憶している。そのため、DBサーバ120は、口座Bのデータを(A5)の時点まで戻す。また、DBサーバ120は、(A7)で削除されたチェックレコードを再生成する。サーバ110bのRPC送信部113bが、RPC信号から呼び出された処理が失敗したことを示す情報を含む応答信号をサーバ110aに送信してもよい。
RPCの呼び出し元のサーバ110aは、DBサーバ120が処理対象として、サーバ110aからの要求処理であることを示す情報を保持している場合に、RPCの呼び出し先のサーバから要求された処理がDBサーバ120でロールバックしていると判定する。その後、呼び出し元のサーバ110aは、自身もロールバックをする要求をDBサーバ120に出す。RPCの呼び出し元のサーバ110aは、RPCの呼び出し先のサーバ110bが処理をコミットしている場合に、自身も処理をコミットする。このため、RPCの呼び出し先でロールバックが行われた場合、呼び出し元のサーバもロールバックを行うことができる。トランザクション処理において、呼び出し元からの処理対象データと呼び出し先の処理対象データの整合性が保たれる。また、2フェーズコミットのように、呼び出し元の処理と呼び出し先の処理を管理する管理サーバを備えなくとも、呼び出し元からの処理対象データと呼び出し先の処理対象データの整合性が保たれる。
図2は、サーバ及びDBサーバのハードウェア構成の例を示す。サーバ110及びDBサーバ120は、プロセッサ11、メモリ12、バス15、外部記憶装置16、ネットワーク接続装置19を備える。さらにオプションとして、サーバ110及びDBサーバ120は、入力装置13、出力装置14、媒体駆動装置17を備えてもよい。サーバ110及びDBサーバ120は、例えば、コンピュータなどで実現されることがある。
プロセッサ11は、Central Processing Unit(CPU)を含む任意の処理回路とすることができる。プロセッサ11は、サーバ110内の制御部111、要求部112、RPC送信部113、RPC受信部114、処理部115として動作する。プロセッサ11は、DBサーバ120内の処理部124として動作する。なお、プロセッサ11は、例えば、外部記憶装置16に記憶されたプログラムを実行することができる。メモリ12は、サーバ110内の記憶部116として動作する。メモリ12は、DBサーバ120内の記憶部124として動作し、データベース123、制御情報122を保持する。さらに、メモリ12は、プロセッサ11の動作により得られたデータや、プロセッサ11の処理に用いられるデータも、適宜、記憶する。ネットワーク接続装置19は、他の装置との通信に使用される。
入力装置13は、例えば、ボタン、キーボード、マウス等として実現され、出力装置14は、ディスプレイなどとして実現される。バス15は、プロセッサ11、メモリ12、入力装置13、出力装置14、外部記憶装置16、媒体駆動装置17、ネットワーク接続装置19の間を相互にデータの受け渡しが行えるように接続する。外部記憶装置16は、プログラムやデータなどを格納し、格納している情報を、適宜、プロセッサ11などに提供する。媒体駆動装置17は、メモリ12や外部記憶装置16のデータを可搬記憶媒体18に出力することができ、また、可搬記憶媒体18からプログラムやデータ等を読み出すことができる。ここで、可搬記憶媒体18は、フロッピイディスク、Magnet−Optical(MO)ディスク、Compact Dsic Recordabe(CD−R)やDigital Versatile Disk Recordable(DVD−R)を含む、持ち運びが可能な任意の記憶媒体とすることができる。
図3は、障害がない場合の分散トランザクション処理の例を説明するシーケンス図である。サーバ110aは、DBサーバ120に、口座Aのデータを対象としたプリミティブ(putIfAbsent)を通知する。DBサーバ120は、記憶部121に、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)を記憶する(ステップS101)。サーバ110aは、口座Aのデータを更新するトランザクション処理を開始する。トランザクション処理においてロールバックが実行されると、「begin」で示す時点(ステップS102)以降の処理は、全て無効とされる。なお、DBサーバ120は、「begin」で示す時点の口座Aのデータ及び制御情報を記憶している。サーバ110aは、DBサーバ120に口座Aのデータから取引金額分を減算させる減算要求を出す。DBサーバ120は、要求に応じて、口座Aのデータから取引金額分を減算させる処理を実行する(ステップS103)。サーバ110aは、RPC信号をサーバ110bに送信する(ステップS104)。
RPC信号を受信すると、サーバ110bは、トランザクション処理を開始する。トランザクション処理においてサーバ110bからロールバックが要求されると、「begin」で示す時点(ステップS105)以降の処理は、全て無効とされる。サーバ110bは、プリミティブ(remove)をDBサーバ120に通知する。DBサーバ120は、制御情報122から、チェックレコードを削除する(ステップS106)。サーバ110bは、DBサーバ120に、口座Bのデータを対象としたプリミティブ(putIfAbsent)を通知する。DBサーバ120は、記憶部121に、サーバ110aがサーバ110b側のRPC処理が失敗したかのチェックをするために用いる制御情報(キャンセルレコード)を記憶する(ステップS107)。サーバ110bは、サーバ110aにRPC_ACK信号を送信する(ステップS108)。サーバ110bは、DBサーバ120に口座Bのデータに取引金額分を加算させる加算要求を出す。DBサーバ120は、要求に応じて、口座Bのデータに取引金額分を加算させる処理を実行する(ステップS109)。サーバ110bは、口座Bの更新後のデータをコミットする(ステップS110)。サーバ110bは、RPC信号から呼び出された処理が正常に終了したことを示す情報を含む応答信号をサーバ110aに送信する(ステップS111)。サーバ110aは、口座Aの更新後のデータをコミットする(ステップS112)。S101〜S112で、口座Aから口座Bに金銭を振り込む分散トランザクション処理が完了する。分散トランザクション処理の終了に伴い、S107で記憶部121に記憶されたキャンセルレコードは削除される。
図4は、ハンドシェークが失敗した場合にシステムで行われる処理の例(その1)を説明するシーケンス図である。ハンドシェークは、サーバ110aとサーバ110b間のRPC信号が正常に送受信されたかの確認処理である。例えば、図3のS104のRPC信号をサーバ110bが受信し、RPC信号が正常に受信されたかを示すS108のRPC_ACK信号をサーバ110aが受信した場合に、ハンドシェークが成功している。図4のS201〜S206は、図3のS101〜S106と同じ処理であるため、説明を省略する。
サーバ110aは、RPC_ACK信号を受信できないため、S204のRPC信号送信後、所定の時間が経過すると、制御情報を確認し、サーバ110bの処理状況を確認する。サーバ110aは、DBサーバ120から、チェックレコード及びキャンセルレコードを取得する(ステップS207)。サーバ110bは、DBサーバ120に、口座Bのデータを対象としたプリミティブ(putIfAbsent)を通知する。DBサーバ120は、記憶部121に、サーバ110aがサーバ110b側のRPC処理が失敗したかのチェックをするために用いる制御情報(キャンセルレコード)を記憶する(ステップS208)。サーバ110bは、S208後の処理で失敗したため、S205の時点まで、サーバ110b側からの処理をロールバックする要求をDBサーバ120に出す要求をDBサーバ120に出す(ステップS209)。S209の処理において、サーバ110bは、S208で記憶部121に記憶させた情報を無効とする要求をDBサーバ120に出す。併せて、サーバ110bは、S206で削除したサーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)を再生成する要求をDBサーバ120に出す。DBサーバ120は、要求されたロールバック処理を行う。
サーバ110aは、S207の制御情報の取得処理をS207から所定の時間、繰り返す。その結果、サーバ110aは、制御情報122に、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)が再生成されていることを検知する。サーバ110aは、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。DBサーバ120は、制御情報122から、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)を削除する。サーバ110aは、S202の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS211)。S211のロールバックで、サーバ110aは、口座AのデータをS203の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS203の処理前の状態とする。また、S202の時点で、DBサーバ120は、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)を記憶していたため、S211のロールバックで、DBサーバ120は、チェックレコードを再生成する。
S207の取得処理を繰り返すことで、サーバ110aは、チェックレコードが再生成されていることを検知することができる。サーバ110aは、チェックレコードが再生成されていることにより、サーバ110bがロールバックしたことを検知する。そのため、サーバ110b側のロールバック処理にあわせて、サーバ110aの口座Aへのデータ更新処理もロールバックする。これにより、口座Aと口座Bとは整合性が保たれる。
図5は、ハンドシェークが失敗した場合にシステムで行われる処理の例(その2)を説明するシーケンス図である。図5の例では、ロールバックの際に、ロールバックを行う原因となったエラーの情報を、ロールバックの際に削除しないように変形されたシステムの動作例を説明する。なお、図5のS301〜S306は、図3のS101〜S106と同じ処理であるため、説明を省略する。
サーバ110aは、S304のRPC信号送信処理以降、定期的に、DBサーバ120から、口座Aや口座Bの状態を示す制御情報を取得する(ステップS307)。サーバ110bからのDBサーバ120へのプリミティブ(putIfAbsent)処理が失敗する。DBサーバ120は、記憶部121に、キャンセルレコードの生成に失敗したことを示す制御情報を記憶する(ステップS308)。サーバ110bは、S305の時点まで、サーバ110b側からの処理をロールバックする要求をDBサーバ120に出す(ステップS309)。S309のロールバックで、DBサーバ120は、S306のチェックレコードの削除処理を無効とし、チェックレコードを再生成する。S309のロールバックで、DBサーバ120は、S308のキャンセルレコードの生成に失敗したことを示す制御情報を削除しない。これにより、システムの管理者は、S308の処理でキャンセルレコードの生成に失敗したことを知ることができる。
S307の制御情報の取得処理は、S307の処理以降、所定の時間、処理を繰り返す。その結果、サーバ110aは、制御情報122に、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)があることを検知する。サーバ110aは、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。DBサーバ120は、制御情報122から、チェックレコードを削除する(ステップS310)。サーバ110aは、S302の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS311)。S311のロールバックで、サーバ110aは、口座AのデータをS303の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS303の処理前の状態とする。次に、S311のロールバックでDBサーバ120は、S302の時点で記憶されているチェックレコードを再生成しない。キャンセルレコードの生成に失敗したことを示す制御情報が記憶部121に記憶されている場合、DBサーバ120は、チェックレコードを再生成させないと判定する。
S307の取得処理を繰り返すことで、サーバ110aは、チェックレコードが再生成されていることを検知する。サーバ110aは、チェックレコードが再生成されていることにより、サーバ110b側の処理がロールバックしたことを検知する。サーバ110b側のロールバックにあわせて、サーバ110aの口座Aへのデータ更新処理もロールバックする。これにより、口座Aと口座Bとは整合性が保もたれる。なお、図5のトランザクション処理において、管理者は、処理終了後に制御情報を確認することで、S308の口座Bに関する制御情報の更新に失敗したことを知ることができる。
図6は、トランザクション処理が失敗したことを示す応答信号が送信された場合の例を説明するシーケンス図である。なお、図5のS401〜S409は、図3のS101〜S109と同じであるため、説明を省略する。
S409の処理の後にサーバ110bで障害が発生したため、サーバ110bは、S405の時点まで、サーバ110b側からの処理をロールバックする要求をDBサーバ120に出す(ステップS410)。S410のロールバックで、サーバ110bは、口座Bに関するデータをS409の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110bからの要求に応じた処理を実行し、口座BのデータをS409の処理前の状態とする。S410の処理の際、DBサーバ120は、S407で記憶部121に記憶させた情報を無効とする。併せて、S410の処理において、DBサーバ120は、チェックレコードを再生成する。
サーバ110bは、RPC信号から呼び出された処理が失敗したことを示す情報を含む応答信号をサーバ110aに送信する(ステップS411)。サーバ110aは、S402の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS412)。S412のロールバックで、サーバ110aは、口座AのデータをS403の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS403の処理前の状態とする。DBサーバ120は、S412の時点で、チェックレコードを記憶しているため、再生成処理は行わない。サーバ110aは、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。DBサーバ120は、制御情報122から、チェックレコードを削除する(ステップS413)。
サーバ110aは、S411のRPC信号から呼び出された処理が失敗したことを示す情報を含む応答信号を受信すると、制御情報の取得処理を行う。制御情報の取得処理により、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)が再生成されていることを検知し、サーバ110bがロールバックしたことを検知できる。このようにして、サーバ110b側のロールバックにあわせて、サーバ110aの口座Aへのデータ更新処理もロールバックするため、口座Aと口座Bとは、整合性が保たれる。
図7は、応答信号が遅延した場合のトランザクション処理の例(その1)を説明するシーケンス図である。図7のシーケンス図では、図5の応答信号(S411)が遅延した場合の例である。なお、図7のS501〜S509は、図3のS101〜S109と同じであるため、説明を省略する。
サーバ110aは、S508のRPC_ACK信号の受信以降、所定の時間を超えても応答信号を受信しない場合、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。プリミティブ(remove)により、サーバ110aは、チェックレコードが再生成されていることとサーバ110b側の処理がロールバックされたかを判定できる。しかし、DBサーバ120は、記憶部121にチェックレコードを記憶していないため、プリミティブ(remove)の処理は実行されない(ステップS510)。S509の処理の後にサーバ110bで障害が発生したため、サーバ110bは、S505の時点まで、サーバ110b側からの処理をロールバックする要求をDBサーバ120に出す(ステップS511)。S511のロールバックで、サーバ110bは、口座BのデータをS509の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座BのデータをS509の処理前の状態とする。S511の処理において、DBサーバ120は、S507で記憶部121に記憶させた情報を無効とする。併せて、S511の処理において、DBサーバ120は、チェックレコードを再生成する。
S511のロールバックで、チェックレコードが再生成されたため、DBサーバ120がS510で受信したプリミティブ(remove)の処理が実行できる。DBサーバ120は、制御情報122からチェックレコードを削除し、チェックレコードの削除が成功したことをサーバ110aに通知する(ステップS512)。サーバ110aは、S502の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS513)。S513のロールバックで、サーバ110aは、口座AのデータをS503の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS503の処理前の状態とする。また、S513のロールバックで、DBサーバ120は、チェックレコードを再生成する。その後、サーバ110bは、RPC信号から呼び出された処理が失敗したことを示す情報を含む応答信号をサーバ110aに送信する(ステップS514)。
図7のシステムにおいて、サーバ110aは、S512のプリミティブ(remove)の処理が成功したことを受信することにより、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)が再生成されたことを検知できる。更に、チェックレコードが再生成されたことにより、サーバ110b側からの処理がロールバックしたことを検知できる。このようにして、サーバ110b側からの処理のロールバックにあわせて、サーバ110aの口座Aへのデータ更新処理もロールバックするため、口座Aと口座Bとは、整合性が保たれる。
図8は、応答信号が遅延した場合のトランザクション処理の例(その2)を説明するシーケンス図である。図8のシーケンス図は、サーバ110bの更新データがコミットされたにも関わらず、応答信号が遅延した場合の例である。なお、図8のS601〜S610は、図3のS101〜S110と同じであるため、説明を省略する。
S610で、サーバ110bの口座Bの更新処理はコミットされている。しかし、図1のS112のRPC信号から呼び出された処理が成功したことを示す情報を含む応答信号が遅延し、所定の時間経過しても受信できない場合、サーバ110aは、S611以降の処理を行う。サーバ110aは、所定の時間を超えても応答信号を受信しない場合、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。しかし、DBサーバ120は、記憶部121にチェックレコードを記憶していないため、プリミティブ(remove)の処理は実行されない(ステップS611)。S610で、サーバ110bの口座Bの更新処理はコミットされたため、チェックレコードは再生成されない。そのため、所定の時間が経過しても、プリミティブ(remove)の対象となる制御情報がないため、プリミティブ(remove)処理は失敗する(ステップS612)。サーバ110aは、S602の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS613)。S613のロールバックで、サーバ110aは、口座AのデータをS603の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS603の処理前の状態とする。S613のロールバックにおいて、DBサーバ120は、チェックレコードを再生成しない。
その後、サーバ110bは、RPC信号から呼び出された処理が成功したことを示す情報を含む応答信号(遅延)をサーバ110aに送信する(ステップS614)。しかし、サーバ110a側の処理は既にロールバック処理をしているため、サーバ110bにデータベースの無効処理を要求する(ステップS615)。サーバ110bは、S609のデータベースへの更新処理を無効とする(ステップS616)。図8のシーケンス図の例は、サーバ110b側の処理がコミットされているにも関わらず、サーバ110a側の処理がロールバックされた場合である。そのため、サーバ110aは、サーバ110b側のコミット済みの処理を無効化する。このようにして、サーバ110a側のロールバックにあわせて、サーバ110bの口座Bへのデータ更新処理もロールバックするため、口座Aと口座Bとは、整合性が保たれる。
図9A〜図9Dは、本実施形態に係るサーバA側のトランザクション処理の例を説明するフローチャートである。トランザクション処理は、口座Aから口座Bへの金銭の振込み処理についての、不可分な一連の加算処理と減算処理について説明する。
図9Aは、サーバA側のトランザクション処理の例を説明するフローチャートである。サーバ110aの処理部115は、サーバ110bとの通信経路を確保する(ステップS1001)。サーバ110aの処理部115は、実行するトランザクション処理のRPCに、識別番号を割り当てる(ステップS1002)。サーバ110aの制御部111aは、サーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)の書き込み命令であるプリミティブ(putIfAbsent)をDBサーバ120に通知する(ステップS1003)。サーバ110aの処理部115は、チェックレコードの書き込み命令がDBサーバ120側で正常に処理されたかを判定する(ステップS1004)。正常にされている場合、DBサーバ120は、チェックレコードが、記憶部121に記憶される。サーバ110aの処理部115は、トランザクション処理を開始(begin)する (ステップS1005、ステップS1004でYES)。
図9Bは、図9AのS1005後の処理の例を説明するフローチャートである。チェックレコードの書き込み命令がDBサーバ120側で正常に処理されない場合、DBサーバ120は、チェックレコードを、記憶部121に記憶していない。サーバ110aの処理部115は、トランザクション処理を終了する(ステップS1006、ステップS1004でNO)。サーバ110aの要求部112aは、DBサーバ120に、口座Aのデータから取引金額分を減算させる減算要求を出す(ステップS1007)。DBサーバ120の処理部123は、要求に応じて、口座Aのデータから取引金額分を減算させる処理を実行する。口座Aのデータをコミットする前に、サーバ110aのRPC送信部113aは、口座Bのデータ更新をするサーバ110bにRPC信号を送信する(ステップS1008)。口座Aから口座Bへの振込みをする場合、口座Aの減算処理と口座Bの加算処理は、一連の不可分な処理である。RPC信号は、まだ実行されていない加算処理を開始する要求である。
サーバ110aの処理部115は、サーバ110bがRPC信号を正常に受信したことを示すRPC_ACK信号を、RPC受信部114aが受信したかを判定する(ステップS1009)。サーバ110aの処理部115は、RPC信号を送信してから所定の時間が経過したかを判定する(ステップS1010、ステップS1009でNO)。S1010で所定の時間が経過している場合、サーバ110aは、処理をS1021に移行する。S1010で所定の時間が経過していない場合、サーバ110aは、S1009の処理を繰り返す。
サーバ110aの処理部115は、S1008で送信されたRPC信号により呼び出されたサーバ110b側の処理が正常に処理されたかの結果情報を含むレスポンス信号を、RPC受信部114aが受信したかを判定する(ステップS1011、ステップS1009でYES)。サーバ110aの処理部115は、RPC信号を送信してから所定の時間が経過したかを判定する(ステップS1012、ステップS1011でNO)。S1012で所定の時間が経過している場合、サーバ110aは、処理をS1031に移行する。S1012で所定の時間が経過していない場合、サーバ110aは、S1011の処理を繰り返す。
サーバ110aの処理部115aは、受信したレスポンス信号にRPC信号により呼び出されたサーバ110b側の処理が正常に処理されたかの結果が、成功かどうかを判定する(ステップS1013、ステップS1011でYES)。サーバ110aの処理部115aは、S1007で処理された口座Aのデータの更新をコミットする(ステップS1014、ステップS1013でYES)。サーバ110aの処理部115aは、S1014で実行されたコミット処理が成功したかを判定する(ステップS1015)。サーバ110aは、S1005以降に実行された処理をロールバックする要求をDBサーバ120に出す(ステップS1016、ステップS1013でNO、ステップS1015でNO)。サーバ110aの処理部115aは、トランザクション処理を終了する(ステップS1015でYES)。
図9Cは、図9BのS1010でYESと判定された場合の処理の例を説明するフローチャートである。サーバ110aの取得部117aは、定期的に制御情報122を取得する(ステップS1021)。サーバ110aの制御部111aは、サーバ110b側の処理が完了後に、キャンセルレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する(ステップS1022)。サーバ110aの処理部115aは、キャンセルレコードを対象としたプリミティブ(remove)の処理が実行されたかを判定する(ステップS1023)。サーバ110aの処理部115aは、サーバ110b側のトランザクション処理がロールバックしていることを検知する(ステップS1024、ステップS1023でYES)。サーバ110aは、S1005以降に実行された処理をロールバックする要求をDBサーバ120に出す(ステップS1025)。サーバ110aの処理部115aは、サーバ110b側のデータベース更新がコミットされたと判定する(ステップS1026、ステップS1023でNO)。サーバ110aは、S1005以降に実行された処理をロールバックする要求をDBサーバ120に出す(ステップS1027)。サーバ110aの処理部115aは、S1008のRPC信号から呼び出されたプロシージャから更新された口座Bのデータの更新処理を無効化する要求を出す(ステップS1028)。
図9Dは、図9BのS1012でYESと判定された場合の処理の例を説明するフローチャートである。サーバ110aの制御部111aは、サーバ110b側の処理が完了後に、キャンセルレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する(ステップS1031)。サーバ110aは、S1005以降に実行された処理をロールバックする要求をDBサーバ120に出す(ステップS1032)。サーバ110aの処理部115aは、キャンセルレコードを対象としたプリミティブ(remove)の処理が実行されたかを判定する(ステップS1033)。サーバ110aの処理部115aは、サーバ110b側のトランザクション処理がロールバックしていることを検知する(ステップS1034、ステップS1033でYES)。サーバ110aの処理部115aは、サーバ110b側のデータベース更新がコミットされたと判定する(ステップS1035、ステップS1033でNO)。サーバ110aの処理部115aは、S1008のRPC信号から呼び出されたプロシージャから更新された口座Bのデータの更新処理を無効化する要求を出す(ステップS1036)。サーバ110aの制御部111aは、サーバ110b側の処理が完了後に、キャンセルレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する(ステップS1037、ステップS1306処理後)。
図10A〜図10Bは、本実施形態に係るサーバB側のトランザクション処理の例を説明するフローチャートである。トランザクション処理は、口座Aから口座Bへの金銭の振込み処理についての、不可分な一連の加算処理と減算処理について説明する。
サーバ110bの処理部115bは、サーバ110aからの通信経路の確保要求を承認する(ステップS2001)。サーバ110bのRPC受信部114bは、サーバ110aから口座Bの更新要求を含むRPC信号を受信する(ステップS2002)。サーバ110bの処理部115bは、トランザクション処理を開始(begin)する (ステップS2003)。サーバ110bの制御部111bは、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する(ステップS2004)。S2004のチェックレコードは、S2002で受信したRPC信号に含まれるRPC識別番号から判別される。サーバ110bの処理部115bは、チェックレコードを対象としたプリミティブ(remove)の処理が実行されたかを判定する(ステップS2005)。サーバ110bの処理部115bは、S2003以降に実行された処理をロールバックする要求をDBサーバ120に出す(ステップS2006、ステップS2005でNO)。サーバ110bの制御部111bは、サーバ110aがサーバ110b側のRPC処理が失敗したかのチェックをするために用いる制御情報(キャンセルレコード)の書き込み命令であるプリミティブ(putIfAbsent)をDBサーバ120に通知する(ステップS2007)。サーバ110bの処理部115bは、キャンセルレコードの書き込み命令がDBサーバ120側で正常に処理されたかを判定する(ステップS2008)。サーバ110bの処理部115bは、S2003以降に実行された処理をロールバックする要求をDBサーバ120に出す(ステップS2009、ステップS2008でNO)。S2006及びS2009処理後、サーバ110b側のトランザクション処理は終了する。
図10Bは、S2008後の処理を示すフローチャートである。サーバ110bのRPC送信部113bは、RPC_ACK信号をサーバ110aに送信する(ステップS2010)。サーバ110bの要求部112bは、DBサーバ120に、口座Bのデータに取引金額分を加算する加算要求を出す(ステップS2011)。サーバ110bの処理部115bは、口座Bのデータの加算処理後のデータをコミットする(ステップS2012)。サーバ110bの処理部115bは、コミット処理が成功したかを判定する(ステップS2013)。サーバ110bの処理部115bは、S2003以降に実行された処理をロールバックする要求をDBサーバ120に出す(ステップS2014、ステップS2013でNO)。サーバ110bのRPC送信部113bは、S2002で受信したRPC信号後の処理が成功したかの情報を含む応答信号をサーバ110aに送信する(ステップS2015、ステップS2013でYES)。
RPCの呼び出し元のサーバ110aは、DBサーバ120が処理対象として、サーバ110aからの要求処理であることを示す情報を保持している場合に、RPCの呼び出し先のサーバから要求された処理がDBサーバ120でロールバックしていると判定する。その後、呼び出し元のサーバ110aは、自身もロールバックをする要求をDBサーバ120に出す。RPCの呼び出し元のサーバ110aは、RPCの呼び出し先のサーバ110bが処理をコミットしている場合に、自身も処理をコミットする。このため、RPCの呼び出し先でロールバックが行われた場合、呼び出し元のサーバもロールバックを行うことができる。トランザクション処理において、呼び出し元からの処理対象データと呼び出し先の処理対象データの整合性が保たれる。また、2フェーズコミットのように、呼び出し元の処理と呼び出し先の処理を管理する管理サーバを備えなくとも、呼び出し元からの処理対象データと呼び出し先の処理対象データの整合性が保たれる。
<その他>
なお、実施形態は上記に限られるものではなく、様々に変形可能である。以下にその例を述べる。
図11は、RPC信号に対応する応答信号を使用しない分散トランザクション処理の例(その1)を説明するシーケンス図である。図11の分散トランザクション処理には、図1のシステム構成と同様のものを用いてよい。なお、図11のS701〜S710は、図3のS101〜S110と同じであるため、説明を省略する。
サーバ110aは、S708の処理後から所定の時間経過後、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。しかし、DBサーバ120は、記憶部121にサーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)を記憶していないため、プリミティブ(remove)の処理は実行されない(ステップS711)。S711処理後から所定の時間が経過しても、プリミティブ(remove)の対象となるチェックレコードがないため、プリミティブ(remove)処理は失敗する(ステップS712)。サーバ110aは、記憶部121にサーバ110b側のRPC処理が開始されていないことを示す制御情報(チェックレコード)が記憶されていない場合に、サーバ110b側のトランザクション処理が正常に終了したと判定する。サーバ110aは、口座Aの更新後のデータをコミットする(ステップS713)。
図12は、RPC信号に対応する応答信号を使用しない分散トランザクション処理の例(その2)を説明するシーケンス図である。図12のシーケンス図は、プリミティブ(putIfAbsent)処理が失敗したことでハンドシェークに失敗した場合のトランザクション処理の例である。なお、図12のS801〜S806は、図11のS701〜S706と同じであるため、説明を省略する。
サーバ110aは、S804のRPC信号送信処理以降、定期的に、DBサーバ120から、制御情報を取得する(ステップS807)。サーバ110bからのDBサーバ120へのプリミティブ(putIfAbsent)処理が失敗する。DBサーバ120は、記憶部121に、キャンセルレコードの生成に失敗したことを示す制御情報を記憶する(ステップS808)。サーバ110bは、S805の時点まで、サーバ110b側からの処理をロールバックする要求をDBサーバ120に出す(ステップS809)。S809のロールバックで、DBサーバ120は、S806のチェックレコードの削除処理を無効とし、チェックレコードを再生成する。S809のロールバックで、DBサーバ120は、S808のキャンセルレコードの生成に失敗したことを示す制御情報を削除しない。これにより、システムの管理者は、S808の処理でキャンセルレコードの生成処理に失敗したことを知ることができる。
サーバ110aは、S807の処理後から所定の時間経過後、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。しかし、DBサーバ120は、記憶部121にチェックレコードを記憶していないため、プリミティブ(remove)の処理は実行されない(ステップS810)。なお、図12のシーケンス図は、S810の処理がS809よりも先に処理されている。S809のロールバックで、チェックレコードが再生成されたため、DBサーバ120がS810で受信したプリミティブ(remove)の処理が実行できる。DBサーバ120は、制御情報122からチェックレコードを削除し、削除が成功したことをサーバ110aに通知する(ステップS811)。サーバ110aは、S802の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS812)。S812のロールバックで、サーバ110aは、口座AのデータをS803の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS803の処理前の状態とする。次に、S812のロールバックでDBサーバ120は、S802の時点で記憶されているチェックレコードを再生成しない。キャンセルレコードの生成に失敗したことを示す制御情報が記憶部121に記憶されている場合、DBサーバ120は、チェックレコードを再生成しないと判定する。
図13は、RPC信号に対応する応答信号を使用しない分散トランザクション処理の例(その3)を説明するシーケンス図である。図13のシーケンス図は、サーバ110b側からサーバ110a側にRPC_ACK信号が送信されないために、ハンドシェークに失敗した場合の例である。なお、図13のS901〜S906は、図11のS701〜S706と同じであるため、説明を省略する。
サーバ110aは、S904のRPC信号送信処理以降、定期的に、DBサーバ120から、制御情報を取得する(ステップS907)。サーバ110bは、DBサーバ120に、キャンセルレコードの書き込み命令であるプリミティブ(putIfAbsent)を通知する。DBサーバ120は、記憶部121に、キャンセルレコードを記憶する(ステップS908)。サーバ110bは、S905の時点まで、サーバ110b側からの処理をロールバックする要求をDBサーバ120に出す(ステップS909)。S909のロールバックで、DBサーバ120は、S906のチェックレコードの削除処理を無効とし、チェックレコードを再生する。S909のロールバックで、DBサーバ120は、S908で生成されたキャンセルレコードを削除する。
サーバ110aは、S907の処理後から所定の時間経過後、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。しかし、DBサーバ120は、記憶部121にチェックレコードを記憶していないため、プリミティブ(remove)の処理は実行されない(ステップS910)。なお、図13のシーケンス図は、S910の処理がS909よりも先に処理されている。S909のロールバックで、チェックレコードが再生成されたため、DBサーバ120がS910で受信したプリミティブ(remove)の処理が実行できる。DBサーバ120は、制御情報122からチェックレコードを削除し、削除が成功したことをサーバ110aに通知する(ステップS911)。サーバ110aは、S902の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS912)。S912のロールバックで、サーバ110aは、口座AのデータをS903の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS903の処理前の状態とする。次に、S912のロールバックでDBサーバ120は、S902の時点で記憶されているチェックレコードを再生成する。
図14は、RPC信号に対応する応答信号を使用しない分散トランザクション処理の例(その4)を説明するシーケンス図である。図14のシーケンス図は、サーバ110bの口座Bのデータの更新処理で失敗した場合の例である。なお、図14のS3001〜S3009は、図11のS701〜S709と同じであるため、説明を省略する。
サーバ110bは、S3009の口座Bのデータの更新処理中又は処理後に失敗が発生したため、S3005の時点まで、サーバ110b側からの処理をロールバックする要求をDBサーバ120に出す(ステップS3010)。DBサーバ120は、サーバ110bからの要求に応じた処理を実行し、口座BのデータをS3009の処理前の状態とする。S3010の処理の際、DBサーバ120は、S3007で記憶部121に記憶させた情報を無効とする。併せて、S3010の処理において、DBサーバ120は、S3005の時点でDBサーバ120に記憶されているチェックレコードを再生成する。
サーバ110aは、S3008の処理後から所定の時間経過後、チェックレコードを対象としたプリミティブ(remove)をDBサーバ120に通知する。しかし、DBサーバ120は、記憶部121にチェックレコードを記憶していないため、プリミティブ(remove)の処理は実行されない(ステップS3011)。なお、図14のシーケンス図は、S3011の処理がS3010よりも先に処理されている。S3010のロールバックで、チェックレコードが再生成されたため、DBサーバ120がS910で受信したプリミティブ(remove)の処理が実行できる。DBサーバ120は、制御情報122からチェックレコードを削除し、削除が成功したことをサーバ110aに通知する(ステップS3012)。サーバ110aは、S3002の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS3013)。S3013のロールバックで、サーバ110aは、口座AのデータをS3003の処理前の状態とする。そのため、S3013のロールバックで、サーバ110aは、口座AのデータをS3003の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS3003の処理前の状態とする。S3008でRPC_ACK信号を受信している場合、DBサーバ120は、S3013のロールバックで、S3002の時点で記憶されているチェックレコードを再生成しない。
図15は、RPC信号に対応する応答信号を使用しない分散トランザクション処理の例(その5)を説明するシーケンス図である。図15のシーケンス図は、サーバ110b側の処理がコミットされたにも関わらず、サーバ110a側の処理がプリミティブ(remove)に関する処理で失敗し、サーバ110a側の処理をロールバックした場合の例である。なお、図15のS4001〜S4012は、図11のS701〜S712と同じであるため、説明を省略する。
サーバ110aは、サーバ110b側の処理がコミット済みであるにも関わらず、S4002の時点まで、サーバ110a側からの処理をロールバックする要求をDBサーバ120に出す(ステップS4013)。S4013のロールバックで、サーバ110aは、口座AのデータをS4003の処理前の状態とする。そのため、S4013のロールバックで、サーバ110aは、口座AのデータをS4003の処理前の状態とする要求をDBサーバ120に送信する。DBサーバ120は、サーバ110aからの要求に応じた処理を実行し、口座AのデータをS4003の処理前の状態とする。S4008でRPC_ACK信号を受信しているため、DBサーバ120は、S4013のロールバックで、S4002の時点で記憶されているチェックレコードを再生成しない。サーバ110aは、サーバ110b側の処理がコミット済みであるにも関わらず、サーバ110a側の処理をロールバックしているため、サーバ110b側のS4009の処理の無効化する命令を出す(ステップS4014)。
なお、図7、図12、図13、図14において、サーバ110aは、サーバ110b側の処理がロールバックされた後に、プリミティブ(remove)をDBサーバ120に送信した場合、DBサーバ120は、その場で、要求された命令を実行する。
RPCの呼び出し元のサーバ110aは、DBサーバ120が処理対象として、サーバ110aからの要求処理であることを示す情報を保持している場合に、RPCの呼び出し先のサーバから要求された処理がDBサーバ120でロールバックしていると判定する。その後、呼び出し元のサーバ110aは、自身もロールバックをする要求をDBサーバ120に出す。RPCの呼び出し元のサーバ110aは、RPCの呼び出し先のサーバ110bが処理をコミットしている場合に、自身も処理をコミットする。このため、RPCの呼び出し先でロールバックが行われた場合、呼び出し元のサーバもロールバックを行うことができる。トランザクション処理において、呼び出し元からの処理対象データと呼び出し先の処理対象データの整合性が保たれる。また、2フェーズコミットのように、呼び出し元の処理と呼び出し先の処理を管理する管理サーバを備えなくとも、呼び出し元からの処理対象データと呼び出し先の処理対象データの整合性が保たれる。