この特集のトップページへ
Chapter 5:ビジネスロジック層の構築

head2.gif 5.4.3 コミット処理
 すでに説明したように,トランザクション処理は,トランザクション範囲が作られたときにMS DTCに通知することで開始される。では,トランザクション処理の終了は,どのようにしてMS DTCに通知されるのだろうか。

 COM+は,次の2つの規定によって,トランザクションの成功または失敗を決定する。

規定-1)何もしなければ,トランザクションは基本的に成功する
 COMオブジェクトがCOM+に対してトランザクションの中止を明示的に示さない場合には,トランザクションは成功する。つまり,基本的にデフォルトのトランザクションの状態は「成功」である。したがって,トランザクション範囲内のCOMオブジェクトがトランザクションを中止(アボート)したいときに「中止しろ」とCOM+に告げなければ,トランザクションは成功する。
 COM+の場合,トランザクションの中止命令はConsistentというフラグで管理される(このフラグはHappyフラグとも呼ばれる)。Consistentフラグは,コンテキストに含まれるデータである。ConsistentフラグがTrueのとき,そのCOMオブジェクトによる操作(トランザクションではなく,1つのCOMオブジェクトの操作である)は成功を意味し,Falseのときには失敗を意味する。Consistentフラグはコンテキストに含まれるデータであるから,すべてのCOMオブジェクトが備えている。そして,COMオブジェクトがアクティブ化されるとき,アクティベータがConsistentフラグにTrueを設定する(そのため,デフォルトでトランザクションは「成功」に設定されることになる)。なお,トランザクションタイムアウトが発生した場合には,自動的にConsistentフラグがFalseに設定され,トランザクションの失敗を示す。
 
規定-2)トランザクションをコミットするかアボートするかを決定するのは,COMオブジェクトを非アクティブ化するときである
 トランザクションの状態は,COMオブジェクトを非アクティブ化するときに決定される。COMオブジェクトが非アクティブ化されるのは,(1)COMクライアントがCOMオブジェクトを手放す場合,(2)COMオブジェクトが自らDoneフラグをTrueに設定して非アクティブ化する場合(ジャストインタイムアクティベータ),といういずれかの場合である。
 トランザクションがどのように決まるのかは,非アクティブ化されたCOMオブジェクトがルートオブジェクトなのか,そうでないのかによって異なる。ルートオブジェクトとは,最初にトランザクション範囲を作ったCOMオブジェクトである。つまり,COM+を使ってビジネスロジックを構築するほとんどの場合,ルートオブジェクトとは,COM+の管理外のCOMクライアント(プレンゼンテーション層のアプリケーション)から呼び出された最初のCOMオブジェクトを示す。
 
規定-2a)ルートオブジェクトでない場合
 非アクティブ化されたときに,ConsistentフラグがTrueに設定されている,つまり成功を意味していたら,何もしない。これに対して,ConsistentフラグがFalseに設定されている,すなわち失敗を意味していたならば,トランザクション全体をアボートすることが決定され,トランザクションの中止命令がMS DTCに通知される。その後,トランザクション範囲に含まれるルートオブジェクト以外のすべてのCOMオブジェクトは,自動的に非アクティブ状態になる。
 
規定-2b)ルートオブジェクトの場合
 トランザクション範囲に含まれるすべてのCOMオブジェクトに備わるConsistentフラグを調査する。このとき,1つでもConsistentフラグがFalseに設定されている,すなわち失敗を意味しているCOMオブジェクトがあれば,トランザクション全体をアボートすることが決定され,トランザクションの中止命令がMS DTCに通知される。
 そうではなく,すべてのCOMオブジェクトのConsistentフラグがTrueに設定されている,すなわち成功を意味していれば,トランザクション全体を成功することが決定され,トランザクションの成功命令がMS DTCに通知される。
 いずれの場合にも,トランザクション範囲に含まれるすべてのCOMオブジェクトは,非アクティブ化される。

 

 少々わかりにくいと思われるので,図示しながらトランザクションがコミットされるまでの過程を説明してゆこう。まず,Fig.5-25のように,トランザクションが[必要]もしくは[新しく必要]に設定されたCOMオブジェクトがCOMクライアントによって実体化されたとする。このCOMオブジェクトをRとしよう。このとき,トランザクション範囲が作成され,実体化されたCOMオブジェクトがルートオブジェクトとなる。COMオブジェクトが実体化され,さらにアクティブ化されたときには,必ずConsistentフラグはTrueに初期化される。また,このときトランザクション範囲が作られることから,MS DTCに対してトランザクションを開始する通知が送られる。

Fig.5-25 ルートオブジェクトの実体化
fig5_25.gif

 次に,実体化されたCOMオブジェクトが別のCOMオブジェクトを実体化したとする。このCOMオブジェクトをSと呼ぶことにする。このとき,Sのトランザクションが[必要]に設定されているならば,同じトランザクション範囲に入るので,Fig.5-26のようになる。

