WCF - Transazioni

Una transazione in WCF è un insieme di operazioni che seguono alcune proprietà, note collettivamente come ACID. In questo caso, se una singola operazione fallisce, l'intero sistema fallisce automaticamente. Quando un ordine viene effettuato online, viene eseguita una transazione. Il seguente esempio può essere utile per comprendere il processo di transazione in termini più semplici.

Esempio

Supponi di aver ordinato un televisore LCD da un negozio online e di pagare l'importo con la tua carta di credito. Quando si immettono le informazioni richieste per effettuare l'ordine, vengono eseguite due operazioni contemporaneamente.

Uno, l'importo specificato viene addebitato sul tuo conto bancario e in secondo luogo, il conto del venditore viene accreditato con lo stesso importo. Entrambe le operazioni devono essere eseguite con successo per avere una transazione di successo.

Proprietà della transazione WCF

Le quattro proprietà seguite da una transazione WCF sono le seguenti:

  • Atomic - Tutte le operazioni devono fungere da singola operazione indivisibile al completamento di una transazione.

  • Consistency - Qualunque sia l'operazione impostata, il sistema è sempre in uno stato di coerenza, ovvero l'esito della transazione è sempre come da aspettativa.

  • Isolation - Lo stato intermedio del sistema non è visibile a nessuna entità del mondo esterno fino al completamento della transazione.

  • Durability - Lo stato di commit viene mantenuto indipendentemente da qualsiasi tipo di guasto (hardware, interruzione di corrente, ecc.)

Durante la configurazione di una transazione WCF, ci sono alcuni fattori che richiedono considerazione. Questi sono vincolanti e comportamento operativo.

Binding- Le associazioni che supportano la transazione in WCF sono solo alcune ed è fondamentale fare una scelta solo tra queste associazioni, che rimangono disabilitate per impostazione predefinita e dovrebbero essere abilitate per ottenere il supporto richiesto per la transazione. Queste associazioni sono le seguenti:

  • NetTcpBinding
  • NetNamedPipeBinding
  • WSHttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding

Operation behavior- Mentre un'associazione facilita il percorso per la propagazione della transazione, un'operazione si occupa dell'elaborazione della transazione e della configurazione dell'operazione. Il comportamento dell'operazione utilizza principalmente due attributi: TransactionFlow e TransactionScopeRequired. Qui, va notato che TransactionFlow ha principalmente tre valori e questi sono: Allowed, Mandatory e NotAllowed.

Il codice seguente mostra se la modifica della configurazione dell'associazione e del contratto operativo facilita o meno la propagazione del client.

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

Protocollo di transazione

WCF utilizza tre tipi di protocolli per la transazione:

  • Lightweight
  • Ole Transaction
  • Transazione WS-Atomic (WS-AT)

Di tutti e tre, WS-AT è un protocollo interoperabile e consente il flusso di transazioni distribuite attraverso i firewall. Tuttavia, questo protocollo non deve essere utilizzato quando la transazione è strettamente basata sulla tecnologia Microsoft.

Fasi della transazione WCF

Esistono due fasi in una transazione WCF, come mostrato nella figura seguente.

  • Prepare Phase - In questa fase, il gestore delle transazioni controlla se tutte le entità sono pronte a impegnarsi per la transazione o meno.

  • Commit Phase - In questa fase, l'impegno delle entità inizia nella realtà.

La figura seguente illustra le funzioni di entrambe le fasi di una transazione WCF.

Abilitazione di una transazione WCF

Per abilitare correttamente una transazione WCF, è necessario seguire una serie di sei passaggi in modo sequenziale. I passaggi necessari sono discussi di seguito.

Step 1 − Creation of two WCF Services

Il passaggio principale a questo proposito è creare due progetti di servizio in WCF per partecipare a una singola transazione. Le transazioni del database verranno eseguite su entrambi questi servizi e si comprenderà il modo in cui vengono unificate da una transazione WCF. È stata inoltre creata un'applicazione Web di WCFTransactions per utilizzare i due servizi creati in un unico ambito di transazione.

Step 2 − Method creation and its attribution with TransactionFlow attribute

Qui, verrà creato un metodo UpdateData per entrambi i servizi WCF da inserire nel database con l'attributo OperationContract. Per eseguire questa attività, viene prima creata una classe di interfaccia con l'aiuto dell'attributo ServiceContract. Per abilitare la transazione nel metodo appena creato, viene attribuita con TransactionFlow e le transazioni sono consentite utilizzando è il valore consentito.

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

Step 3− Implementation of WCF service with TransactionScopeRequired attribute

Viene fatto utilizzando il codice mostrato di seguito -

[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

La sua codifica viene eseguita come segue:

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

È fondamentale collegare l'associazione consentita alla transazione con l'endpoint per esporre il servizio WCF.

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

Step 5 − Calling both the services in a single transaction

Qui, i due servizi di cui sopra vengono chiamati in un'unica transazione e per questo scopo, l'oggetto TransactionScope viene utilizzato per raggruppare entrambi i servizi. Il metodo Complete dell'oggetto precedente viene chiamato per eseguire il commit di una transazione WCF. Per eseguire il rollback, è necessario chiamare il metodo Dispose.

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

Di seguito è illustrata la piccola parte del codice completo in cui le transazioni WCF sono state raggruppate in un ambito:

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

Il test viene eseguito nel sesto e ultimo passaggio e dopo aver chiamato il primo servizio WCF, viene forzata un'eccezione.