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 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