【发布时间】:2011-11-05 20:50:34
【问题描述】:
我想在带有事务的 SQL Server 2008R2 存储过程中设置SET XACT_ABORT ON,所以在创建脚本中进行:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET XACT_ABORT ON
GO
CREATE PROCEDURE MyProc
AS
BEGIN TRAN
...
IF @@ERROR <> 0
BEGIN
GOTO Done
END
...
IF @@ERROR <> 0
BEGIN
GOTO Done
END
COMMIT TRAN
Done:
IF @@ERROR <> 0
BEGIN
ROLLBACK TRAN
END
GO
成功创建后,我通过单击“修改”存储过程选项检查事务,并在生成的ALTER PROCEDURE 脚本中看不到SET XACT_ABORT ON 行:
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE MyProc
AS
BEGIN TRAN
...
我哪里错了或者有什么诀窍?如何正确定义SET XACT_ABORT ON?
【问题讨论】:
-
您没有在过程定义中包含
SET语句。就像你在 2008 年一样,你应该看看TRY ... CATCH。 -
@Martin Smith:您的意思是根本不包括
SET XACT_ABORT ON,而是通过TRY..CATCH捕获错误并明确ROLLBACK一个事务? -
请参阅this answer 和下面的 cmets 以获得关于此的良好讨论。我绝对不会费心在 SQL Server 2008 上测试
@@ERROR,因为当TRY...CATCH可用时您的代码正在执行此操作。只是提到XACT_ABORT在TRY块中具有不同的效果。 -
@Martin Smith:谢谢,马丁!我会注意的。
标签: sql-server sql-server-2008 tsql stored-procedures transactions