Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 嵌套存储过程和事务作用域_Sql Server 2008_Stored Procedures_Scope - Fatal编程技术网

Sql server 2008 嵌套存储过程和事务作用域

Sql server 2008 嵌套存储过程和事务作用域,sql-server-2008,stored-procedures,scope,Sql Server 2008,Stored Procedures,Scope,我有一个主要的工作程序和一个附带的日志记录程序。我希望验证我对sql server 2008的假设。期望的结果是SP1做它能做的任何工作,并在记录进度的过程中调用SP2。无论SP1是否遇到会导致其事务回滚的错误,SP2工作都会提交 我的东西看起来安全吗?我是否需要在SP2中以不同的方式命名事务 ------------------------------------------------------- SP1 pseudocode BEGIN TRY BEGIN TRANSACTION

我有一个主要的工作程序和一个附带的日志记录程序。我希望验证我对sql server 2008的假设。期望的结果是SP1做它能做的任何工作,并在记录进度的过程中调用SP2。无论SP1是否遇到会导致其事务回滚的错误,SP2工作都会提交

我的东西看起来安全吗?我是否需要在SP2中以不同的方式命名事务

------------------------------------------------------- SP1 pseudocode
BEGIN TRY
    BEGIN TRANSACTION

    -- Do stuff
    -- log progress
    exec SP2( getutcdate(), 'source_is_sp1','message for progress');

    -- Do more stuff
    -- log progress
    exec SP2( getutcdate(), 'source_is_sp1','message for progress');

    -- etc

    COMMIT TRANSACTION
    RETURN 0
END TRY
BEGIN CATCH
    -- error handling not important
    ROLLBACK TRANSACTION
    return @StepNumber -- not important 
END CATCH


------------------------------------------------------- SP2

CREATE PROCEDURE [dbo].[SP2]

    @Source as nvarchar(100),
    @Timestamp as datetime,
    @Message as nvarchar(4000)

AS
BEGIN
    SET NOCOUNT ON;

    IF @Timestamp is null
    BEGIN
        set @Timestamp = GETUTCDATE();
    END

    IF @Source IS NOT NULL AND @Message IS NOT NULL
    BEGIN
        BEGIN TRANSACTION;
            INSERT INTO LOG(LOGTIMESTAMP, SOURCEVCH, MESSAGEVCH) 
                    VALUES (@Timestamp, @Source, @Message);
        COMMIT TRANSACTION;
    END
END

在本例中,当调用外部事务的回滚时,将回滚对日志的写入,反之,当调用外部事务的提交时,将提交对日志的写入。如果在SP中使用事务,则应检查@TRANCOUNT以确保提交是安全的。可能正在进行日志记录,但在回滚后添加一个日志条目以记录导致回滚的错误。感谢您的评论。是的,我也想在catch块中做一个日志消息。我真的很想记录整个过程,即使我不得不回滚事务。所以我的假设是错误的。在获得更深入的速成课程后,似乎所有这些内部事务都将回滚。从我最近了解到,插入/更新/删除的局部变量表不会回滚。因此,我可以定义一个本地@Logs,在此过程中对其进行操作,最后在try或catch结束时将其记录到主日志表中。