Interoperabilität mit Enterprise Services und COM+-Transaktionen

Der System.Transactions-Namespace unterstützt die Interoperabilität zwischen Transaktionsobjekten, die in diesem Namespace erstellt wurden, und mit COM+ erstellten Transaktionen.

Mithilfe der EnterpriseServicesInteropOption-Enumeration können Sie beim Erstellen einer neuen TransactionScope-Instanz das Maß an Interoperabilität mit COM+ festlegen.

Wenn der Anwendungscode die statische CurrentEigenschaft überprüft, System.Transactionsversucht standardmäßig eine Transaktion zu finden, die ansonsten aktuell ist, oder ein TransactionScope-Objekt zu finden, das erzwingt, dass Current den Wert null hat. Wenn weder eine Transaktion noch ein Objekt gefunden werden kann, die bzw. das diese Bedingungen erfüllt, fragt System.Transactions eine Transaktion aus dem COM+-Kontext ab. Beachten Sie, dass System.Transactions auch dann systemeigene System.Transactions-Transaktionen bevorzugt, wenn eine Transaktion im COM+-Kontext gefunden wird

Interoperabilitätsstufen

Die EnterpriseServicesInteropOption-Enumeration definiert die Interoperabilitätsstufen None, Full und Automatic.

Die TransactionScope-Klasse stellt Konstruktoren bereit, die EnterpriseServicesInteropOption als Parameter akzeptieren.

Noneimpliziert, wie der Name schon sagt, dass es keine Interoperabilität zwischen System.EnterpriseServices Kontexten und Transaktionsbereichen gibt. Wenn ein TransactionScope-Objekt mit None erstellt wurde, werden die Änderungen an Current nicht im COM+-Kontext widergespiegelt. Ebenso werden Änderungen an Transaktionen im COM+-Kontext nicht in Current widergespiegelt. Dies ist der schnellste Betriebsmodus von System.Transactions, da keine zusätzliche Synchronisierung erforderlich ist. None ist der Standardwert, der von TransactionScope mit allen Konstruktoren verwendet wird, die EnterpriseServicesInteropOption nicht als Parameter akzeptieren.

Wenn Sie System.EnterpriseServices-Transaktionen mit einer Ambient-Transaktion kombinieren möchten, müssen Sie entweder Full oder Automatic angeben. Beide Werte setzen eine Funktion namens Dienste ohne Komponenten voraus, und daher sollte beim Einsatz dieser Werte auf dem Computer Windows XP Service Pack 2 oder Windows Server 2003 verwendet werden.

Full gibt an, dass die Ambient-Transaktionen für System.Transactions und System.EnterpriseServices immer gleich sind. Daraufhin wird ein neuer System.EnterpriseServices-Transaktionskontext erstellt, und die Transaktion, die im TransactionScope aktuell ist, wird für diesen Kontext als aktuelle Transaktion übernommen. Folglich stimmt die Transaktion in Current völlig mit der Transaktion in Transaction überein. Durch diesen Wert wird die Leistung beeinträchtigt, da möglicherweise neue COM+-Kontexte erstellt werden müssen.

Automatic legt die folgenden Anforderungen fest:

  • Wenn Current überprüft wird, sollte System.Transactions Transaktionen im COM+-Kontext unterstützen, wenn das Transaktionssystem erkennt, dass es in einem anderen Kontext als dem Standardkontext ausgeführt wird. Beachten Sie, dass der Standardkontext keine Transaktion enthalten kann. Im Standardkontext wird daher auch bei der Einstellung Automatic die Transaktion, die im lokalen von System.Transactions verwendeten Threadspeicher gespeichert wird, für Current zurückgegeben.

  • Wenn ein neues TransactionScope-Objekt erstellt wird, und die Erstellung in einem anderen Kontext als dem Standardkontext erfolgt, dann sollte die Transaktion, die für das TransactionScope-Objekt aktuell ist, in COM+ widergespiegelt werden. In diesem Fall verhält sich Automatic insofern wie Full, als dass ein neuer COM+-Kontext erstellt wird.

Wenn Current sowohl in Full als auch in Automatic festgelegt wurde, bewirken diesen beiden Modi, dass Current nicht direkt festgelegt werden kann. Jeder Versuch, Current direkt und nicht durch die Erstellung eines TransactionScope-Objekts festzulegen, resultiert in einer Ausnahme des Typs InvalidOperationException. Der EnterpriseServicesInteropOption-Enumerationswert wird an neue Transaktionsbereiche vererbt, für die nicht explizit festgelegt wird, welcher Wert verwendet erden soll. Wenn Sie beispielsweise ein TransactionScope-Objekt unter Angabe von Full erstellen, und dann ein zweites TransactionScope-Objekt erstellen, aber keinen EnterpriseServicesInteropOption-Wert angeben, verfügt das zweite TransactionScope-Objekt ebenso über die Einstellung Full.

Zusammenfasst gelten die folgenden Regeln für die Erstellung eines neuen Transaktionsbereichs:

  1. Current wird überprüft, ob eine Transaktion vorliegt. Diese Prüfung resultiert in:

    • Eine Prüfung, um festzustellen, ob ein Bereich vorhanden ist.

    • Wenn ein Bereich vorhanden ist, wird überprüft, welcher Wert der EnterpriseServicesInteropOption-Enumeration bei der ursprünglichen Erstellung des Bereichs übergeben wurde.

    • Wenn die EnterpriseServicesInteropOption-Enumeration auf Automatic festgelegt wurde, dann hat die COM+-Transaktion (System.EnterpriseServices-Transaktion) Vorrang vor der System.Transactions-Transaktion im verwalteten lokalen Threadspeicher.

      Wenn der Wert auf None festgelegt wurde, dann hat die System.Transactions-Transaktion im verwalteten lokalen Threadspeicher Vorrang.

      Wenn der Wert Full lautet, ist nur eine Transaktion vorhanden, und dies ist eine COM+-Transaktion.

  2. Es wird der Wert der TransactionScopeOption-Enumeration überprüft, der vom TransactionScope-Konstruktor übergeben wird. Damit wird bestimmt, ob eine neue Transaktion erstellt werden muss.

  3. Wenn eine neue Transaktion erstellt werden muss, bewirken die folgenden Werte von EnterpriseServicesInteropOption Folgendes:

    • Full: Es wird eine dem COM+-Kontext zugeordnete Transaktion erstellt.

    • None: Eine System.Transactions Transaktion wird erstellt.

    • Automatic: Wenn ein COM+-Kontext vorhanden ist, wird eine Transaktion erstellt und dem Kontext angefügt.

Die folgende Tabelle veranschaulicht den Enterprise Services (ES)-Kontext und einen Transaktionsbereich, der erfordert, dass Transaktionen die EnterpriseServicesInteropOption-Enumeration verwenden.

ES-Kontext Keine Automatic Vollständig
Standardkontext Standardkontext Standardkontext Einen neuen
Transaktionskontext erstellen
Kein Standardkontext Den Kontexts des Clients beibehalten Einen neuen Transaktionskontext erstellen Einen neuen Transaktionskontext erstellen

Die folgende Tabelle zeigt, welche Art von Ambient-Transaktion eingesetzt wird, wenn ein bestimmter System.EnterpriseServices-Kontext und ein Transaktionsbereich gegeben sind, der eine Transaktion erfordert, in der die EnterpriseServicesInteropOption-Enumeration verwendet wird.

ES-Kontext Keine Automatic Vollständig
Standardkontext ST ST ES
Kein Standardkontext ST ES ES

Für die obige Tabelle gilt Folgendes: