WCF - Transactions

Une transaction dans WCF est un ensemble d'opérations qui suivent certaines propriétés, collectivement appelées ACID. Ici, si une seule opération échoue, tout le système échoue automatiquement. Lorsqu'une commande est passée en ligne, une transaction a lieu. L'exemple suivant peut être utile pour comprendre le processus de transaction en termes plus simples.

Exemple

Supposons que vous ayez commandé un téléviseur LCD dans une boutique en ligne et que vous allez payer le montant par carte de crédit. Lorsque vous saisissez les informations requises pour passer la commande, deux opérations se produisent simultanément.

Premièrement, le montant spécifié est débité de votre compte bancaire et deuxièmement, le compte fournisseur est crédité du même montant. Les deux opérations doivent s'exécuter avec succès pour avoir une transaction réussie.

Propriétés de transaction WCF

Les quatre propriétés suivies d'une transaction WCF sont les suivantes:

  • Atomic - Toutes les opérations doivent agir comme une seule opération indivisible à la fin d'une transaction.

  • Consistency - Quel que soit le jeu d'opérations, le système est toujours dans un état de cohérence, c'est-à-dire que le résultat de la transaction est toujours conforme à l'attente.

  • Isolation - L'état intermédiaire du système n'est visible par aucune entité du monde extérieur tant que la transaction n'est pas terminée.

  • Durability - L'état engagé est maintenu quel que soit le type de panne (matériel, panne de courant, etc.)

Lors de la configuration d'une transaction WCF, certains facteurs doivent être pris en compte. Il s'agit du comportement de liaison et de fonctionnement.

Binding- Les liaisons qui prennent en charge la transaction dans WCF ne sont que quelques-unes et il est essentiel de faire un choix parmi ces liaisons uniquement, qui restent désactivées par défaut et doivent être activées pour obtenir le support requis pour la transaction. Ces liaisons sont les suivantes -

  • NetTcpBinding
  • NetNamedPipeBinding
  • WSHttpBinding
  • WSDualHttpBinding
  • WSFederationHttpBinding

Operation behavior- Alors qu'une liaison facilite le chemin pour la propagation des transactions, une opération prend en charge le traitement des transactions ainsi que la configuration des opérations. Le comportement des opérations utilise principalement deux attributs: TransactionFlow et TransactionScopeRequired. Ici, il convient de noter que TransactionFlow a principalement trois valeurs, à savoir: Autorisé, Obligatoire et Non autorisé.

Le code suivant montre si la modification de la configuration de la liaison et du contrat d'opération facilite la propagation du client.

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

Protocole de transaction

WCF utilise trois types de protocoles pour les transactions -

  • Lightweight
  • Transaction Ole
  • Transaction WS-atomique (WS-AT)

De tous les trois, WS-AT est un protocole interopérable et permet le flux de transactions distribuées à travers les pare-feu. Cependant, ce protocole ne doit pas être utilisé lorsque la transaction est strictement basée sur la technologie Microsoft.

Phases de la transaction WCF

Il existe deux phases dans une transaction WCF, comme illustré dans la figure suivante.

  • Prepare Phase - Dans cette phase, le gestionnaire de transaction vérifie si toutes les entités sont prêtes à s'engager pour la transaction ou non.

  • Commit Phase - Dans cette phase, l'engagement des entités démarre dans la réalité.

La figure suivante illustre les fonctions des deux phases d'une transaction WCF.

Activation d'une transaction WCF

Pour activer une transaction WCF avec succès, il faut suivre une série de six étapes de manière séquentielle. Les étapes requises sont décrites ci-dessous.

Step 1 − Creation of two WCF Services

La première étape à cet égard consiste à créer deux projets de service dans WCF pour participer à une seule transaction. Les transactions de base de données seront effectuées sur ces deux services et on comprendra comment elles sont unifiées par une transaction WCF. Une application Web de WCFTransactions a également été créée pour consommer les deux services créés dans une seule portée de transaction.

Step 2 − Method creation and its attribution with TransactionFlow attribute

Ici, une méthode UpdateData sera créée pour les deux services WCF à insérer dans la base de données avec l'attribut OperationContract. Pour accomplir cette tâche, une classe d'interface est d'abord créée à l'aide de l'attribut ServiceContract. Pour activer la transaction dans la méthode nouvellement créée, elle est attribuée avec TransactionFlow et les transactions sont autorisées à l'aide de la valeur autorisée.

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

Step 3− Implementation of WCF service with TransactionScopeRequired attribute

Cela se fait en utilisant le code ci-dessous -

[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

Son codage se fait comme suit -

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

Il est essentiel d'attacher la liaison autorisée de transaction avec le point de terminaison pour exposer le service WCF.

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

Step 5 − Calling both the services in a single transaction

Ici, les deux services ci-dessus sont appelés en une seule transaction et à cette fin, l'objet TransactionScope est utilisé pour regrouper les deux services. La méthode Complete de l'objet ci-dessus est appelée pour valider une transaction WCF. Pour annuler, la méthode Dispose doit être appelée.

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

Le petit morceau du code complet dans lequel les transactions WCF ont été regroupées dans une seule étendue est illustré ci-dessous:

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

Le test est effectué à la 6ème et dernière étape et après avoir appelé le 1er service WCF, une exception est forcée.