2011-11-29 20 views
4

我试过寻找这个,但我还没有找到任何东西。如果我有类似的东西:在使用提交之前退出存储过程是否有害?

CREATE PROCEDURE QQ 
AS 

BEGIN TRANSACTION 

BEGIN TRY 

    -- return early and skip commit here 
    IF (Condition = true) 
     RETURN 0 

    COMMIT TRANSACTION 

END TRY 

BEGIN CATCH 

    ROLLBACK 

END CATCH 

交易会发生什么?

+1

请记住TSQL有效地使用一个计数器来确定一个事务是否打开 - 如果这个计数器没有适当的递减... – 2011-11-29 19:28:39

+0

是的,这就是我在想的 – Gixonita

回答

5

它会一直保持打开状态,直到您COMMIT,ROLLBACK,或者连接关闭并且该spid被终止。

这将阻止其他进程并导致各种其他问题。

通常在您的CATCH区块中运行如下检查,以确保您清楚地关闭。

IF @@TRANCOUNT > 0 
ROLLBACK 

WHILE @@Trancount > 0 
BEGIN 
    ROLLBACK 
END 
+0

尽管强制回滚可能不会很好地与其他代码/ sprocs ...最好使每个单元自清洁IMOHO。 – 2011-11-29 19:31:21

+0

@pst - 抱歉,我的意思是在他的'CATCH'块内。我会澄清。 – JNK

+0

可能会添加一个标志变量@Return_Value并跳转到代码中的位置,它根据标志进行回滚或提交,然后返回标志 – Gixonita

0

只是可以肯定,你退出语句之前我会执行回滚。根据您的数据库软件,他们可以在退出时执行自动提交。

相关问题