日期:2014-05-16  浏览次数:20484 次

请教有经验的人士,所有SP都有必要用Try Catch 和 TRANSACTION 吗?
今天上级对我说,今后所有SP都要用
BEGIN TRY              
BEGIN TRANSACTION          
    .....
COMMIT TRANSACTION          
END TRY                  
BEGIN CATCH
    .....    
    ROLLBACK TRANSACTION               
END CATCH
这样的结构,我想问,这样有必要吗,什么时候是有必要的?
谢谢!
------解决方案--------------------
如果只是查询语句没有必要用。

如果有UPDATE或者DELETE语句 而且不止一个批的话 就需要用这个比较好。
------解决方案--------------------
这个写法,在原来的公司,我也建议公司的主管,采用这种写法。

因为通过监控发现,经常有日结存储过程执行失败的,但是只执行了一部分。

其实这样做,主要在于,有时候,在一个存储过程中,如果是这样:

update 。。。

insert into。。。

如果update报错了,insert into 照样能执行,所以最好是包含在一个事务中,另外,try -catch也能捕获异常,然后主动回滚。


------解决方案--------------------
非常有必要,这和编程是一样的,如果一段代码没有包含在try catch里,它的风险就是不可控的。

很简单的查询可以省略,是因为它基本没有风险,不需要控制。如果你的存储过程里有业务操作,如insert,update,delete,那就一定要把异常处理做好,事前多一分力,事后省十分力
------解决方案--------------------
建议,但不强制,有些业务是必须的。你也不希望汇款的时候不成功但是你帐号又扣钱的吧?
------解决方案--------------------
给个我常用的模板,供参考,大家也提下意见,其实这个也是从微软的示例库里抄来的,
模板:

-- =============================================
-- Author:
-- Create date: 2013-01-01
-- Description:
-- Note:
-- =============================================
CREATE PROCEDURE dbo.ProcTemplate
AS 
    BEGIN
        SET NOCOUNT ON;
        BEGIN TRY
            BEGIN TRANSACTION;


            
            COMMIT TRANSACTION;
        END TRY
        BEGIN CATCH
            IF @@TRANCOUNT > 0 
                BEGIN
                    ROLLBACK TRANSACTION;
                END
            EXECUTE dbo.ProcLogError;
            RETURN -1;
        END CATCH;

        RETURN 0;
    END;
GO


当中调用的ProcLogError如下:

-- =============================================
-- Author:
-- Create date: 2013-03-20
-- Description: 用于将错误记录到ErrorLog表。
-- =============================================
CREAT