2017-05-22 2 views
1

Je viens juste de commencer à l'aide Dapper et je me demandais qui modèle pour les transactions serait mieux.Quelle transaction est la meilleure avec Dapper: BEGIN TRAN ou TransactionScope?

Quand j'écris SQL je préfère utiliser la transaction déjà dans le script avec:

BEGIN TRAN 

-- insert, update etc. 

COMMIT 

parce qu'il est plus facile de le tester, mais il y a aussi la question transaction with dapper dot net où les transactions .net sont utilisées maintenant je Je ne sais pas lequel je devrais utiliser.

Est-ce que ces deux méthodes ont des avantages/DIS sur l'autre?

Répondre

2

En fait, cela n'a rien à voir avec Dapper. Reportez-vous this réponse.

TransactionScope ou connection.BeginTransaction ou la décision "Transaction dans la procédure stockée" est en dehors de la portée de Dapper. Dapper expose simplement quelques méthodes d'extension sur l'objet DBConnection d'ADO.NET qui mappent la sortie des requêtes à l'objet. Le repos est à vous.

  1. TransactionScope est généralement utilisé pour les transactions distribuées; transaction couvrant différentes bases de données peut être sur un système différent. Cela nécessite certaines configurations sur le système d'exploitation et SQL Server sans lesquelles cela ne fonctionnera pas. Ceci n'est pas recommandé si toutes vos requêtes sont contre une seule instance de base de données.

  2. connection.BeginTransaction est la syntaxe ADO.NET pour implémenter la transaction (en C#, VB.NET, etc.) par rapport à une base de données unique. Cela ne fonctionne pas avec plusieurs bases de données. "Transaction dans la procédure stockée" est implémenté par rapport à la base de données unique dans la procédure stockée au lieu de le faire dans le code de l'application.

Les transactions imbriquées ou la combinaison des types ci-dessus constituent un autre sujet de discussion; essayez de chercher net pour cela.

Mon opinion personnelle est d'utiliser UnitOfWork pour mieux gérer les transactions. J'ai déjà mentionné les détails dans le lien ci-dessus. Il utilise connection.BeginTransaction en interne.