XACT_Abort =使用Try Catch打开问题

时间:2015-06-29 01:13:40

标签: sql-server exception-handling

我有这段剧本:

Create Table AA (ID int identity(1,1), Col1 varchar(10))
Create Table BB (ID int identity(1,1), Col1 varchar(10))
GO
Create proc p6
as
insert into AA
(Col1)
Values('')

GO

Create Trigger [dbo].[TR_AA] on [dbo].[AA]
After insert
As
--Set XACT_Abort off
Select 1/0
GO

Begin Try
Begin Tran

Select @@TRANCOUNT

exec p6

Commit Tran
End Try
Begin Catch
  insert into BB(Col1)Values('')
  Select * from AA
  --Select XACT_STATE()

  Rollback Tran
End Catch

Select Count(*) from AA

GO

当我运行此代码时,我收到此错误:

  

当前事务无法提交且无法支持   写入日志文件的操作。回滚交易。

我已经知道是什么导致了这个问题。

这个例子只是一个例子。但我在触发器中有很多业务逻辑,我无法将它们移出。

因此,一个解决方法是将Set XACT_Abort off放在开头 触发。但是,通过这样做,我们覆盖了处理触发器错误的SQL的默认行为。

我的问题是,如果我这样做,是否会将任何问题暴露给系统?

除了从逻辑上剥离触发器之外的任何其他解决方案将非常感激。

1 个答案:

答案 0 :(得分:1)

如果您想让自己的交易保持活跃,XACT_ABORT = OFF应该有所帮助。

但是,设置XACT_ABORT = OFF并不能保证交易在所有情况下都能继续。这取决于错误的严重程度。

  

当SET XACT_ABORT为OFF时,在某些情况下,仅回滚引发错误的Transact-SQL语句,并且事务继续处理。根据错误的严重程度,即使SET XACT_ABORT为OFF,也可以回滚整个事务。

XACT_ABORT = OFF的另一个问题是,现在您的错误处理和持久存储的数据流程在具有不同XACT_ABORT设置的代码中是不同的。

修改

这些链接可能有所帮助。

Why TRY CATCH does not suppress exception in trigger

Ignoring errors in Trigger