Fig.5-26 COMオブジェクトがさらに別のCOMオブジェクトを実体化する
fig5_26.gif

 COMオブジェクトが2つだけでは挙動がわかりづらいかもしれないので,RというCOMオブジェクトが,さらに別のTというCOMオブジェクトを実体化したものとしよう。ここでTのトランザクションが[必要]に設定されているとすれば,やはり同じトランザクション範囲に入り,Fig.5-27のようになる。

Fig.5-27 さらに別のCOMオブジェクトを実体化する
fig5_27.gif

 さて,Fig.5-27の状態から,どのようにしてトランザクションの状態が決まるかを説明しよう。

 まず,何もせずにRというCOMオブジェクトが非アクティブ化されたときのことを考える。このとき,どのCOMオブジェクトもConsistentフラグをFalseに設定していない。Rはルートオブジェクトであるから,規定-2b)によってRというCOMオブジェクトが非アクティブ化されたときに,MS DTCに対してトランザクションの成功(コミット)を通知する。また,Rが非アクティブ化されたことに伴い,同じトランザクション範囲に属するすべてのCOMオブジェクトも非アクティブ化される(Fig.5-28)。

Fig.5-28 トランザクションの成功
fig5_28.gif

 次に,そうではなくてFig.5-27の状態から,COMオブジェクトTがConsiststentフラグをFalseに設定したとする。このときには,まだどのCOMオブジェクトも非アクティブ化されていないので,トランザクションの状態は定まらない(Fig.5-29)。

Fig.5-29 TのConsistentフラグをFalseに設定する
fig5_29.gif

 Fig.5-29の状態で,Tが非アクティブ化されたとする。すると,TのConsistentフラグがFalseなので,規定-2a)によってトランザクションの状態は中止(アボート)にセットされる。また,このときルートオブジェクト以外のCOMオブジェクトは,非アクティブ化される(Fig.5-30)。

Fig.5-30 Tが非アクティブ化された場合
fig5_30.gif

 そうではなく,Fig.5-29の状態からRが非アクティブ化されたとする。このとき,Rはルートオブジェクトなので,規定-2b)によってこのトランザクション範囲に含まれるすべてのCOMオブジェクトのConsistentフラグが調査される。すると,TのConsistentフラグがFalseであることがわかる。このとき,MS DTCに対してトランザクションの中止命令が送信される。また,Rはルートオブジェクトであるから,Rが非アクティブ化されたのに伴い,同じトランザクション範囲に含まれるすべてのCOMオブジェクトが非アクティブ化される(Fig.5-31)。

Fig.5-31 Rが非アクティブ化された場合
fig5_31.gif

 ちなみに,Fig.5-29の状態からSが非アクティブ化されたときには,トランザクションの状態は変わらず,単純にSが非アクティブ化される以外の処理は実行されない。なぜなら,Sはルートオブジェクトではないので,規定-2b)は適用されず,ほかのCOMオブジェクトのConsistentフラグの状態を調べないからである(Fig.5-32)。

Fig.5-32 Sが非アクティブ化された場合
fig5_32.gif

 以上の処理をまとめておこう。COM+におけるトランザクションを理解するのに重要なのは,次の2点である。

1)ルートオブジェクト以外のCOMオブジェクトが非アクティブ化された場合
→そのCOMオブジェクトのConsistentフラグがFalseであれば,トランザクションを中止に設定し,ルートオブジェクト以外を非アクティブ化する。
 
2)ルートオブジェクトが非アクティブ化された場合
→トランザクション範囲に含まれるすべてのCOMオブジェクトのConsistentフラグを調べ,1つでもFalseに設定されているものがあれば,トランザクションを中止に設定する。そうでなければ,トランザクションは成功する。いずれの場合も,トランザクション範囲に含まれるすべてのCOMオブジェクトを非アクティブ化する。

 また,トランザクションの中止と成功についてまとめておくと,次のようになる。

1)トランザクションの成功
 トランザクションが成功するのは,(1)ルートオブジェクトが非アクティブ化された,(2)トランザクション範囲に属するすべてのCOMオブジェクトのConsistentフラグがTrueである,という2つの条件を満たす場合のみである。
 
2)トランザクションの失敗
 トランザクションが失敗するのは,(1)ルートオブジェクトが非アクティブ化されたときにトランザクション範囲に属するいずれかのCOMオブジェクトのConsistentフラグがFalseである,(2)ルートオブジェクト以外のCOMオブジェクトが非アクティブ化されたときに,そのCOMオブジェクトのConsistentフラグがFalseである,という2つの条件のどちらかを満たす場合である。

 いずれにせよ,トランザクションの状態が確定するのは,COMオブジェクトが非アクティブ化されたときだけであるという点に注意してもらいたい。

prevpg.gif Chapter 5-1 18/23 nextpg.gif