请教有经验的人士,所有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