RETOURNER à l'intérieur d'une transaction de bloc TRY-CATCH
J'ai le code suivant, et je me demande, en tant que générique exemple, si l'opération est ouverte si elle sort avec RETURN
.
BEGIN TRANSACTION
BEGIN TRY
IF NOT EXISTS(SELECT 1 FROM dbo.tblProducts WHERE intProductID = @intProductID)
BEGIN
SELECT 'Product does not exists' AS strMessage
RETURN
END
UPDATE dbo.tblProducts SET
curPrice = 10
WHERE
intProductID = @intProductID
SELECT 'Success' AS strMessage
END TRY
BEGIN CATCH
SELECT ERROR_MESSAGE() AS strMessage
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION
END CATCH
IF @@TRANCOUNT > 0
COMMIT TRANSACTION
Je suis sûr que la réponse est "oui", l'opération est laissée ouverte. Les Transactions ne sont pas conditionnés par le contexte de la procédure stockée; ils sont à l'état dans la base de données. Toutefois, la documentation est assez clair sur ce point, et vous parlez des subtilités de la base de données, donc je vous conseille de lire la documentation de SQL Server.
Je viens de tirer le existe et évaluer @@rowcount msdn.microsoft.com/en-us/library/ms187316.aspx
Ou utiliser un
Ma suggestion va être de déplacer le
Je viens de tirer le existe et évaluer @@rowcount msdn.microsoft.com/en-us/library/ms187316.aspx
Ou utiliser un
OUTPUT
clause sur la UPDATE
si vous voulez savoir ce qui a changé sans faire un EXISTS
test. (Une variation sur Blam commentaire.) Ma préférence est d'avoir tous les de chemin de sortie explicitement commit ou rollback. Il montre que j'ai effectivement pris une décision.Ma suggestion va être de déplacer le
BEGIN TRAN
et COMMIT
déclarations afin qu'elles encapsulent les commandes minimales nécessaires. En faisant cela met en évidence que, dans cet exemple, la transaction est redondant; la UPDATE
est la seule déclaration au cours de laquelle il peut avoir n'importe quel effet et l' UPDATE
est par définition atomique.
OriginalL'auteur user1185775 | 2012-08-18
Vous devez vous connecter pour publier un commentaire.
Ce code fonctionne avec les transactions imbriquées:
OriginalL'auteur Eduardo
Il doit être comme ci-Dessous
RAISERROR
pour être traitée comme une erreur. Cette approche est très bien si l'OP est juste en cours d'exécution une fois dans le terminal, mais si il faut aller dans la production meilleure que les gens savent àRAISERROR
dans les CAPTURES à l'éviter juste échec silencieux.OriginalL'auteur eddedeed
J'ai juste essayé cela en exécutant le code ci-dessus puis de vérifier
SELECT @@TRANCOUNT
puis en tentant uneROLLBACK
. Après le retour,@@TRANCOUNT
1 et j'ai été en mesure derollback
la transaction avec succès indiquant que letransaction
est laissé ouvert.OriginalL'auteur PseudoToad
Veuillez consulter la Procédure Stockée modèle que j'ai posté dans la suite de DBA.StackExchange réponse qu'il adresse à l'utilisation de TRY /CATCH avec les Transactions, et il gère les appels imbriqués, même si la Transaction est ouvert dans l'application de la couche:
Sommes-nous tenus de gérer des Transactions dans le Code C# ainsi que dans le Magasin de la procédure
OriginalL'auteur Solomon Rutzky