次の方法で共有


トランザクションでの非トランザクション コンポーネントの使用

トランザクションの ACID プロパティ を利用するには、トランザクションに非トランザクション コンポーネントを配置すると便利です。 たとえば、ネットワーク上のパスワードを更新するために使用する非トランザクション レガシ コンポーネントがある場合は、それらのコンポーネントをトランザクションに配置して、ネットワーク全体でパスワードの更新が一貫していることを確認できます。

トランザクション コンテキスト オブジェクト は、非トランザクション クライアントが複数の COM オブジェクトの作業を 1 つのトランザクションに結合できるようにする汎用オブジェクトであり、その目的専用の新しいコンポーネントを開発する必要はありません。 トランザクション コンテキスト オブジェクトは、自動トランザクションとは異なり、クライアントがトランザクションを明示的にコミットまたは中止する必要があります。

既定では、トランザクション コンテキスト オブジェクトのトランザクション属性値は [必須] に設定されています。 クライアントがコミット呼び出しまたは中止呼び出しを明示的に発行せずにトランザクション コンテキスト オブジェクトを解放すると、COM+ はトランザクションを中止します。

次の Visual Basic の例は、非トランザクション クライアントが複数のオブジェクトによって実行された作業を 1 つのトランザクションに構成する方法を示しています。

Dim objTxCtx As TransactionContext
Dim objCat As MyDLL.Ccat  ' Ccat is a user-defined component.
Dim objDog As MyDLL.Cdog  ' Cdog is a user-defined component.

' Get TransactionContext object.
Set objTxCtx = _
  CreateObject ("TxCtx.TransactionContext")

' Create instances of Cat and Dog.
Set objCat = _ 
  objTxCtx.CreateInstance ("MyDLL.Ccat")
Set objDog = _ 
  objTxCtx.CreateInstance ("MyDLL.Cdog")

' Both objects do work.
objDog.Bark
objCat.Hiss

' Commit the transaction.
objTxCtx.Commit

トランザクション コンテキスト オブジェクトの制限事項

トランザクション コンテキスト オブジェクトの重要な制限事項を次に示します。

  • トランザクション コンテキスト オブジェクトを使用する場合、複数のオブジェクトの作業を 1 つのトランザクションに結合するアプリケーション ロジックは、特定の非トランザクション クライアント実装に関連付けられ、COM コンポーネントを使用する利点がいくつか失われます。 失われる利点は次のとおりです。

    • さらに大きなトランザクションの一部としてアプリケーション ロジックを再利用する機能
    • 宣言型セキュリティの面付け
    • クライアントからリモートでロジックを実行する柔軟性
  • トランザクション コンテキスト オブジェクトは、非トランザクション クライアントでインプロセスで実行されます。つまり、非トランザクション クライアント コンピューターで COM+ を使用できる必要があります。 これは、たとえば、COM+ と同じサーバーで実行されている Active Server Pages (ASP) ページからトランザクション コンテキスト オブジェクトを使用する場合など、問題にならない可能性があります。

  • トランザクション コンテキスト オブジェクトを作成するときに、非トランザクション クライアントのコンテキストは取得されません。 トランザクション処理は、トランザクション コンテキスト オブジェクトを使用して作成された COM オブジェクトを介してのみ間接的に実行できます。 特に、非トランザクション クライアントは COM+ リソース ディスペンサー (ODBC など) を使用できず、トランザクションに作業を含めることはできません。 たとえば、開発者は、リレーショナル データベース システムでトランザクション処理を行うための次の構文に精通している可能性があります。

    BEGIN TRANSACTION
      DoWork
    COMMIT TRANSACTION
    

    同様の方法でトランザクション コンテキスト オブジェクトを使用しても、目的の結果は得られない。

    Set objTxCtx = CreateObject ("TxCtx.TransactionContext")
      DoWork
      objTxCtx.Commit
    Set objTxCtx = Nothing
    

    この例の DoWork の呼び出しは、トランザクションに参加していません。 代わりに、DoWork を呼び出す COM コンポーネントをビルドし、トランザクション コンテキスト オブジェクトを使用してそのコンポーネントのオブジェクト インスタンスを作成し、そのオブジェクトを非トランザクション クライアントから呼び出して、その作業をクライアント制御トランザクションの一部にする必要があります。