最后在SQL Server Transaction中的子句?无论成功与否,都会执行哪些事情?

时间:2012-10-24 17:03:23

标签: sql sql-server transactions try-catch-finally sqltransaction

在SQL Server中,c#的finally块中是否有类似于try..catch...子句的内容?

我的意思是,我在SQL Server事务中使用BEGIN TRAN, END TRAN, COMMIT TRAN, ROLLBACK TRAN等,并且想要一个部分或一组需要触发的操作,无论成功或失败或事务如何。

有解决方案吗? (类似于最终阻止尝试/捕获OOPS语言)。

提前致谢

3 个答案:

答案 0 :(得分:4)

没有任何将以“100%可靠性”运行“无论成功或失败”。无论你是在谈论C#程序的“finally”子句,还是在SQL Server上开始尝试...结束尝试开始...结束捕获结构都无关紧要。

问题是这些终端块无法在每个可能的故障模式下执行。每个可能的故障模式都必须包括软件,硬件和网络故障。如果您的客户是政府,也可能必须包括导弹攻击。

强制性引用classic TheDailyWTF

答案 1 :(得分:1)

事实上,SQL Server中有BEGIN TRY... END TRY...BEGIN CATCH... END CATCH结构。我经常使用它。

这是一个概述 - 关于选择错误信息的这一点当然是可选的 - 做你认为有意义的事情。

BEGIN TRY
        -- do something here.

    /*  Following line can be used to force termination for testing purposes.
        No data changes will be committed.
    */
    --RAISERROR('testing', 99, 1);

    PRINT 'Successful completion; committing transaction.';
    COMMIT TRAN;
END TRY
BEGIN CATCH
    SELECT 
        ERROR_NUMBER() AS ErrorNumber
        ,ERROR_SEVERITY() AS ErrorSeverity
        ,ERROR_STATE() AS ErrorState
        ,ERROR_PROCEDURE() AS ErrorProcedure
        ,ERROR_LINE() AS ErrorLine
        ,ERROR_MESSAGE() AS ErrorMessage;

    IF @@TRANCOUNT > 0
        ROLLBACK TRANSACTION;
    RAISERROR(N'Error occurred; rolling back and terminating.',18,1);
END CATCH;

答案 2 :(得分:0)

最后一次是每次都会引发错误。

如果你想捕获回滚错误 - 你还需要将它放在try..except块中。