COM+ 登録データベース (RegDB) は、COM+ トランザクションに参加できるトランザクション リソース マネージャーです。 これにより、トランザクション内で管理操作を実行でき、複数のコンピューター間でも、すべての構成変更がアトミック操作としてコミットまたは中止されます。 状況によっては、これを行うと非常に有益な場合がありますが、考慮する必要がある分離動作とブロック動作があり、トランザクション内で管理タスクを実行すると、通常の管理プログラミング モデルに若干の変更が加えられます。
トランザクション内で管理操作を実行する利点
- **データの整合性— **トランザクション内で実行される管理操作は、トランザクション全体としてコミットまたは中止されますが、トランザクション以外の COM+ カタログ リソースの中には、そうでない可能性があります。 (以下の非トランザクション COM+ カタログ リソースを参照してください)。
- **複数のマシン間で一貫した展開—**複数のサーバーに COM+ アプリケーションを展開する場合は、すべてのサーバーが同じ構成のままであることを保証できます。
- **スケーリングとパフォーマンス—**トランザクション内で複数の操作を実行すると、RegDB へのすべての書き込みが一度に実行されます。 RegDB への永続化された書き込みは、比較的高価な操作です。RegDB に多くの書き込みを行っている場合は、SaveChangesを呼び出すたびに呼び出すたびにではなく、一度にすべてを実行することで大きなパフォーマンス上の利点を得ることができます。
RegDB の分離動作
適切なデータ整合性とシリアル化可能なトランザクションを確保するために、RegDB では、トランザクション内で管理操作が実行されている場合に、特定のブロックと分離の動作が適用されます。
トランザクション内で動作するコンポーネントが、SaveChanges、installApplication、InstallComponentなど、COM+ カタログへの書き込みを引き起こすメソッドを呼び出すたびに、現在のトランザクションがコミットまたは中止されるまで他のライターが入ってくるのをブロックする COM+ カタログ サーバー コードに対してライター ロックが実行されます。 つまり、ライターは、適切なトランザクション アフィニティを持ち、現在のトランザクションに参加している場合にのみ入ることができます。
閲覧者はブロックされません。 ただし、閲覧者に表示されるデータには、そのトランザクションが実際にコミットされるまで、トランザクション内で行われた中間変更は反映されません。 そのトランザクションに参加しているすべてのコンポーネントは、データの読み取り時に中間データの状態を確認しますが、トランザクションの外部のすべてのコンポーネントでは、トランザクションが完了した後にのみそれらの変更が表示されます。
SaveChanges の動作
上記の分離動作を実現するために、RegDB はトランザクション内のコンポーネントによって動作するキャッシュを効果的に提供します。 これにより、SaveChanges メソッドの動作が変更されます。
通常、トランザクションが存在しない場合、SaveChangesを呼び出すと保留中の変更がカタログに書き込まれ、SaveChanges はすべての書き込みが完了するまで戻りません。 これにより、SaveChanges の呼び出しが正常に返された場合、StartApplication呼び出すことができます。これにより、新しいデータでアプリケーションがアクティブになります。
ただし、トランザクション内では、SaveChanges は RegDB 自体ではなくキャッシュにのみ影響し、SaveChanges は、すべての変更がトランザクションによって RegDB にコミットされたかどうかをすぐに返します。 StartApplication、SaveChanges が返 後に新しいデータを使用している保証はありません。 このコンテキストで startApplication 呼び出す必要がある場合は、しばらく待ってから実行することをお勧めします。
トランザクション Time-Out 期間
トランザクション内で多数の管理操作を実行している場合は、実行時間の長いトランザクションである可能性があります。 この場合、トランザクションのタイムアウト値が問題になる可能性があります。 これは、トランザクションを開始するコンポーネントに設定されたトランザクション タイムアウト値か、そのコンポーネントが実行されているマシンのマシン全体のタイムアウト設定によって決定されます。 トランザクション内で多数の操作を行う場合は、適切なトランザクションタイムアウト期間を十分に長い値に設定し、必要に応じて、完了時に元の設定を復元することをお勧めします。
非トランザクション COM+ カタログ リソース
レジストリ、ファイル システム、および Windows インストーラー (MSI) は、トランザクションではない COM+ カタログ リソースです。
手記
トランザクションを中止するエラーが発生した場合、これらのリソースに対する変更がロールバックされない可能性があります。
.msi ファイルから既存の COM+ アプリケーションをインストール中にエラーが発生した場合、アプリケーションはコンポーネント サービス スナップインには表示されませんが、プログラムの追加と削除に表示されることがあります。その場合は、手動で削除する必要があります。
システムハングが発生した場合の復旧
トランザクション内で管理操作を行うコンポーネントがカタログ サーバー コードのライター ロックを保持している間にハングした場合、他のすべてのユーザーがカタログに変更を加えるのをブロックします。 このような場合は、システム アプリケーションをシャットダウンして再起動することで、カタログのロックを解除できます。
TransactionContext オブジェクトを使用したスクリプト
トランザクション内で管理操作を行う簡単な方法は、TransactionContext オブジェクトを使用してトランザクションを制御することです。 たとえば、次の Visual Basic スクリプトは、両方のアプリケーションまたはどちらのアプリケーションも作成しないように、2 つの新しいアプリケーションをトランザクションで追加する方法を示しています。
Dim txctx
Dim cat
Dim apps
Dim app1
Dim app2
WScript.Echo "Starting"
Set txctx = CreateObject("TxCtx.TransactionContext")
Set cat = txctx.CreateInstance("COMAdmin.COMAdminCatalog")
Set apps = cat.GetCollection("Applications")
Set app1 = apps.Add
app1.Value("Name") = "Test App #1"
apps.SaveChanges
Set app2 = apps.Add
app2.Value("Name") = "Test App #2"
apps.SaveChanges
WScript.Echo "Ending"
txctx.Commit
関連トピック
-
COM+ 管理エラー を処理する
-
COM+ 管理カタログ の使用の概要の例
-
COMAdmin オブジェクト の概要
-
COM+ カタログ でのコレクションの取得
-
プロパティの設定と COM+ カタログ への変更の保存