TransactionScope et transactions
Dans mon code C#, je suis en utilisant TransactionScope parce que je a dit de ne pas compter que mon programmeurs sql sera toujours utiliser les transactions et nous sommes responsables et yada yada.
Avoir dit que
Il ressemble TransactionScope objet Rouleaux de retour avant la SqlTransaction? Est-ce possible et si oui quel est la bonne méthodologie pour l'emballage d'une TransactionScope dans une transaction.
Voici le sql test
CREATE PROC ThrowError
AS
BEGIN TRANSACTION --SqlTransaction
SELECT 1/0
IF @@ERROR<> 0
BEGIN
ROLLBACK TRANSACTION --SqlTransaction
RETURN -1
END
ELSE
BEGIN
COMMIT TRANSACTION --SqlTransaction
RETURN 0
END
go
DECLARE @RESULT INT
EXEC @RESULT = ThrowError
SELECT @RESULT
Et si je l'exécute j'ai juste le diviser par 0 et renvoie -1
Appeler du code C# je obtenir un supplément de message d'erreur
Erreur de division par zéro rencontrés.
nombre de Transactions après EXECUTE indique qu'un COMMIT ou ROLLBACK TRANSACTION essage est manquant. Précédent count = 1, compteur = 0.
Si je donne de la transaction sql un nom, puis
Ne peut pas revenir SqlTransaction.
Aucune transaction ou point d'enregistrement de ce nom a été trouvé.
Nombre de transactions après EXECUTE indique qu'un COMMIT ou ROLLBACK
Déclaration de la TRANSACTION est manquant. Précédent count = 1, compteur = 2.
à certains moments, il semble que le comte monte, jusqu'à ce que l'application soit complètement sorti de l'
Le c# est juste
using (TransactionScope scope = new TransactionScope())
{
... Execute Sql
scope.Commit()
}
EDIT:
Le code sql doit travailler pour 2000 et 2005
source d'informationauteur Mike
Vous devez vous connecter pour publier un commentaire.
Il y avait une mise à jour de masse pour la gestion d'erreur dans SQL Server 2005. Ces articles sont assez vastes: Gestion des erreurs de SQL 2005 et plus Tard par Erland Sommarskog et La gestion d'erreur dans SQL 2000 – un arrière-plan par Erland Sommarskog
La meilleure façon est quelque chose comme ceci:
Créer votre procédure stockée comme:
mais seulement pour SQL Server 2005 et jusqu'. Sans utiliser les blocs TRY-CATCH dans SQL Server 2005, vous disposez d'une période très difficile de supprimer tous les messages que SQL Server renvoie. Le
extra messages
vous référer à sont causés par la nature de la façon dont les restaurations sont traitées à l'aide de @@trancount:de http://www.sommarskog.se/error-handling-I.html#trancount
Si vous ne voulez pas d'obtenir le message d'avertissement concernant le nombre de transactions ne correspondent pas, vous devez n'avoir qu'une transaction ouverte à la fois. Pour ce faire, créez tous de votre procédure est comme ceci:
En faisant cela, vous seul problème les commandes de transactions si vous n'êtes pas déjà dans une transaction. Si vous code tous de vos procédures de cette façon, seule la procédure ou le code C# qui émet le début de TRANSACTION seront effectivement émettre le COMMIT/ROLLBACK et de la transaction compte toujours un match (vous n'obtiendrez pas une erreur).
en C# à partir de TransactionScope De Documentation De Classe:
Juste une pensée, mais vous pourriez être en mesure d'utiliser le
TransactionAbortedException
attraper pour obtenir l'erreur réelle et ignorer le nombre de transactions incompatibilité d'avertissement.Ne pas utiliser les transactions dans les deux votre code C# et la sprocs. Un seul suffit. Qui presque toujours votre code C#, seulement, il sait ce que l'ensemble des mises à jour du dbase doit être rejeté ou commis dans son ensemble.
Pour la prise en charge de SQL Server 2000, l'utilisation TransactionScope pour rendre votre vie plus facile. Cependant, voir en bas pour pourquoi il a des limites.
Erreur SQL de manipulation avant d'TRY/CATCH est aléatoire. Erland article posté par KM explique la déclaration/champ d'application/lot abandon des erreurs, qui le rend si. En gros, le code peut tout simplement s'arrêter et vous êtes de gauche avec des verrous sur les rangs, etc.
C'est ce qui se passe au-dessus de votre restauration ne fonctionne pas si vous obtenez l'erreur 226 sur les transactions compte.
Si vous ne soutenir que SQL Server 2005+, puis utiliser TRY/CATCH qui intercepte toutes les erreurs et aussi l'utilisation de SET XACT_ABORT on. TRY/CATCH rend SQL Server beaucoup plus résistants et les pièges de toutes les erreurs d'exécution. SET XACT_ABORT on supprime également d'erreur 226 car il questions de restauration automatiquement et s'assure que tous les verrous sont relâchés.
BTW:
SÉLECTIONNEZ 1/0 est un excellent exemple de pourquoi vous devriez utiliser SQL pour la gestion des erreurs.
Utiliser un DataAdapter pour remplir
SQL TRY/CATCH face à cette...
Votre devez utiliser un try catch
Et cette question devrait répondre à votre question à propos de TransactionScope et les Restaurations
Comment TransactionScope roll back transactions?
Je sais que c'est un incroyablement banal suggestion, mais ne serait pas une bonne solution pour éviter la division par zéro en premier lieu? Assez bien toutes les opérations DML (insert, select, update) peut être réécrit pour éviter de diviser par des zéros à travers l'utilisation de CAS annuels.