Quelles sont les meilleures pratiques pour effectuer des transactions en C # .Net 2.0. Quelles sont les classes à utiliser? Quels sont les pièges à surveiller, etc. Tous ces éléments de validation et d'annulation. Je commence juste un projet dans lequel je pourrais avoir besoin de faire des transactions tout en insérant des données dans la base de données. Toutes les réponses ou liens pour des informations, même de base sur les transactions, sont les bienvenus.
c#
.net
transactions
Malik Daud Ahmad Khokhar
la source
la source
Réponses:
Il existe 2 principaux types de transactions; transactions de connexion et transactions ambiantes. Une transaction de connexion (telle que SqlTransaction) est directement liée à la connexion db (telle que SqlConnection), ce qui signifie que vous devez continuer à transmettre la connexion - OK dans certains cas, mais n'autorise pas «créer / utiliser / libérer» utilisation, et ne permet pas le travail cross-db. Un exemple (formaté pour l'espace):
Pas trop compliqué, mais limité à notre connexion "conn". Si nous voulons faire appel à différentes méthodes, nous devons maintenant passer "conn".
L'alternative est une transaction ambiante; nouveau dans .NET 2.0, l' objet TransactionScope (System.Transactions.dll) permet une utilisation sur une plage d'opérations (les fournisseurs appropriés s'enrôleront automatiquement dans la transaction ambiante). Cela facilite la rétro-intégration dans le code existant (non transactionnel) et la conversation avec plusieurs fournisseurs (bien que DTC soit impliqué si vous en parlez à plus d'un).
Par exemple:
Notez ici que les deux méthodes peuvent gérer leurs propres connexions (ouvrir / utiliser / fermer / éliminer), mais elles feront silencieusement partie de la transaction ambiante sans que nous ayons à passer quoi que ce soit.
Si vos erreurs de code, Dispose () sera appelé sans Complete (), il sera donc annulé. L'imbrication attendue, etc. est prise en charge, bien que vous ne puissiez pas annuler une transaction interne mais terminer la transaction externe: si quelqu'un n'est pas satisfait, la transaction est annulée.
L'autre avantage de TransactionScope est qu'il n'est pas uniquement lié aux bases de données; tout fournisseur prenant en charge les transactions peut l'utiliser. WCF, par exemple. Ou il existe même des modèles d'objets compatibles avec TransactionScope (c'est-à-dire des classes .NET avec capacité de restauration - peut-être plus facile qu'un souvenir, même si je n'ai jamais utilisé cette approche moi-même).
Dans l'ensemble, un objet très, très utile.
Quelques mises en garde:
la source
la source
Vous pouvez également encapsuler la transaction dans sa propre procédure stockée et la gérer de cette façon au lieu de faire des transactions en C # lui-même.
la source
si vous en avez juste besoin pour des trucs liés à la base de données, certains OR Mappers (par exemple NHibernate) prennent en charge les transactions par défaut.
la source
Cela dépend également de ce dont vous avez besoin. Pour les transactions SQL de base, vous pouvez essayer d'effectuer des transactions TSQL en utilisant BEGIN TRANS et COMMIT TRANS dans votre code. C'est le moyen le plus simple mais il est complexe et vous devez faire attention à vous engager correctement (et à revenir en arrière).
J'utiliserais quelque chose comme
Tout échec vous fera sortir directement de
using
et la transaction sera toujours validée ou annulée (selon ce que vous lui demandez de faire). Le plus gros problème auquel nous avons été confrontés était de nous assurer qu'il était toujours engagé. L'utilisation garantit que la portée de la transaction est limitée.la source