トランザクション内の COM+ 管理操作
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 自体ではなくキャッシュにのみ影響し、すべての変更が RegDB にトランザクションでコミットされたかどうかを SaveChanges はすぐに返します。 StartApplication で、SaveChanges が返された後に新しいデータが使用される保証はありません。 このコンテキストで StartApplication を呼び出す必要がある場合は、しばらく待ってから実行することをお勧めします。
トランザクションのタイムアウト時間
トランザクション内で多数の管理操作を実行している場合は、実行時間の長いトランザクションである可能性があります。 この場合、トランザクションのタイムアウト値が問題になることがあります。 これは、トランザクションを開始するコンポーネントに設定されたトランザクション タイムアウト値か、そのコンポーネントが実行されているマシンに対するマシン全体のタイムアウト設定によって決定されます。 トランザクション内で多数の操作を行う場合は、適切なトランザクション タイムアウト時間を十分に長い値に設定し、必要に応じて、完了時に元の設定を復元することをお勧めします。
非トランザクション COM+ カタログ リソース
レジストリ、ファイル システム、および Windows インストーラー (MSI) は、トランザクションではない COM+ カタログ リソースです。
Note
トランザクションを中止するエラーが発生した場合、これらのリソースに対する変更がロールバックされない可能性があります。
.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
関連トピック