在存储过程中设置显式事务的正确方法

时间:2012-01-03 17:17:18

标签: sql-server-2008 stored-procedures

我创建了一个存储过程,在汇总表中有9个插入,最后一个语句是删除。

此过程大约需要9分钟才能执行每个给定日期,我注意到的一件事是,如果发生错误并执行前3个插入,则会保留插入的数据。为了解决这个问题,我创建了一个开始尝试并开始事务,我做的测试是使用SSMS启动过程,在启动之后,我取消了命令,但事务被保留了。我怎么能避免这个?

程序正文非常简单......如:

insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
insert into...
delete from....

感谢

1 个答案:

答案 0 :(得分:0)

两件事:

1)基本语法是:

BEGIN TRY

  BEGIN TRAN

  INSERT...

  DELETE...

  COMMIT TRAN

END TRY
BEGIN CATCH

  IF (@@TRANCOUNT > 0)
  BEGIN
    ROLLBACK TRAN
  END

  DECLARE @ErrorMessage NVARCHAR(4000)
  SET @ErrorMessage = 'Line ' + CONVERT(VARCHAR(20), ERROR_LINE()) + ': '
                    + ERROR_MESSAGE()
  RAISERROR(@SQLErrString, 16, 1)

END CATCH

2)如果取消正在进行的批处理,则可能需要手动运行ROLLBACK TRAN。您可以通过执行SELECT @@ TRANCOUNT测试是否需要执行此操作,如果它是> 0然后调用ROLLBACK TRAN。