我有这段剧本:
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的默认行为。
我的问题是,如果我这样做,是否会将任何问题暴露给系统?
除了从逻辑上剥离触发器之外的任何其他解决方案将非常感激。
答案 0 :(得分:1)
如果您想让自己的交易保持活跃,XACT_ABORT = OFF
应该有所帮助。
但是,设置XACT_ABORT = OFF
并不能保证交易在所有情况下都能继续。这取决于错误的严重程度。
当SET XACT_ABORT为OFF时,在某些情况下,仅回滚引发错误的Transact-SQL语句,并且事务继续处理。根据错误的严重程度,即使SET XACT_ABORT为OFF,也可以回滚整个事务。
XACT_ABORT = OFF
的另一个问题是,现在您的错误处理和持久存储的数据流程在具有不同XACT_ABORT
设置的代码中是不同的。
修改强>
这些链接可能有所帮助。