web-dev-qa-db-fra.com

Différence entre transaction implicite et explicite

Quelle est la différence entre une transaction implicite et explicite dans SQL Server 2008?

Que se passe-t-il en arrière-plan TransactionScope? J'utilise TransactionScope, mais dans l'éditeur de profil serveur SQL, je ne vois pas l'instruction "Commencer la transaction ...".

Comment ça marche?

15
Arian

Fondamentalement, en c # lorsque vous définissez TransactionScope sur Implicite, il appelle la commande SQL Server SET pour placer la connexion en mode IMPLICIT_TRANSACTIONS. Tout ce que vous faites (en utilisant l'une des commandes répertoriées dans le 2e lien) lance une transaction qui reste ouverte jusqu'à une validation est émise. Si aucune validation n'est émise à la fin d'une connexion, un ROLLBACK implicite est exécuté.

Cela diffère du paramètre OFF, qui place également chaque déclaration dans une transaction. La différence est qu'en mode OFF (les transactions sont donc explicites), chaque transaction (déclaration singulière) est immédiatement commit.

10
RichardTheKiwi

En mode de transaction explicite, vous devez démarrer une transaction de manière explicite. En mode de transaction implicite, une transaction est automatiquement lancée après chaque validation. Donc, vous n'aurez qu'à vous engager. 

Étant donné que la transaction est lancée "implicitement", vous ne verrez pas un "BEGIN" explicite dans les journaux. :)

Par défaut, la base de données fonctionne en mode de transaction explicite avec les transactions à saisie automatique activées. En réalité, cela signifie que, sauf si une transaction explicite est démarrée avec BEGIN TRANSACTION, chaque modification de données est lancée dans une transaction distincte validée après l'instruction. Cela permet à la base de données d'annuler une instruction complète en cas d'échec (par exemple, une insertion en bloc ou une insertion qui modifie d'autres données dans un déclencheur).

5
GolezTrol

La transaction implicite est la validation automatique. Il n'y a pas de début ni de fin de la transaction.

Une transaction explicite a le début, la fin et l'annulation des transactions avec la commande Commencer la transaction, valider la transaction et annuler la transaction.

Dans la transaction explicite, si une erreur se produit entre-temps, nous pouvons revenir au début de la transaction, ce qui ne peut pas être fait dans une transaction implicite.

2
Jom George

SqlTransaction - que TransactionScope utilise sous les couvertures - n'envoie que les commandes T-SQL BEGIN TRANSACTION pour SQL Server 2000 et versions antérieures. 

Pour SQL Server 2005 et versions ultérieures, le protocole TDS a été étendu pour permettre aux clients de manipuler directement des transactions sans envoyer BEGIN TRANSACTION etc. Pour les afficher dans le Générateur de profils, sélectionnez les événements "TM: Begin Tran started", etc. Vous devrez probablement vérifier la case à cocher 'Afficher tous les événements' pour voir ces événements - ils sont dans la catégorie Transactions.

Voir Requête du gestionnaire de transactions dans la documentation du protocole TDS, TM: Classe d'événements de démarrage de Tran dans la documentation du Générateur de profils et SqlInternalTransaction.ExecuteTransactionYukon dans la source de référence .NET.

0
Mike Dimmick