zoukankan      html  css  js  c++  java
  • 写存储过程时,对于嵌套Transaction如何控制

    今天在微软网站上看到一个示例,是显示嵌套transaction的标准写法,把示例记录在这里。

    原文:http://msdn.microsoft.com/zh-cn/library/ms188378.aspx

    USE AdventureWorks2012;
    GO
    IF EXISTS (SELECT name FROM sys.objects
               WHERE name = N'SaveTranExample')
        DROP PROCEDURE SaveTranExample;
    GO
    CREATE PROCEDURE SaveTranExample
        @InputCandidateID INT
    AS
        -- Detect whether the procedure was called
        -- from an active transaction and save
        -- that for later use.
        -- In the procedure, @TranCounter = 0
        -- means there was no active transaction
        -- and the procedure started one.
        -- @TranCounter > 0 means an active
        -- transaction was started before the
        -- procedure was called.
        DECLARE @TranCounter INT;
        SET @TranCounter = @@TRANCOUNT;
        IF @TranCounter > 0
            -- Procedure called when there is
            -- an active transaction.
            -- Create a savepoint to be able
            -- to roll back only the work done
            -- in the procedure if there is an
            -- error.
            SAVE TRANSACTION ProcedureSave;
        ELSE
            -- Procedure must start its own
            -- transaction.
            BEGIN TRANSACTION;
        -- Modify database.
        BEGIN TRY
            DELETE HumanResources.JobCandidate
                WHERE JobCandidateID = @InputCandidateID;
            -- Get here if no errors; must commit
            -- any transaction started in the
            -- procedure, but not commit a transaction
            -- started before the transaction was called.
            IF @TranCounter = 0
                -- @TranCounter = 0 means no transaction was
                -- started before the procedure was called.
                -- The procedure must commit the transaction
                -- it started.
                COMMIT TRANSACTION;
        END TRY
        BEGIN CATCH
            -- An error occurred; must determine
            -- which type of rollback will roll
            -- back only the work done in the
            -- procedure.
            IF @TranCounter = 0
                -- Transaction started in procedure.
                -- Roll back complete transaction.
                ROLLBACK TRANSACTION;
            ELSE
                -- Transaction started before procedure
                -- called, do not roll back modifications
                -- made before the procedure was called.
                IF XACT_STATE() <> -1
                    -- If the transaction is still valid, just
                    -- roll back to the savepoint set at the
                    -- start of the stored procedure.
                    ROLLBACK TRANSACTION ProcedureSave;
                    -- If the transaction is uncommitable, a
                    -- rollback to the savepoint is not allowed
                    -- because the savepoint rollback writes to
                    -- the log. Just return to the caller, which
                    -- should roll back the outer transaction.

            -- After the appropriate rollback, echo error
            -- information to the caller.
            DECLARE @ErrorMessage NVARCHAR(4000);
            DECLARE @ErrorSeverity INT;
            DECLARE @ErrorState INT;

            SELECT @ErrorMessage = ERROR_MESSAGE();
            SELECT @ErrorSeverity = ERROR_SEVERITY();
            SELECT @ErrorState = ERROR_STATE();

            RAISERROR (@ErrorMessage, -- Message text.
                       @ErrorSeverity, -- Severity.
                       @ErrorState -- State.
                       );
        END CATCH
    GO

  • 相关阅读:
    小程序隐藏或自定义 scroll-view滚动条
    小程序携带参数(单个或多个)跳转页面(实例)
    小程序接收from表单数据(实例)
    js返回上一页
    项目部署到线上后台进不去
    微信小程序取消button边框线
    阿里iconfont图库官网网址
    php 发送邮件(实例)
    PHP 数组序列化,转为字符串
    面向对象的设计原则
  • 原文地址:https://www.cnblogs.com/sdikerdong/p/2507679.html
Copyright © 2011-2022 走看看