我的存储过程会回滚得足够远吗?

时间:2011-08-05 15:52:56

标签: php sql-server-2008 rollback

我正在通过带有odbc连接的php使用sql server 2008数据库。

我正在读取数据文件并将它们记录到数据库中,但由于文件大小/布局不同,我的sql会自动生成。

按此顺序调用sql:

set autocommit to off
execute some sql 
execute more sql 
execute a SP.
commit

在我的存储过程中,我想使用try catch进行错误处理,如下所示:

BEGIN try
    --sql
END try
BEGIN catch
    rollback
END catch

我想知道这会只回滚sp并让我的其他sql提交还是会回到autocommit设置为off的地步?

另一种可能的解决方案是从存储过程返回false / true并使用它从php调用回滚。这可能吗?如果是这样,如何使用存储过程返回值?

2 个答案:

答案 0 :(得分:1)

AFAIK,只要您将要回滚的所有内容包装到事务中,然后您就知道可以回滚那么远。请注意您的被叫处理委托他们自己的交易 - 但请参阅here了解更多信息。

例如,使用您提供的内容:

DECLARE @success bit
BEGIN TRAN T1

    BEGIN try
        EXEC [dbo].[usp_MyProc]
        SET @success = 1
        PRINT 'SUCCESS'
    END try
    BEGIN catch
        SET @success = 0
        PRINT 'FAIL'
    END catch

    IF @success = 1
        BEGIN
            COMMIT TRAN T1
        END
    ELSE
        BEGIN
            ROLLBACK TRAN T1
        END
PRINT @@TRANCOUNT
在这两种情况下,

最终都应为TRANCOUNT

答案 1 :(得分:0)

您正在查看嵌套事务。

请参阅此主题:复制/粘贴抱歉太多

Nested stored procedures containing TRY CATCH ROLLBACK pattern?