Il convient de noter que lors de l'utilisation de l' TransactionScope
il n'est pas nécessaire pour l' try/catch
construire que vous avez. Il vous suffit de faire appel Complete
sur le champ, afin de valider la transaction, lorsque le champ d'application est quittée.
Cela étant dit, TransactionScope
est généralement un meilleur choix, car il vous permet d'imbriquer des appels à d'autres méthodes qui pourraient exiger une transaction sans avoir à passer l'état des transactions autour de.
Lors de l'appel d' BeginTransaction
sur le DbConnection
objet, vous devez passer que l'objet de la transaction autour si vous voulez effectuer d'autres opérations dans le cadre d'une même opération, mais dans une méthode différente.
Avec TransactionScope
, tant que le champ existe, elle prendra en charge tout ce qui s'enregistre auprès de l'actuel Transaction
sur le fil, ce qui rend votre code plus propre, et plus maintenable.
En plus de cela, vous avez l'avantage supplémentaire d'être en mesure d'utiliser d'autres ressources qui peuvent participer à des transactions, et pas seulement la connexion à la base de données.
Il convient de noter que, dans les situations où vous avez besoin pour profiter au maximum de vos connexions et opérations de base de données, vous ne pouvez utiliser TransactionScope
; même contre une seule base de données, vous exécutez la possibilité de le Coordinateur de Transactions Distribuées utilisé et ayant la transaction tourné dans une transaction distribuée (même pour une seule connexion de base de données).
Dans ces cas, tandis que troubler votre conception, vous pouvez envisager l'adoption d'un spécifique à la connexion de transactions autour de.
Ou, si vous savez que vous allez utiliser une ressource constante (et sur le même sujet), vous pouvez créer une classe de référence-nombre de votre connexion ou la transaction.
Vous devez créer une classe que sur la construction, crée votre ressource/incrémente le compteur. Elle permettrait également de mettre en oeuvre IDisposable
(dans lequel vous décrémenter/presse/commettre/abandonner lorsque le compte à rebours est à zéro), et de stocker le nombre dans une variable qui a ThreadStaticAttribute
lui est appliquée.
Cela vous permet de séparer la gestion des transactions à partir de la logique du code, et de se tenir toujours sur une unique ressource assez efficacement (au lieu de dégénérer en une transaction distribuée).