WCF - Transaktionen

Eine Transaktion in WCF ist eine Reihe von Vorgängen, die einigen Eigenschaften folgen, die zusammen als ACID bezeichnet werden. Wenn hier eine einzelne Operation fehlschlägt, fällt das gesamte System automatisch aus. Wenn eine Bestellung online aufgegeben wird, findet eine Transaktion statt. Das folgende Beispiel kann hilfreich sein, um den Transaktionsprozess einfacher zu verstehen.

Beispiel

Angenommen, Sie haben einen LCD-Fernseher in einem Online-Shop bestellt und zahlen den Betrag mit Ihrer Kreditkarte. Wenn Sie die erforderlichen Informationen eingeben, um die Bestellung aufzugeben, werden zwei Vorgänge gleichzeitig ausgeführt.

Erstens wird der angegebene Betrag von Ihrem Bankkonto abgebucht, und zweitens wird dem Anbieterkonto derselbe Betrag gutgeschrieben. Beide Operationen müssen erfolgreich ausgeführt werden, um eine erfolgreiche Transaktion zu haben.

WCF-Transaktionseigenschaften

Die vier Eigenschaften, denen eine WCF-Transaktion folgt, sind die folgenden:

  • Atomic - Alle Operationen müssen nach Abschluss einer Transaktion als eine einzige unteilbare Operation fungieren.

  • Consistency - Was auch immer der Operationssatz sein mag, das System befindet sich immer in einem konsistenten Zustand, dh das Ergebnis der Transaktion entspricht immer den Erwartungen.

  • Isolation - Der Zwischenzustand des Systems ist für keine Einheiten der Außenwelt sichtbar, bis die Transaktion abgeschlossen ist.

  • Durability - Der festgeschriebene Status bleibt unabhängig von Fehlern (Hardware, Stromausfall usw.) erhalten.

Bei der Konfiguration einer WCF-Transaktion müssen einige Faktoren berücksichtigt werden. Dies sind Bindungs- und Betriebsverhalten.

Binding- Es gibt nur wenige Bindungen, die Transaktionen in WCF unterstützen, und es ist wichtig, nur aus diesen Bindungen auszuwählen, die standardmäßig deaktiviert bleiben und aktiviert werden sollten, um die erforderliche Unterstützung für Transaktionen zu erhalten. Diese Bindungen sind wie folgt:

  • NetTcpBinding
  • NetNamedPipeBinding
  • WSHttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding

Operation behavior- Während eine Bindung den Pfad für die Transaktionsweitergabe erleichtert, kümmert sich eine Operation um die Transaktionsverarbeitung sowie die Operationskonfiguration. Das Betriebsverhalten verwendet hauptsächlich zwei Attribute: TransactionFlow und TransactionScopeRequired. Hierbei ist zu beachten, dass TransactionFlow hauptsächlich drei Werte hat: Zulässig, Obligatorisch und Nicht zulässig.

Der folgende Code zeigt, ob das Ändern der Konfiguration des Bindungs- und Betriebsvertrags die Weitergabe des Clients erleichtert.

<bindings> 
   <wsHttpBinding> 
      <binding name = "MandatoryTransBinding" transactionFlow = "true"> 
         <reliableSession enabled ="true"/>
      </binding>
   </wsHttpBinding> 
</bindings>

Transaktionsprotokoll

WCF verwendet drei Arten von Protokollen für Transaktionen -

  • Lightweight
  • Ole Transaktion
  • WS-Atomtransaktion (WS-AT)

Von allen dreien ist WS-AT ein interoperables Protokoll und ermöglicht den Fluss verteilter Transaktionen über Firewalls hinweg. Dieses Protokoll sollte jedoch nicht verwendet werden, wenn die Transaktion ausschließlich auf der Microsoft-Technologie basiert.

Phasen der WCF-Transaktion

Eine WCF-Transaktion besteht aus zwei Phasen, wie in der folgenden Abbildung dargestellt.

  • Prepare Phase - In dieser Phase prüft der Transaktionsmanager, ob alle Entitäten bereit sind, sich für die Transaktion zu verpflichten oder nicht.

  • Commit Phase - In dieser Phase beginnt das Engagement von Unternehmen in der Realität.

Die folgende Abbildung zeigt die Funktionen beider Phasen einer WCF-Transaktion.

