我想在具有事务的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 SmithSET XACT_ABORT ON
,而是通过TRY..CATCH
捕获错误并明确地执行ROLLBACK
事务吗? - remTRY...CATCH
可用时,我绝对不会在SQL Server 2008上测试@@ERROR
,就像你的代码所做的那样。只要提一下,XACT_ABORT
在TRY
块中有不同的效果。 - Martin Smith