(57)【特許請求の範囲】
【請求項１】
任意の上位装置より、変数１〜ｎ（ｎは任意の整数）のうち１つ以上の変数に対して任意の組み合わせ・順序でその内容の更新を指示されたとき、その更新を同時不可分の処理とすることを可能とするトランザクション管理装置において、
トランザクション管理装置は、更新開始装置、更新カウンタ、更新終了装置、２本の変数１〜ｎの内容を格納するレコード記憶領域を有するメモリ、変数１〜ｎの内容を格納するポインタレコード退避領域を有するメモリ、２本のレコード記憶領域のいずれかを指すスイッチを備え、
上位装置が変数ｉ（１≦ｉ≦ｎ）の内容の更新を開始しようとするとき、開始要求を受信し、
更新開始装置は、更新カウンタが０ならば、更新カウンタを１にし、スイッチが指すレコード記憶領域の内容をポインタレコード退避領域へコピーし、レコード退避領域上のレコードに格納されている変数ｉの内容を上位装置へ送る度に更新カウンタを増加させ、
上位装置が変数ｉの内容の更新を終了しようとするとき、上位装置より終了要求と更新された変数ｉの内容Ｍを受信し、
更新終了装置は、ポインタレコード退避領域上のレコードに格納されている変数ｉに内容Ｍを格納する度に更新カウンタを減じ、更新カウンタが０になれば、ポインタレコード退避領域上のレコードの内容をスイッチが指すレコード記憶領域とは逆のレコード記憶領域にコピーし、スイッチが現在とは反対側のレコード記憶領域を指すよう変更する
ことを特徴とするトランザクション管理装置。
【請求項２】
任意の上位装置より、変数１〜ｎ（ｎは任意の整数）のうち１つ以上の変数に対して任意の組み合わせ・順序でその内容の更新を指示されたとき、その更新を同時不可分の処理とすることを可能とし、さらにロールバックの指示によって更新の履歴を遡ることを可能とするトランザクション管理装置であって、
トランザクション管理装置は、更新開始装置、更新カウンタ、更新終了装置、２本以上の変数１〜ｎの内容を格納するレコード記憶領域を有するメモリ、変数１〜ｎの内容を格納するポインタレコード退避領域を有するメモリ、２本以上のレコード記憶領域のいずれかをその値により指すスイッチ、ロールバック装置を備え、
上位装置が変数ｉ（１≦ｉ≦ｎ）の内容の更新を開始しようとするとき、上位装置より開始要求を受信し、更新開始装置へ渡し、
更新開始装置は、更新カウンタが０ならば、更新カウンタを１とし、スイッチの値が指す、変数１〜ｎの内容を格納したレコード記憶領域の内容をポインタレコード退避領域へコピーし、ポインタレコード退避領域上のレコードに格納されている変数ｉの内容を上位装置へ送る度に更新カウンタを増加させ、
上位装置が変数ｉの内容の更新を終了しようとするとき、上位装置より終了要求と更新された変数ｉの内容Ｍを受信し、更新終了装置へ渡し、
更新終了装置は、ポインタレコード退避領域上のレコードに格納されている変数ｉに内容Ｍを記憶する度に更新カウンタを減じ、更新カウンタが０になれば、ポインタレコード退避領域上のレコードの内容をスイッチの値が指すレコード記憶領域の次のレコード記憶領域にコピーし、スイッチの値を１つ増し、現在の次のレコード記憶領域を指すように変更し、
また、任意の上位装置より、変数１〜ｎのうち１つ以上の変数に対して任意の組み合わせ・順序でその内容の更新した後にロールバックを指示されたとき、上位装置より段数ｒ（ｒは１以上の整数）を受信し、ロールバック装置へ渡し、
ロールバック装置は、現在のスイッチの値よりｒを減じたスイッチの値の指すレコード記憶領域を変更する
ことを特徴とするトランザクション管理装置。
【請求項３】
任意の上位装置より、記憶領域上の構造体１〜ｎ（ｎは任意の整数）のうち１つ以上の構造体に対して任意の組み合わせ・順序でその内容の更新を指示されたとき、その更新を同時不可分の処理とすることを可能とするトランザクション管理装置であって、
トランザクション管理装置は、更新開始装置、更新カウンタ、更新終了装置、２本のログインデックス１〜ｎを格納するレコード記憶領域を有するメモリ、ログインデックス１〜ｎを格納するポインタレコード退避領域を有するメモリ、ｎ本のインデックスと内容を格納した構造体記憶領域を有するメモリ、２本のレコード記憶領域のいずれかを指すスイッチを備え、
上位装置が構造体ｉ（１≦ｉ≦ｎ）の更新を開始しようとするとき、上位装置より開始要求を受信し、更新開始装置へ渡し、
更新装置は、更新カウンタが０ならば更新カウンタを１とし、スイッチが指す、ログインデックス１〜ｎを格納したレコード記憶領域の内容をポインタレコード退避領域へコピーし、ポインタレコード退避領域上のレコードに格納されている構造体ｉに固有のログインデックスの指すログの内容を上位装置へ渡す度に更新カウンタを増加させ、ポインタレコード退避領域上のレコードに記憶されている構造体ｉに固有のログインデックスの指すログの内容を上位装置へ渡し、
上位装置が変数ｉ（１≦ｉ≦ｎ）の更新を終了しようとするとき、上位装置より終了要求を受信し、更新終了装置へ渡し、
更新終了装置は、ポインタレコード退避領域上のレコードに格納されている変数ｉに固有のログインデックスが指すログとは異なるログへ上位装置から渡された構造体ｉの新しい内容をコピーし、その場所を指すようにポインタレコード退避領域上のレコードに格納されているログインデックスを更新する度に更新カウンタを減じ、更新カウンタが０になればポインタレコード退避領域上のレコードの内容をスイッチが指すレコード記憶領域とは逆のレコード記憶領域にコピーし、スイッチが現在とは反対側のレコード記憶領域を指すように変更する
ことを特徴とするトランザクション管理装置。
【発明の詳細な説明】
【０００１】
【発明の属する技術分野】
本発明は、複数のトランザクションを同時不可分に行うトランザクション管理装置に関する。
【０００２】
【従来の技術】
あるトランザクション処理が複数のトランザクションに跨って行われる場合がある。例えば、残高を管理する変数を更新するトランザクション（以後、「Tr1」という）があって、さらにポイント（例えば、商品の購入額に応じたポイント）を管理する変数を更新するトランザクション（以後、「Tr2」という）があったとする。
ある商品を購入するトランザクション（以後、「Tr3」という）があったとすると、Tr3の中では、購入代金をTr1によって行い、さらに、Tr2によってポイントを更新するとする。
【０００３】
このとき、商品の購入処理(Tr3)は同時不可分の処理でなくてはならない。つまり、Tr1〜Tr3のすべてのトランザクションが完全に実行されるか全く実行されないかということが保証される必要がある。なぜならば、Tr3の処理の中でTr1,Tr2が実行されたとき、そのうちどれかが失敗すると、代金を減額したにもかかわらずポイントが増えない事態や、代金を減額し、ポイントも増加したのに商品は購入されていないといった事態が生じるからである。つまり、▲１▼商品を購入して、代金が減額されて、ポイントが増加した状態か、▲２▼商品が購入されないで、代金も減額されず、ポイントも増加しないという２つの状態のみが発生するように保証する必要がある。
【０００４】
従来の技術では、まず、Tr1〜Tr3の処理を行う前に、更新される変数のすべてをバックアップ保存し、その上で変数の更新を行うという手順が取られている。この方法では、Tr1〜Tr3のうちの一つでも処理に失敗した場合は、バックアップを変数に書き戻すという処理（リカバリ処理）を行うことにより、処理を開始する以前の状態に戻すことができ、これによりTr1〜Tr3のすべての実行を同時不可分とすることができる。
Tr1〜Tr3の処理シーケンス例を図２２に示し、上位装置と接続されたトランザクション管理装置の構成図を図２３に示す。
【０００５】
上位装置は各トランザクションを実行する装置である。また、トランザクション管理装置はコミットバッファモニタとコミットバッファとデータ記憶領域から構成される。
コミットバッファは変数のバックアップを格納するために不揮発性記憶領域上に設けられる領域である。コミットバッファモニタは、更新前に更新の対象となるすべてのバックアップを作成するための機能である。
図２２のシーケンスを図２３の装置を用いて実行すると以下のようになる。
１．Tr3を行う上位装置はトランザクション管理装置に対してトランザクションを開始することを宣言する。
２．トランザクション管理装置ではTr3で更新される変数のバックアップをコミットバッファ上に作成する。
３．Tr3を行う上位装置は購入履歴を更新し、支払を行うためにTr1を実行する上位装置を呼び出す。購入履歴の更新に失敗した場合は１３.に移行する。
４．Tr1を実行する上位装置はトランザクション管理装置に対してトランザクションを開始することを宣言する。
５．トランザクション管理装置ではTr1で更新される変数のバックアップをコミットバッファ上に作成する。残高の更新に失敗した場合は１３.に移行する。
６．Tr1を実行する上位装置は残高を更新し、ポイントを増やすためにTr2を実行する上位装置を呼び出す。
７．Tr2を実行する上位装置はトランザクション管理装置に対してトランザクションを開始することを宣言する。
８．トランザクション管理装置ではTr2で更新される変数のバックアップをコミットバッファ上に作成する。
９．Tr2を行う上位装置はポイントを増やし、更新が成功したらトランザクション管理装置に対してトランザクションの完了を宣言し、Tr1を行う上位装置へ制御を戻す。ポイントの更新に失敗した場合は１３.に移行する。
１０．Tr1では自分の処理とTr2が終了した、すなわち残高の更新とポイントの更新が完了したので、トランザクション管理装置に対して自トランザクションTr1の完了を宣言し、Tr3を実行する上位装置へ制御を戻す。
１１．Tr3ではTr1が終了した、すなわち購入履歴の更新と残高の更新とポイントの更新が完了したので、トランザクション管理装置に対してトランザクションの完了を宣言する。
１２．トランザクション管理装置はすべてのトランザクションが終了した、すなわち、Tr1〜Tr3のすべてのトランザクションが完全に実行されたのですべてのバックアップを削除する。
１３.１〜１１のいずれかの処理で失敗した場合は、コミットバッファ上のバックアップを書き戻すことによってすべての変数の状態を以前の状態に戻す。
以上のような処理によって、すべてのトランザクションが完全に実行されるか全く実行されないかということ、つまり同時不可分の処理を実現する。
【０００６】
【発明が解決しようとする課題】
従来のトランザクション装置では更新の対象となる全ての変数のバックアップを取る必要があるため、その分の記憶領域が必要となり更新対象の変数の数、組み合わせ・順序が複雑になる、つまりトランザクションの数が多くなると、その分多くの記憶領域を用意しておく必要がある。バックアップのためには少なくとも１回分の余分な記憶領域への書き込みが必要となるが、一般的に不揮発性記憶領域への書き込みには高い時間的コストが必要であるため高速な処理を行うことが難しい。また、更新終了時にはバックアップの削除も必要である。さらに、この装置で同時不可分を可能とするためには、障害発生時にいずれかの更新が失敗した際にすべてのバックアップを書き戻すリカバリ機能が必須であるが、更新対象の変数の数、組み合わせ・順序が複雑になると複雑なリカバリ処理が必要となる。
従って、上記理由により従来技術による省資源での実現、高速な処理は困難である。
【０００７】
【課題を解決するための手段】
上記課題を解決するために、
請求項１の発明は、任意の上位装置より、変数１〜ｎ（ｎは任意の整数）のうち１つ以上の変数に対して任意の組み合わせ・順序でその内容の更新を指示されたとき、その更新を同時不可分の処理とすることを可能とするトランザクション管理装置において、
トランザクション管理装置は、更新開始装置、更新カウンタ、更新終了装置、２本の変数１〜ｎを格納するレコード記憶領域を有するメモリ、変数１〜ｎを格納するポインタレコード退避領域を有するメモリ、２本のレコード記憶領域のいずれかを指すスイッチを備え、
上位装置が変数ｉ（１≦ｉ≦ｎ）の更新を開始しようとするとき、開始要求を受信し、
更新開始装置は、他の上位装置が変数を更新中であるか否かを更新カウンタを用いて確認し、他の更新が行われていないならば、更新カウンタを増加させ、スイッチが指すレコード記憶領域の内容をポインタレコード退避領域へコピーし、レコード退避領域上のレコードに格納されている変数ｉの内容を上位装置へ送り、他の更新が行われている最中ならば、更新カウンタを増加させ、ポインタレコード退避領域上のレコードに格納されている変数ｉの内容を上位装置へ送り、
上位装置が変数ｉの更新を終了しようとしているとき、上位装置より終了要求と更新された変数ｉの内容Ｍを受信し、
更新終了装置は、レコード退避領域上のレコードに格納されている変数ｉに格納し、更新カウンタを減じ、他の上位装置が変数を更新中でないことを更新カウンタを用いて確認し、他の更新が行われていないならば、レコード退避領域上のレコードの内容をスイッチが指すレコード記憶領域とは逆のレコード記憶領域にコピーし、スイッチが現在とは反対側のレコード記憶領域を指すよう変更することを特徴とする。
【０００８】
請求項２の発明は、任意の上位装置より、変数１〜ｎ（ｎは任意の整数）のうち１つ以上の変数に対して任意の組み合わせ・順序でその内容の更新を指示されたとき、その更新を同時不可分の処理とすることを可能とし、さらにロールバックの指示によって更新の履歴を遡ることを可能とするトランザクション管理装置であって、
トランザクション管理装置は、更新開始装置、更新カウンタ、更新終了装置、２本以上の変数１〜ｎを格納するレコード記憶領域を有するメモリ、変数１〜ｎを格納するポインタレコード退避領域を有するメモリ、２本以上のレコード記憶領域を指すスイッチ、ロールバック装置を備え、
上位装置が変数ｉ（１≦ｉ≦ｎ）の更新を開始しようとするとき、上位装置より開始要求を受信し、更新開始装置へ渡し、
更新開始装置は、他の上位装置が変数を更新中であるか否かを更新カウンタを用いて確認し、他の更新が行なわれていないならば、更新カウンタを増加させ、スイッチが指す、変数１〜ｎを格納したレコード記憶領域の内容をレコード退避領域へコピーし、レコード退避領域上のレコードに格納されている変数ｉの内容を上位装置へ送り、他の更新が行われている最中ならば、更新カウンタを増加させ、レコード退避領域上のレコードに記憶されている変数ｉの内容を上位装置へ送り、
上位装置が変数ｉの更新を終了とするとき、上位装置より終了要求と更新された変数ｉの内容Ｍを受信し、更新終了装置へ渡し、
更新終了装置は、レコード退避領域上のレコードに格納されている変数ｉにＭを記憶し、更新カウンタを減じ、他の上位装置が変数を更新中でないことを更新カウンタを用いて確認し、他の更新が行われていないならば、レコード退避領域上のレコードの内容をスイッチが指すレコード記憶領域の次のレコード記憶領域にコピーし、スイッチの値を１つ増し、現在の次のレコード記憶領域を指すように変更し、
また、任意の上位装置より、変数１〜ｎのうち１つ以上の変数に対して任意の組み合わせ・順序でその内容の更新した後にロールバックを指示されたとき、上位装置より段数ｒ（ｒは１以上の整数）を受信し、ロールバック装置へ渡し、
ロールバック装置は、現在のスイッチの値よりｒを減じ、スイッチの指すレコード記憶領域を変更することを特徴とする。
【０００９】
請求項３の発明は、任意の上位装置より、記憶領域上の構造体１〜ｎ（ｎは任意の整数）のうち１つ以上の構造体に対して任意の組み合わせ・順序でその内容の更新を指示されたとき、その更新を同時不可分の処理とすることを可能とするトランザクション管理装置であって、
トランザクション管理装置は、更新開始装置、更新カウンタ、更新終了装置、２本のログインデックス１〜ｎを格納するレコード記憶領域を有するメモリ、ログインデックス１〜ｎを格納するポインタレコード退避領域を有するメモリ、ｎ本のインデックスと内容を格納した構造体記憶領域を有するメモリ、２本のレコード記憶領域のいずれかを指すスイッチを備え、
上位装置が構造体ｉ（１≦ｉ≦ｎ）の更新を開始しようとするとき、上位装置より開始要求を受信し、更新開始装置へ渡し、
更新装置は、他の上位装置が構造体を更新中であるか否かを更新カウンタを用いて確認し、他の更新が行われていないならば、更新カウンタを増加させ、スイッチが指す、ログインデックス１〜ｎを格納したレコード記憶領域の内容をレコード退避領域へコピーし、レコード退避領域上のレコードに格納されている構造体ｉに固有のログインデックスの指すログの内容を上位装置へ渡し、他の更新が行われている最中ならば、更新カウンタを増加させ、レコード退避領域上のレコードに記憶されている構造体ｉに固有のログインデックスの指すログの内容を上位装置へ渡し、
上位装置が変数ｉ（１≦ｉ≦ｎ）の更新を終了しようとするとき、上位装置より終了要求を受信し、更新終了装置へ渡し、
更新終了装置は、更新カウンタを減じ、レコード退避領域上のレコードに格納されている変数ｉに固有のログインデックスが指すログとは異なるログへ上位装置から渡された構造体ｉの新しい内容をコピーし、その場所を指すようにレコード退避領域上のレコードに格納されているログインデックスを更新し、他の上位装置が変数を更新中でないことを更新カウンタを用いて確認し、他の更新が行われていないならば、レコード退避領域上のレコードの内容をスイッチが指すレコード記憶領域とは逆のレコード記憶領域にコピーし、スイッチが現在とは反対側のレコード記憶領域を指すように変更することを特徴とする。
【００１０】
本発明のトランザクション装置は、更新対象のバックアップを不揮発性記憶装置上に持つ必要はなく、更新はすべて揮発性記憶領域上で行うことができる。一般的に揮発性記憶領域への書き込みは不揮発性記憶領域への書き込みに比べて非常に高速に行えるため、不揮発性記憶領域への書き込みによる時間的コストを抑えることができる。また、本技術では更新時にオリジナルの変数には手を加えないため、いずれの更新が失敗した場合でも、自動的に全ての変数を更新前の状態に戻すことができ、複雑なリカバリ機能の必要がなくなる。また、１つ以上の変数に対する任意の組み合わせ・順序の更新を同時不可分とするには、同時にすべての更新が確定される必要があるが、従来の技術ではバックアップ領域のクリアが必要なため、バックアップの数に比例して時間がかかるのに対し、本技術でレコードの切り換えだけで行えるため、一定時間内で行うことができる。
従って、上記理由により本トランザクション管理装置は、省資源かつ高速に実現可能である。
【００１１】
【発明の実施の形態】
本発明の実施の形態を説明する。
（実施例１）
図１に実施例１のトランザクション管理装置の構成を示す。
トランザクション管理装置は、更新開始装置、更新カウンタＣ（初期値を０とする）、更新終了装置、参照装置、不揮発性メモリ上の２本（＃０,＃１）の変数１〜ｎを格納するレコード記憶領域及び揮発性メモリ上の変数１〜ｎを格納するポインタレコード退避領域ＲＳ（ワークエリア）、レコード記憶領域の切り換えを行うスイッチＳから構成される。
【００１２】
トランザクション管理装置の動作を説明する。
上位装置が変数ｉ（１≦ｉ≦ｎ、ｎ:任意の整数）の更新を開始しようとするとき、トランザクション管理装置は上位装置より開始要求と変数ｉのID（識別子）を受信し、更新開始装置に渡し、更新開始装置は、▲１▼他の上位装置が変数を更新中でないことを更新カウンタＣを用いて確認し、すなわち更新カウンタＣが０であれば、Ｃを１つ増し、スイッチＳが指す変数１〜ｎ（＃０）を格納したレコード（変数１〜変数ｎ）の内容をポインタレコード退避領域ＲＳにコピーし、レコード退避領域ＲＳ上のレコードに格納されている変数ｉの内容を上位装置へ送り、▲２▼更新カウンタＣが０以外、すなわち更新が行われている最中ならば、更新カウンタＣを１つ増し、レコード退避領域ＲＳ上のレコードに格納されている変数ｉの内容を上位装置へ送る。
【００１３】
上位装置が変数ｉの更新を終了しようとするとき、トランザクション管理装置は上位装置より終了要求と更新された変数ｉの内容Ｍを受信し、更新終了装置に渡し、更新終了装置は、ポインタレコード退避領域ＲＳ上のレコードに格納されている変数ｉにＭを格納し、更新カウンタＣを１つ減じ、他の上位装置が変数を更新中でないことを更新カウンタＣを用いて確認し、更新カウンタＣが０、すなわち他の更新が行われていないならば、レコード退避領域ＲＳ上のレコードの内容をスイッチＳが指すレコード記憶領域とは逆のレコード記憶領域（＃１）にコピーし、スイッチＳが現在とは反対側のレコード記憶領域（＃１）を指すように変更する。
【００１４】
参照装置は、上位装置からの参照要求と変数ｉのIDを受信し、記憶している変数ｉの内容を上位装置に送信する。
【００１５】
実施例１を詳細に説明する。
図４は、本発明が適用されるICカードの構成例を示す。
このICカードは、カードリーダ・ライタ（R／W）との間のデータ入出力制御を行う入出力制御部（I／O）、マイクロプロセッサ(CPU)、ROM、RAM、EEPROMから構成される。
RAMはCPUがプログラムを実行するために利用する揮発性の記憶領域であり、ROMはCPUが実行するプログラムを格納するメモリであり、EEPROMはプログラムがデータを格納するためにする不揮発性の記憶領域である。
本発明は、CPU、ROM、RAM、EEPROMによって更新手段を実現する。
【００１６】
図５は、RAMとEEPROMの内容説明図である。
本実施形態では、EEPROMに、レコードのスイッチＳ、レコードのログ（２本）、変数のログ（２本×変数の数）が用意される。ログは２つの領域により構成され、各変数（もしくはレコード）の現在の値と一つ前の値をそれぞれ格納する。
【００１７】
レコードは、図６に示す構造をしており、各フィールドで、各変数のログの２本（＃０,＃１）中どちらが現在の変数の値を記憶しているのかを示す情報が格納される。
レコードのスイッチＳは、２本のレコードのログのどちらが現在の値を記憶しているのかを示す情報が格納される。
RAMには各変数（レコード）のテンポラリな値を格納するためのワークエリア（ポインタレコード退避領域ＲＳ）と実行中のトランザクションの数をカウントする更新カウンタが用意される。
【００１８】
図７は、ROMに格納された制御プログラムに従ってCPUにより実現される本発明の機能ブロック図である。
トランザクション管理装置はEEPROMとRAMを有し、EEPROM上のログで管理された変数の複数のトランザクションに跨る更新を同時不可分に行なうものであり、上位装置は変数の更新トランザクションを行う実体であり、トランザクションの前後に、開始要求と終了要求をトランザクション管理装置へ行う。
トランザクション管理装置は開始要求を受けると、図８のシーケンスに従って、更新対象となる変数の値をEEPROMのログからRAMのワークエリアへコピーし、上位装置はワークエリア上で更新を行う。
【００１９】
トランザクション開始シーケンスを以下に示す。
１.上位装置からの開始要求を受けると、更新カウンタが０であるか否か判断する。０である場合は２.へ移行し、０でない場合は３.へ移行する。
２.レコードスイッチＳが指すレコードをRAM上のワークエリアへコピーする。
３.更新カウンタを１つ増す。
４.RAM上のレコード内の変数に対応するフィールドが示すログのデータをRAM上のワークエリアへコピーして終了する。
トランザクション管理装置は終了要求を受けると、図９のシーケンスに従って、RAMのワークエリア上のデータをEEPROMのログへ格納する。
【００２０】
トランザクション終了シーケンスを以下に示す。
１.上位装置からの終了要求を受けると、ワークエリア上の変数の内容を変数ログの１つ前の状態を格納している方へコピーする。
２.ワークエリア上のレコードの変数に対応するフィールドの値をワークエリア上の変数の内容をコピーしたログへの情報で更新する。
３.更新カウンタを１つ減らす。
４.更新カウンタが０であるか否か判断する。０である場合には５.へ移行し、０でなければ終了する。
５.レコードスイッチの指すレコードとは逆のレコードへワークエリア上のレコードをコピーする。
６.レコードスイッチＳを切換えて終了する。
【００２１】
次に、この実施の形態を用いて図１０のような処理を行う場合を説明する。
図１０の処理は、あるトランザクション(Tr1)の中からさらにトランザクション(Tr2)が発生するような例を示している。
図１０のTR1,TR2を実施する上位装置をそれぞれポイントAP、電子現金APとする。
ポイントAPはポイントを変数で管理し、自トランザクション(Tr1)で更新を行うと共に、電子現金APを使って支払処理を行う。電子現金APは残高を変数で管理し、自トランザクション(Tr2)で更新を行う。このときTr1とTr2の実行は同時不可分でなくてはならない。なぜならば、Tr1の中でTr2が行われたとき、どちらかのトランザクションが失敗すると、支払を行っていないのにポイントを増加させたり、支払が完了したのにポイントが増加されないといった事態が生じるからである。
このとき、EEPROMには図１１のように、レコードスイッチ、２つのフィールドを持つレコードが２本（＃１,＃２）、電子現金APで更新する変数のログ（残高ログ）、ポイントAPで更新する変数のログ(ポイントログ)がそれぞれ２本（＃０,＃１）用意される。RAMにはレコードのワーク領域とそれぞれの変数のワーク領域、更新カウンタが用意される。
【００２２】
図１２に上位装置(電子現金AP、ポイントAP）とトランザクション管理装置のトランザクションのシーケンス、図１３にトランザクション管理装置のEEPROMとRAMの内容説明図を示す。
ここで、各ログの番号を＃で表すこととし、それぞれの初期値を以下のようにする（図１３（初期）参照）。
・更新カウンタ  ０
・レコードスイッチ  ０
・レコードログ＃０  １０
・レコードログ＃１  ００
・残高ログ＃０  ３００
・残高ログ＃１  ２００
・ポイントログ＃０  ４０
・ポイントログ＃１  ３０
上記の初期値の意味は、更新カウンタが０なのでトランザクションは行われていない。レコードスイッチが０なので、現在のレコードの値を記憶しているのはレコードログ＃０である。レコードログの第１フィールドが残高ログ、第２フィールドがポイントログの情報を格納しているとすれば、レコードログ＃０の値は１０なので現在の残高の値を記憶しているのは残高ログ＃１、すなわち２００円であり、現在のポイントの値を記憶しているのはポイントログ＃０、すなわち４０ポイントである。
【００２３】
図１２、図１３を参照してシーケンスを説明する。
(1)ポイントAPが自分のトランザクションTr1を開始するためにトランザクション管理装置に対して開始要求を出す。
トランザクション管理装置はこの要求を受信し、更新開始装置は、更新カウンタを調べ、０であるのでカウンタを１増し(更新カウンタ[１]）、レコードスイッチが指すレコードログ[＃０]の内容をレコードワークエリアへコピーする（レコードのワークエリア[１０]）(i)。さらにワークエリア上のレコードログからポイントAPが更新する変数（ポイント）の現在の値を格納したログ（ポイントログ＃０[４０]）の情報を得て、その値をポイントのワークエリアへコピーする(ii)。
(2)ポイントAPは支払を行うために電子現金APを呼び出す。
(3)電子現金APは自分のトランザクションTr2を開始するためにトランザクション管理装置に対して開始要求を出す。トランザクション管理装置では、更新カウンタを調べ、０ではないのでカウンタを１つ増し(更新カウンタ[２]）、ワークエリア上のレコードログ（＃０[１]）から電子現金APが更新する変数（残高）の現在の値を格納したログ（残高ログ＃１[２００]）の情報を得て、その値を残高のワークエリアへコピーする(iii)。
(4)電子現金APはワークエリア上の残高を減額（更新）する（支払額[１００]：残高のワークエリア[１００]）（iv）。
(5)電子現金APは自分のトランザクションTr2を終了するためにトランザクション管理装置に対して終了要求を出す。
【００２４】
トランザクション管理装置は終了要求を受信し、更新終了装置は、ワークエリア上の残高[１００]を残高ログの１つ前の値を格納しているログ（＃０）へ格納し、ワークエリア上のレコードの値を先ほど格納したログの情報へ更新し（＃０[０]）、さらに更新カウンタを調べ、０ではないのでカウンタを１つ減じる（更新カウンタ[１]）(v)。
(6)電子現金APはポイントAPへ制御を戻す。
(7)ポイントAPは支払額[１００]に応じたポイント数[１０]を増やすために、ワークエリア上のポイント数を増やす（ポイントのワークエリア[５０]）(vi)。
(8)ポイントAPは自分のトランザクションTr1を終了するためにトランザクション管理装置に対して終了要求を出す。
【００２５】
トランザクション管理装置は、ワークエリア上のポイント数[５０]をポイントログの１つ前の値を格納しているログ（＃１）へ格納し、ワークエリア上のレコードの値を先ほど格納したログ（＃１）の情報へ更新し、さらに更新カウンタを調べ、０であるのでワークエリア上のレコードを、レコードスイッチが指すレコードとは逆のレコード（レコードログ＃１）へコピーし(vii)、さらにレコードスイッチを先ほどコピーしたレコードを指すように切り換える（レコードスイッチ[１](viii)。
この時点でTr1とTr2で行った更新が確定的なものとなる。なぜなら、各変数の値が格納されたログの情報を格納したレコードがスイッチによって切り換わったことにより、それ以降は切り換わったレコードの情報を以て各変数の値が決定されるからである。
【００２６】
本実施例は３つの特徴がある。
１つ目は、本方式が非常に簡易な制御で実現でき、ほとんどの更新はRAM上のワークエリア上で行えるため、高速に実現でき、ICカードのような非常にリソースの限られた形態にも適用できる。
【００２７】
２つ目は、従来技術と異なり障害発生時のリカバリ処理の必要がない。なぜならば、本方式において各変数の値を決定するのは、レコードスイッチが指すレコードによって指されるログの値である。上記例では各更新過程でオリジナルの値が一切変更されず、最後のレコードスイッチを切り換えるまでの更新はすべて一時的な更新として扱われるからである。つまり、障害が発生してもレコードスイッチが切り換わっていない限り有効なレコード上の各変数のログを指す情報は変更されず、すべての更新は自動的にキャンセルされ、処理開始時点の状態に戻る。また、レコードスイッチの切り換えには１ビットの更新で行えるため、更新の原子性が保証される。
【００２８】
３つ目は、本方式では各変数の値を現在と１つ前の２つの状態を２本のログで管理しており、さらに各変数のどちらのログが現在の状態かを示す情報を１つのレコードにまとめ、さらにレコード自体も現在の状態と１つ前の状態の２本のログで管理されている。従って、レコードのログを切り換える１つの操作で、そのレコード内で管理されている全ての変数のログの状態を切り換える、つまり値を同時更新することができ、これにより複数のトランザクションの同時不可分を実現している。また、同時不可分に実行したいトランザクションの数が増加しても、変数のログの状態を管理するレコード自体を長くすればよく、レコードスイッチを切り換える一定時間で同時更新が可能である。
【００２９】
（実施例２）
実施例２は、ロールバック、すなわちトランザクションがコミットせずに終了した場合にデータベースの変更されたデータを元に戻す処理を備える点で実施例１と相違する。
図２に実施例２のトランザクション管理装置の構成を示す。
トランザクション管理装置は、更新開始装置、更新カウンタＣ（初期値を０とする）、更新終了装置、参照装置、不揮発性メモリ上の２本以上（＃０,＃１,・・・）の変数１〜ｎ（ｎは任意の整数）を格納するレコード記憶領域及び揮発性メモリ上の変数１〜ｎを格納するポインタレコード退避領域ＲＳ（ワークエリア）、レコード記憶領域の切り換えを行うスイッチＳ、ロールバック装置から構成される。
【００３０】
トランザクション管理装置の動作を説明する。
上位装置が変数ｉ（１≦ｉ≦ｎ）の更新を開始しようとするとき、上位装置より開始要求を受信し、更新開始装置へ渡し、
更新開始装置は、他の上位装置が変数を更新中でないことを更新カウンタを用いて確認し、更新カウンタＣが０、すなわち他の更新が行われていないならば、更新カウンタＣを１つ増し、スイッチＳが指す、変数１〜ｎを記憶したレコード記憶領域（＃０）の内容をポインタレコード退避領域ＲＳへコピーし、ポインタレコード退避領域ＲＳ上のレコードに格納されている変数ｉの内容を上位装置へ送り、更新カウンタＣが０以外、すなわち他の更新が行われている最中ならば、更新カウンタを１つ増し、ポインタレコード退避領域ＲＳ上のレコードに記憶されている変数ｉの内容を上位装置へ送り、
上位装置が変数ｉの更新を終了しようとするとき、上位装置より終了要求と更新された変数ｉの内容Ｍを受信し、更新終了装置へ渡し、
更新終了装置は、レコード退避領域ＲＳ上のレコードに格納されている変数ｉに変数ｉの内容Ｍを記憶し、更新カウンタを１つ減じ、他の上位装置が変数を更新中でないことを更新カウンタＣを用いて確認し、更新カウンタＣが０、すなわち他の更新が行われていないならば、ポインタレコード退避領域ＲＳ上のレコードの内容をスイッチＳが指すレコード記憶領域の次のレコード記憶領域（＃１）にコピーし、スイッチＳの値を１つ増し、現在の次のレコード記憶領域（＃１）を指すように変更し、順次、上記動作を繰り返す。
【００３１】
また、任意の上位装置より、変数１〜ｎのうち１つ以上の変数に対して任意の組み合わせ・順序でその内容の更新した後にロールバックを指示されたとき、上位装置より段数ｒ（ｒは１以上の整数）を受信し、ロールバック装置へ渡し、
ロールバック装置は現在のスイッチＳの値よりｒを減じ、スイッチＳの指すレコード記憶領域を変更する。
【００３２】
（実施例３）
実施例３は、実施例１の２本のレコード記憶領域に変数１〜ｎを記憶する代わりにログインデックス１〜ｎを記憶し、また、それぞれにログ１〜ｎを構成した構造体１〜ｎを備えた点で相違する。
【００３３】
図３に実施例３のトランザクション管理装置の構成を示す。
トランザクション管理装置は、更新開始装置、更新カウンタＣ（初期値を０とする）、更新終了装置、参照装置、２本（＃０,＃１）のログインデックス１〜ｎを記憶したレコード記憶領域を有するメモリ、ログインデックス１〜ｎを記憶するポインタレコード退避領域ＲＳを有するメモリ、レコード領域のレコードの切り換えを行うスイッチＳ、それぞれにログを構成したｎ本の構造体を備える。
トランザクション管理装置の動作を説明する。
【００３４】
上位装置が構造体ｉの更新を開始しようとするとき、トランザクション管理装置は上位装置より開始要求を受信し、更新開始装置へ渡し、
更新装置は、他の上位装置が構造体を更新中でないことを更新カウンタＣを用いて確認し、Ｃが０、すなわち他の更新が行われていないならば、Ｃを１つ増し、スイッチＳが指す、ログインデックス１〜ｎを格納したレコード記憶領域（＃０）の内容をポインタレコード退避領域ＲＳへコピーし、ポインタレコード退避領域ＲＳ上のレコードに格納されている構造体ｉに固有のインデックスの指すログの内容を上位装置へ渡し、更新カウンタＣが０以外、すなわち他の更新が行われている最中ならば、更新カウンタＣを１つ増し、ポインタレコード退避領域ＲＳ上のレコードに格納されている構造体ｉに固有のログインデックスの指すログの内容を上位装置へ渡す。
【００３５】
上位装置が変数ｉの更新を終了しようとするとき、トランザクション管理装置は上位装置より終了要求を受信し、更新終了装置へ渡し、
更新終了装置は、更新カウンタＣを１つ減じ、ポインタレコード退避領域ＲＳ上のレコードに格納されている変数ｉに固有のログインデックスが指すログとは異なるログへ上位装置から渡された構造体ｉの新しい内容をコピーし、その場所を指すようにポインタレコード退避領域ＲＳ上のレコードに格納されているログインデックスを更新し、他の上位装置が変数を更新中でないことを更新カウンタＣを用いて確認し、Ｃが０、すなわち他の更新が行われていないならば、ポインタレコード退避領域ＲＳ上のレコードの内容をスイッチＳが指すレコード記憶領域とは逆のレコード記憶領域（＃１）にコピーし、スイッチＳが現在とは反対側のレコード記憶領域を指すように変更する。
【００３６】
実施例３を詳細に説明する。
本発明が適用されるICカードの構成例は実施例１のものと同一である。
本実施例の実施例１との違いは、主にEEPROMの内容と実際の更新対象となるデータの更新手段を上位装置へ委譲し、対象とする変数の種類、構造により自由度をもたせた点である。
図１４は、トランザクション管理装置のRAMとEEPROMの内容説明図である。
本実施形態では、EEPROMに、レコードのスイッチ、レコードのログ（２本）、各上位装置が管理するデータベースDB（各DBの種類・構造は上位装置に依る）、すなわち構造体が用意される。
【００３７】
レコードは、図１５のような構造をしており、各フィールドに格納されるデータの種類は特に規定しない。レコードのスイッチは、２本のレコードのログのどちらかが現在の値を記憶しているのかを示す情報が格納される。RAMにはレコードのテンポラリな値を格納するためのワークエリアと実行中のトランザクションの数をカウントする更新カウンタが用意される。
図１６はROMに格納された制御プログラムに従ってCPUにより実現される本発明の機能ブロック図である。
【００３８】
トランザクション管理装置はEEPROMとRAMを利用し、EEPROM上の各上位装置によって任意の順番で実行されるDB更新トランザクションを同時不可分に行うものである。
上位装置はEEPROM上のDB更新トランザクションを行う実体であり、トランザクション開始時にトランザクション管理装置へ開始要求を出し、その応答でトランザクション管理装置のレコード中のフィールドに格納されている情報を受け取る。そして、終了時に終了要求をトランザクション管理装置へ行う。
【００３９】
トランザクション管理装置は上位装置から開始要求を受けると、図１７のシーケンスに従って処理を行う。
トランザクション開始シーケンスを以下に示す。
１.上位装置からの開始要求を受けると、更新カウンタが０であるか否か判断する。０である場合は２.へ移行し、０でない場合は３.へ移行する。
２.レコードスイッチが指すレコードをRAM上のワークエリアへコピーする。
３.更新カウンタを１つ増やす。
４.RAM上のレコード内のフィールドに格納されている情報を上位装置へ送り終了する。
【００４０】
上位装置は、トランザクション管理装置のレコード内のフィールドに格納された情報（インデックス）を受信し、DBの更新を行い、更新後のDB情報を終了要求とともにトランザクション管理装置へ渡す。
トランザクション管理装置は、上位装置から受信したDB情報を図１８のシーケンスに従って処理する。
トランザクション終了シーケンスを以下に示す。
１.上位装置からの終了要求を受けると、上位装置から受信した情報をワークエリア上のレコードのフィールドに格納する。
２.更新カウンタを１つ減らす。
３.更新カウンタが０であるか否か判断する。０である場合には４.へ移行し、０でなければ終了する。
４.レコードスイッチの指すレコードとは逆のレコードへワークエリア上のレコードをコピーする。
５.レコードスイッチを切り替えて終了する。
【００４１】
次に任意の複数個のデータベースの更新を同時不可分に行う場合を説明する。
この例では、２つのデータベース（チケットDB、ログDB）の場合を説明する。
Tr1とTr2の２つのトランザクションを実行する機能を持った上位装置（電子チケットAP）がある。Tr1,Tr2それぞれは次に示すような処理を行うトランザクションである。
Tr1は外部からの要求によって電子チケットAP内のチケットDBから該当するチケットを検索し、チケットを更新（改札等）する。Tr2は電子チケットAP内の使用ログDBにチケットの更新記録等の書き込みを行う。
【００４２】
このときEEPROM上にはレコードスイッチ、２つのフィールドを持つレコード２本に加え、Tr1で使用されるチケットDB、Tr2でされる使用ログDBが用意される。
トランザクション管理装置のEEPROM上の各DBの構造を図１９に示す。
RAMにはレコードのワーク領域とそれぞれの変数のワーク領域（ポインタレコード退避領域ＲＳ）、更新カウンタが用意される。レコードのログは、図１９のように２本（＃０,＃１）のレコード記憶領域内に２つのフィールド(Tr1,Tr2)が用意されるものとし、それぞれのフィールドに次に書き込めるDB（構造体）のアドレス（インデックス）を格納するものとする。
【００４３】
このとき、電子チケットAPがTr1とTr2により構成されるトランザクションの実行、すなわち電子チケットを更新し（チケットDBの更新)、同時に履歴を残す（使用ログの更新）ことを同時不可分に行う実施例を示す。
図２０に上位装置（電子現金AP）とトランザクション管理装置のシーケンスを示し、図２１にトランザクション管理装置のEEPROMとRAMの内容説明図を示す。
レコードのスイッチ、レコードのログ、チケットDB、ログDBの最初の状態は図２１に示されたものとする。
(1)電子チケットAPは処理を開始するために、チケットDBの更新トランザクションTr1の開始をトランザクション管理装置へ通知する。
(2)トランザクション管理装置では更新カウンタＣを調べ、０であるのでカウンタを１つ増し、さらにレコードのスイッチが指すレコードログ（＃０）の内容[２４]をレコードのワークエリアへコピーする。そしてワークエリア上のレコードログのTr1のフィールドに格納されている値[２]を返す。ここで、トランザクション管理装置から値を受け取った電子チケットAPは、その値をチケットDB内で書き込み可能なアドレス[２]を指すものとして扱う。
(3)電子チケットAPは該当するチケット（チケット５とする）をチケットDBから検索し、そのアドレスを得る。
(4)(3)で得たアドレス[５]に格納されたデータ（チケット５）を(2)で得たアドレス[２]にコピーする（チケット５'）。
(5)電子チケットAPは(3)でコピーした先のデータ（チケット５）に対して更新（回数減）を行う。
(6)電子チケットAPはチケットの更新履歴を残すために使用ログDBの更新トランザクションTr2の開始をトランザクション管理装置へ通知する。
(7)トランザクション管理装置では更新カウンタを調べ、０ではないのでカウンタを１つ増し、ワークエリア上のレコードログのTr2のフィールドに格納されている値[４]を返す。トランザクション管理装置から値を受け取った電子チケットAPは、その値を使用ログDB内で書き込み可能なアドレスを指すものとして扱う。
(8)電子チケットは(7)で得たアドレス[４]に履歴を書き込む。
(9)電子チケットAPは（(7)で得たアドレス[４]＋１）mod Nという計算を行う。（Nはログの大きさであり、ログをリングバッファとしてするための計算）
(10)電子チケットAPはTr2を終了させるためにトランザクション管理装置に対して(9)で計算した値[１]とともに終了要求を出す。
トランザクション管理装置は渡された値をワークエリア上のレコードのTr2のフィールドに格納し、さらに更新カウンタを調べ、０ではないのでカウンタを1つ減じる。
【００４４】
(11)電子チケットAPはTr1を終了させるためにトランザクション管理装置に対して(3)における検索で得たアドレスの値[５]とともに終了要求を出す。
トランザクション管理装置は(11)で渡された値[５]をワークエリア上のレコードのTr1のフィールドに格納し（(11)の後の状態  その１）、さらに更新カウンタを調べ、０であるのでワークエリア上のレコードを、レコードスイッチが指すレコード（＃０）とは逆のレコード（＃１）へコピーし（(11)の後の状態  その２）、さらにレコードスイッチを先ほどコピーしたレコードを指すように切り換える（(11)の後の状態  その３）。
【００４５】
この時点でTr1とTr2で行った更新が確定的なものとなる。なぜなら、スイッチが切り換わる直前のチケットDBでは、(3)で検索したアドレスには更新前のチケット、(2)で得たアドレスには更新後のチケットが格納されており、使用ログDBでは、(7)で得たアドレスには(4)におけるチケットの更新ログが残っている。しかし、この時点で障害が発生したものとしてもトランザクション管理装置ではレコードが切り換わっていないため、再開後、再度(2)で得られる情報は更新後のチケットが格納されるはずだった場所のアドレスであり、(7)で得られるアドレスも以前と同じである。つまり、再度同じ場所が上書きされる。しかし、レコードが切り換わるとそれ以降は(2)および(7)で得られる情報は、チケットDBであれば更新前のチケットが格納されていたアドレスが返され、使用ログDBであれば(7)で書き込んだログの次のアドレスが返されるようになるからである。
【００４６】
本実施形態は、実施例１の省リソース・高速に実現可能という特徴とリカバリ処理が必要ないという特徴に加えて、実際の更新対象となるデータへの操作を上位装置へ委譲したことにより、同時不可分の更新が行えるデータ構造に高い柔軟性を持たせることができるという特徴がある。例えば上記の例では、Tr1とTr2において、トランザクション管理装置から受信する情報の意味を上位装置内で解釈し、それぞれ更新の対象となるチケットDBと使用ログDBとで別の更新方法を行っている。実施例１の方法ではデータの更新をトランザクション管理装置で行うため、実施例３のように複数のDBがあり、１つは空き領域を検索して更新する方法、他方はサイクリックレコードのように更新する方法といった、それぞれ別の更新方法を採ることができなかった。また、実施例３では、トランザクション管理装置から受け取る情報を現在有効な変数の値が格納されたアドレスと解釈することで、実施例１のような使い方をすることも可能である。つまり上位装置の解釈次第でどのような更新方法をも取ることができる。
【００４７】
本発明のトランザクション管理装置は、CPUやメモリ等を有するコンピュータと、アクセス主体となるユーザが利用する利用者端末と、記録媒体から構成することができる。
記録媒体は、CD-ROM、磁気ディスク装置、半導体メモリ等の機械読み取り可能な記録媒体であり、ここに記録されたプログラムは、コンピュータに読み取られ、コンピュータの動作を制御し、コンピュータ上に前述した実施の形態における各構成要素、すなわち更新開始装置、更新カウンタ、更新終了装置、参照装置、ロールバック装置、スイッチＳ、メモリ上のレコード記憶領域、ポインタレコード退避領域ＲＳ、構造体等と各処理を実現する。
【００４８】
【発明の効果】
以上説明したように、本発明は、１、ほとんどの更新はRAM上のワークエリア上で行えるため、高速に実現でき、ICカードのような非常にリソースの限られた形態にも適用できる、２、従来技術と異なり障害発生時のリカバリ処理の必要がない、３、各変数の値を現在と１つ前の２つの状態を２本のログで管理しており、さらに各変数のどちらかのログが現在の状態かを示す情報を１つのレコードにまとめ、さらにレコード自体も現在の状態と１つ前の状態の２本のログで管理され、レコードのログを切り換える１つの操作で、そのレコード内で管理されている全ての変数のログの状態を切り換えることができ、値を同時更新することができ、これにより複数のトランザクションの同時不可分を実現することができる、４、上位装置からのロールバック要求によりデータベースの変更されたデータを元に戻すことが可能となる、５、実際の更新対象となるデータへの操作を上位装置へ委譲したことにより、同時不可分の更新が行えるデータ構造に高い柔軟性を持たせることができる。
【図面の簡単な説明】
【図１】本発明の実施例１のトランザクション管理装置の構成図。
【図２】本発明の実施例２のトランザクション管理装置の構成図。
【図３】本発明の実施例３のトランザクション管理装置の構成図。
【図４】本発明が適用されるICカードの構成例を示す図。
【図５】実施例１のトランザクション管理装置のEEPROMとRAMの内容説明図。
【図６】実施例１のレコードの構造を示す図。
【図７】実施例１のトランザクション管理装置の機能ブロック図。
【図８】実施例１のトランザクション開始シーケンス。
【図９】実施例１のトランザクション終了シーケンス。
【図１０】実施例１のトランザクションのシーケンス。
【図１１】図１０のシーケンスにおけるトランザクション管理装置のEEPROMとRAMの内容説明図。
【図１２】実施例１のトランザクションの他のシーケンス。
【図１３】図１２のシーケンスにおけるトランザクション管理装置のEEPROMとRAMの内容説明図。
【図１４】実施例３のトランザクション管理装置のEEPROMとRAMの内容説明図。
【図１５】実施例３のレコードの構造を示す図。
【図１６】実施例３のトランザクション管理装置の機能ブロック図。
【図１７】実施例３のトランザクション開始シーケンス。
【図１８】実施例３のトランザクション終了シーケンス。
【図１９】実施例３のトランザクション管理装置のEEPROMとRAMの内容説明図。
【図２０】実施例３のトランザクションのシーケンス。
【図２１】図２０のシーケンスにおけるトランザクション管理装置のEEPROMとRAMの内容説明図。
【図２２】従来技術のトランザクションのシーケンス。
【図２３】従来のトランザクション管理装置の構成図。
【図１】
0004027055.tif 000002
【図２】
0004027055.tif 000003
【図３】
0004027055.tif 000004
【図４】
0004027055.tif 000005
【図５】
0004027055.tif 000006
【図６】
0004027055.tif 000007
【図７】
0004027055.tif 000008
【図８】
0004027055.tif 000009
【図９】
0004027055.tif 000010
【図１０】
0004027055.tif 000011
【図１１】
0004027055.tif 000012
【図１２】
0004027055.tif 000013
【図１３】
0004027055.tif 000014
【図１４】
0004027055.tif 000015
【図１５】
0004027055.tif 000016
【図１６】
0004027055.tif 000017
【図１７】
0004027055.tif 000018
【図１８】
0004027055.tif 000019
【図１９】
0004027055.tif 000020
【図２０】
0004027055.tif 000021
【図２１】
0004027055.tif 000022
【図２２】
0004027055.tif 000023
【図２３】
0004027055.tif 000024