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

head2.gif 5.5.5 動作確認
 では,作成したCOMコンポーネントの動作を確認してみる。動作を確認するには,List 5-13に示すWindows Scripting Hostのプログラムを使うことにしよう。

 List 5-13は,dbsamplecom.orderコンポーネントを実体化し,acceptOrderメソッド(List 5-12)を呼び出して,Fumitaka Osawaという顧客に製品IDが2番の製品を10個注文させるというものである。このプログラムを実行すると,Fig.5-53Fig.5-54に示すとおり,在庫テーブルの製品IDが2番の製品の在庫数が10個減り,受注テーブルには製品IDが2番の製品を10個注文するレコードが追加されるはずである。

Fig.5-53 在庫テーブル
fig5_53.gif
Fig.5-54 受注テーブル
fig5_54.gif

 List 5-13を何回か実行し,在庫が足りなくなると,Fig.5-55に示す実行時エラーが発生する。このとき,もちろん在庫の数は減っていないし,受注テーブルのレコードも追加されない。

Fig.5-55 在庫が足りないとき
fig5_55.gif

 受注テーブルにレコードを追加しているのは,List 5-12の21行目で呼び出されているdbsamplecom.insorderオブジェクトのinsertOrderメソッドである。そして,Fig.5-55に示す実行時エラーを発生させているのは,30行目で呼び出されているErrオブジェクトのRaiseメソッドである。在庫をチェックしているのはList 5-12の28行目にあるIf文であるが,それよりもまえに21行目でdbsamplecom.insertorderオブジェクトのinsertOrderメソッドが呼び出されているので,在庫数にかかわらず,受注レコードは追加される。しかし,28行目のIf文で在庫数が足りない場合には,30行目でErrオブジェクトのRaiseメソッドが呼び出され,実行時エラーが発生する。発生した実行時エラーは,13行目で設定したOn Error Goto構文によって捕らえられ,エラーハンドラのある47行目以降の処理へと移行する。このとき,50行目でObjectContextオブジェクトのSetAbortメソッドが呼び出されるので,トランザクションはアボートされる。よって,21行目で呼び出されるdbsamplecom.insertorderオブジェクトのinsertOrderメソッドによって,書き込まれた受注レコードがロールバックされるのである。

 ところで,COM+アプリケーションのトランザクションの状態は,コンポーネントサービス管理ツールから参照することができる。コンポーネントサービス管理ツールの[コンピュータ]−[マイコンピュータ]−[分散トランザクション コーディネータ]の項目がトランザクションの状態を表している。この配下にある[トランザクションの統計]で,トランザクションがいくつコミットして,いくつアボートしたのかを参照することができる(Fig.5-56)。

Fig.5-56 トランザクションの統計
fig5_56.gif

One Point!トランザクションのコミット数およびアボート数は,MS DTCを停止(「MS DTCの設定」を参照)させたり,サーバーをリブートしたりするとクリアされる。

prevpg.gif Chapter 5-2 8/16 nextpg.gif