Вы видите какие-либо проблемы с этим шаблоном хранимой процедуры? - PullRequest
0 голосов
/ 03 декабря 2009

поэтому я создал это (я использовал некоторые вещи, найденные на другом веб-сайте) для обработки транзакций и наличия своего рода трассировки стека при выполнении хранимой процедуры, которая может вызывать другие хранимые процедуры, требующие транзакции и т. Д.

так что если у меня A звонит B и B звонит C и C получил ошибку Я могу правильно откатить мои вещи и вернуть стековую трассировку, говорящую: ошибка в C следуйте трассировке, чтобы выяснить, где / как / и т.д ...

Кто-нибудь из вас обнаружил проблему с этой логикой?

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[NAME]
AS
BEGIN
    SET NOCOUNT ON
    SET XACT_ABORT ON

    declare @trancount int
    set @trancount = @@trancount
    declare @savePointName varchar(40)
    set @savePointName = newid()

    BEGIN TRY  
        if @trancount = 0
            begin transaction
        else
            save transaction @savePointName

        /*
        //  STUFF HERE
        */

        if @trancount = 0
            commit transaction
    END TRY  
    BEGIN CATCH
        declare  @xstate int
        set @xstate = XACT_STATE()
        if @xstate = -1  and @trancount = 0
            rollback transaction
        if @xstate = 1 and @trancount = 0
            rollback transaction
        if @xstate = 1 and @trancount > 0
            rollback transaction @savePointName

        declare @message varchar(max)
            set @message = ERROR_MESSAGE() + 
                       ' (' + ERROR_PROCEDURE() + 
                       ':' + ltrim(str(ERROR_LINE())) + 
                       ', Raised ' + ltrim(str(ERROR_NUMBER())) +
                       ', Severity ' + ltrim(str(ERROR_SEVERITY())) +
                       ', State ' + ltrim(str(ERROR_STATE())) + ')'

        RAISERROR(@message,16,1)
    END CATCH
END

1 Ответ

1 голос
/ 03 декабря 2009

Нет, я не вижу ничего плохого в этом коде.

...