この特集のトップページへ
>
Chapter 5:ビジネスロジック層の構築
5.4.1 トランザクション機能の設定
●[必要]と[新しく必要]の違い
[必要]と[新しく必要]を選択したときは,どちらもトランザクションが機能する。これらのオプションを選択しているCOMオブジェクトが実体化された場合,Fig.5-18に示すように,新しいトランザクション範囲が作られ,そのなかにCOMオブジェクトが配置される(より厳密にいえば,トランザクション範囲はCOMオブジェクトとして表現されるが,そこまで深入りするのは避ける)。このトランザクション範囲に含まれるCOMオブジェクトが,ひとまとまりとして扱われ,トランザクションとして処理される。すなわち,トランザクション範囲に含まれるCOMオブジェクトがデータベースに対して実行した操作は,「すべて成功(コミット)」か「すべて中止(アボート)」のどちらかにしか推移しない。最初にトランザクション範囲を作ったCOMオブジェクトのことを,トランザクションの「ルートオブジェクト」と呼ぶ。
Fig.5-18 トランザクション範囲

Fig.5-18の状態から,トランザクションの範囲内にあるCOMオブジェクトが別のCOMコンポーネントを実体化して利用する場合の処理内容は,実体化するCOMコンポーネントのトランザクションが[必要]に設定されているか,それとも[新しく必要]に設定されているかによって異なる。前者の場合には,同じトランザクション範囲のなかに,実体化されたCOMオブジェクトが配置される。一方,後者の場合には,新しいトランザクション範囲が作られ,実体化されたCOMオブジェクトはそのなかに配置される(Fig.5-19)。つまり,[必要]と設定されていた場合には,2つのCOMオブジェクトのデータベース操作は1つのトランザクションとして扱われ,一方が失敗したら,もう一方はロールバックされることになる。これに対して[新しく必要]とした場合には,別のトランザクションで動作するため,互いの操作は影響しないことになる。
Fig.5-19 COMオブジェクトが別のCOMオブジェクトを利用する場合

つまり,別のCOMオブジェクトと同じトランザクション内で実行したいのであれば[必要]を,そうではなく常に新しくトランザクションを始めたいのであれば[新しく必要]を,それぞれ設定すればよいということである。
同じトランザクションの範囲に入るのは,トランザクションの範囲内にあるCOMオブジェクトが別のCOMオブジェクトを呼び出すときのみであることに注意したい。たとえば,AというCOMコンポーネントとBというCOMコンポーネントがあり,どちらもトランザクションが[必要]に設定されていたとする。このとき,(COM+の管理下にないか,トランザクションをサポートしていない)COMクライアントが,COMコンポーネントAとCOMコンポーネントBをそれぞれ実体化しても,両者は同じトランザクション範囲には含まれない。あくまでも,「自分が属しているトランザクション範囲に新しいCOMオブジェクトを含めるか含めないか」という問題であり,呼び出し元となるCOMオブジェクトがトランザクション範囲のなかになければ,トランザクション範囲は必ず新しく作成される。
| Chapter 5-1 15/23 |
