Verwenden nicht transaktionaler Komponenten in einer Transaktion

Es ist häufig nützlich, nicht transaktionale Komponenten in einer Transaktion zu platzieren, um die ACID-Eigenschaften von Transaktionen zu nutzen. Wenn Sie beispielsweise nicht transaktionsbasierte Legacykomponenten zum Aktualisieren von Kennwörtern in einem Netzwerk verwenden, können Sie diese Komponenten in einer Transaktion platzieren, um sicherzustellen, dass Kennwortaktualisierungen im gesamten Netzwerk konsistent sind.

Das Transaktionskontextobjekt ist ein generisches Objekt, mit dem nicht transaktionale Clients die Arbeit mehrerer COM-Objekte in einer einzelnen Transaktion kombinieren können, ohne dass Sie eine neue Komponente speziell für diesen Zweck entwickeln müssen. Im Gegensatz zu einer automatischen Transaktion erfordert das Transaktionskontextobjekt, dass sein Client die Transaktion explizit committen oder abbrechen muss.

Standardmäßig ist der Transaktionsattributewert des Transaktionskontextobjekts auf Erforderlich festgelegt. COM+ bricht die Transaktion ab, wenn der Client das Transaktionskontextobjekt freigibt, ohne explizit einen Commit- oder Abbruchaufruf auszugeben.

Das folgende Visual Basic-Beispiel zeigt, wie ein nicht transaktionaler Client die von mehr als einem Objekt ausgeführte Arbeit in einer einzelnen Transaktion zusammenfassen kann:

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

Einschränkungen des Transaktionskontextobjekts

Im Folgenden sind einige wichtige Einschränkungen des Transaktionskontextobjekts aufgeführt:

  • Bei Verwendung eines Transaktionskontextobjekts ist die Anwendungslogik, die die Arbeit mehrerer Objekte in einer einzelnen Transaktion kombiniert, an eine bestimmte nicht transaktionale Clientimplementierung gebunden, und einige Vorteile der Verwendung von COM-Komponenten gehen verloren. Zu diesen verlorenen Vorteilen gehören:

    • Möglichkeit, die Anwendungslogik als Teil einer noch größeren Transaktion wiederzuverwenden
    • Einführung deklarativer Sicherheit
    • Flexibilität für die Remoteausführung der Logik vom Client aus
  • Das Transaktionskontextobjekt wird prozessintern mit dem nicht transaktionalen Client ausgeführt, was bedeutet, dass COM+ auf dem nicht transaktionalen Clientcomputer verfügbar sein muss. Dies kann z. B. kein Problem darstellen, wenn das Transaktionskontextobjekt von einer ASP-Seite (Active Server Pages) verwendet wird, die auf demselben Server wie COM+ ausgeführt wird.

  • Sie erhalten keinen Kontext für den nicht transaktionalen Client, wenn Sie ein Transaktionskontextobjekt erstellen. Transaktionsarbeiten können nur indirekt über COM-Objekte ausgeführt werden, die mithilfe des Transaktionskontextobjekts erstellt werden. Insbesondere kann der nicht transaktionale Client keine COM+-Ressourcenspender (z. B. ODBC) verwenden und die Arbeit in die Transaktion einbeziehen. Beispielsweise sind Entwickler möglicherweise mit der folgenden Syntax für die Durchführung von Transaktionsarbeiten auf relationalen Datenbanksystemen vertraut:

    BEGIN TRANSACTION
      DoWork
    COMMIT TRANSACTION
    

    Wenn Sie das Transaktionskontextobjekt auf ähnliche Weise verwenden, wird nicht das gewünschte Ergebnis erzielt:

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

    Der Aufruf von DoWork in diesem Beispiel ist nicht in einer Transaktion eingetragen. Stattdessen müssen Sie eine COM-Komponente erstellen, die DoWork aufruft, ein Objekt instance dieser Komponente mithilfe des Transaktionskontextobjekts erstellen und dann dieses Objekt aus dem nicht transaktionalen Client aufrufen, damit die Arbeit Teil der clientgesteuerten Transaktion ist.