Aktivieren einer WCF-Transaktion

Um eine WCF-Transaktion erfolgreich zu aktivieren, müssen Sie eine Reihe von sechs Schritten nacheinander ausführen. Die erforderlichen Schritte werden unten erläutert.

Step 1 − Creation of two WCF Services

Der wichtigste Schritt in dieser Hinsicht besteht darin, zwei Serviceprojekte in WCF zu erstellen, um an einer einzigen Transaktion teilzunehmen. Datenbanktransaktionen werden für beide Dienste ausgeführt, und es versteht sich, dass sie durch eine WCF-Transaktion vereinheitlicht werden. Es wurde auch eine Webanwendung von WCFTransactions erstellt, um die beiden erstellten Services in einem einzigen Transaktionsbereich zu nutzen.

Step 2 − Method creation and its attribution with TransactionFlow attribute

Hier wird eine UpdateData-Methode erstellt, die beide WCF-Dienste mit dem OperationContract-Attribut in die Datenbank einfügen können. Um diese Aufgabe auszuführen, wird zunächst mithilfe des ServiceContract-Attributs eine Schnittstellenklasse erstellt. Um die Transaktion in der neu erstellten Methode zu aktivieren, wird sie TransactionFlow zugeordnet, und Transaktionen sind mit dem Wert Zulässig zulässig.

[ServiceContract]
public interface IService1 {
   [OperationContract]
   [TransactionFlow(TransactionFlowOption.Allowed)]
   void UpdateData();
}

Step 3− Implementation of WCF service with TransactionScopeRequired attribute

Dies geschieht mit dem unten gezeigten Code -

[OperationBehavior(TransactionScopeRequired = true)]
public void UpdateData() {
   try {
      SqlConnection objConnection = new SqlConnection(strConnection);
      objConnection.Open();
      
      using(SqlTransaction transaction = Program.dbConnection.BeginTransaction()) {
     	   Boolean doRollback = false;
     	   using(SqlCommand cmd = new SqlCommand(
            "insert into Customer (Customer name, Customer code) values ('sss', 'sss')"objConnection))
         
     	   try {
            cmd.ExecuteNonQuery();
     	   } catch(SqlException) {
            doRollback = true;
            break;
     	   }
      }
      
      if(doRollback)
         transaction.Rollback();
      else
         transaction.Commit();  
   }
   finally {
      objConection.Close();
   }
}

Step 4 − Enabling Transaction Flow by WCF Service Config File

Die Codierung erfolgt wie folgt:

<bindings>
   <wsHttpBinding>
      <binding name = "TransactionalBind" transactionFlow = "true"/>
   </wsHttpBinding>
</bindings>

Es ist wichtig, die für die Transaktion zulässige Bindung an den Endpunkt anzuhängen, um den WCF-Dienst verfügbar zu machen.

<endpoint address = "" binding = "wsHttpBinding" bindingConfiguration = "TransactionalBind" contract = "WcfService1.IService1">

Step 5 − Calling both the services in a single transaction

Hier werden die beiden oben genannten Dienste in einer Transaktion aufgerufen. Zu diesem Zweck wird das TransactionScope-Objekt verwendet, um beide Dienste zu gruppieren. Die Complete-Methode des obigen Objekts wird aufgerufen, um eine WCF-Transaktion festzuschreiben. Zum Rollback ist die Dispose-Methode aufzurufen.

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
   try {
      // Call your webservice transactions here
      ts.Complete();
   } catch (Exception ex) {
      ts.Dispose();
   }
}

Das kleine Stück des vollständigen Codes, in dem WCF-Transaktionen in einem Bereich zusammengefasst wurden, ist unten dargestellt -

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.RequiresNew)) {
   try {
      ServiceReference1.Service1Client obj = newServiceReference1.Service1Client();
      obj.UpdateData();
      ServiceReference2.Service1Client obj1 = new ServiceReference2.Service1Client();
      obj1.UpdateData();
      ts.Complete();
   } catch (Exception ex) {
      ts.Dispose();
   }
}

Step 6 − Testing WCF transaction

Das Testen wird im 6. und letzten Schritt durchgeführt und nach dem Aufrufen des 1. WCF-Dienstes wird eine Ausnahme erzwungen.