web-dev-qa-db-fra.com

Ai-je besoin de "transactionScope.Complete ();"?

Autant que je sache, la "bonne" façon d'utiliser une TransactionScope consiste à toujours appeler transactionScope.Complete(); avant de quitter le bloc using. Comme ça:

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
    //...
    //I'm using this as a NOLOCK-alternative in Linq2sql.
    transactionScope.Complete();
}

Cependant, j'ai vu que le code fonctionne sans lui, et même la réponse que j'ai apprise à l'utiliser l'omet. Donc ma question est, doit-il être utilisé ou non? 

7
ispiro

Donc ma question est, doit-il être utilisé ou non?

Complete doit être utilisé lorsque des mises à jour sont effectuées pour COMMIT la transaction. Sinon, le gestionnaire de transactions émettra une ROLLBACK et annulera les modifications apportées.

Avec une transaction en lecture seule comme dans votre exemple, je ne peux penser à aucune différence significative avec ou sans Complete. La COMMIT ou ROLLBACK émise par le gestionnaire de transactions aura le même effet net de libération des verrous et des ressources détenus par la transaction dans les deux cas. 

Bien qu'il ne soit pas obligatoire d'invoquer Complete dans une transaction en lecture seule, il s'agit toujours d'une meilleure pratique, à mon humble avis. Considérez le développeur médiocre qui a ajouté involontairement plus tard du code de modification de données à votre bloc de transactions sans voir que Complete est manquant.

7
Dan Guzman

Oui, vous devez l’utiliser, c’est le moyen d’informer le compilateur que vos tâches ont été complétées avec succès, à partir de la documentation Microsoft sur la classe TransactionScope :

Lorsque votre application termine tous les travaux qu'elle souhaite effectuer dans une transaction, vous ne devez appeler la méthode Complete qu'une seule fois pour informer ce gestionnaire de transactions qu'il est acceptable de valider la transaction. Ne pas appeler cette méthode annule la transaction.

Aussi pour le Complete method:

Ne pas appeler cette méthode annule la transaction, car le gestionnaire de transactions interprète cela comme une défaillance du système ou des exceptions levées dans l'étendue de la transaction. Toutefois, vous devez également noter que l'appel de cette méthode ne garantit pas une validation de la transaction. C'est simplement un moyen d'informer le gestionnaire de transactions de votre statut. 

3
Unnamed

essentiellement en utilisant l'instruction est convertie à cela au moment de la compilation par le compilateur C #

       TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })
        try
        {
           //your works
        }
        finally
        {
            if (transactionScope != null)
                ((IDisposable)transactionScope).Dispose();
        }

C’est donc tout ce à quoi vous pouvez vous attendre de la part de C # .... il vous suffit de travailler avec TransactionScope. 

Si l'objet TransactionScope a initialement créé la transaction, le travail réel de validation de la transaction par le gestionnaire de transactions intervient après la dernière ligne de code du bloc using. S'il n'a pas créé la transaction, la validation se produit chaque fois que Commit est appelé par le propriétaire de l'objet Transaction. À ce stade, le gestionnaire de transactions appelle les gestionnaires de ressources et les informe de la validation ou de l'annulation, selon que la méthode Complete a été appelée sur l'objet TransactionScope.

appeler cette méthode ne garantit pas que la transaction sera validée. C'est simplement un moyen d'informer le gestionnaire de transactions de votre statut. Après avoir appelé la méthode Complete, vous ne pouvez plus accéder à la transaction ambiante à l'aide de la propriété Current. Si vous tentez de le faire, une exception est générée.

L'instruction using garantit que la méthode Dispose de l'objet TransactionScope est appelée même si une exception se produit. La méthode Dispose marque la fin de la portée de la transaction. Les exceptions qui se produisent après l'appel de cette méthode peuvent ne pas affecter la transaction. Cette méthode restaure également la transaction ambiante à son état précédent.

Une exception TransactionAbortedException est levée si l'étendue crée la transaction et si la transaction est abandonnée. Une exception TransactionInDoubtException est levée si le gestionnaire de transactions ne peut pas prendre une décision de validation. Aucune exception n'est levée si la transaction est validée.

j'espère que ça va effacer pour vous

0
H-a-Neo