【发布时间】:2015-06-29 15:23:01
【问题描述】:
我有这段脚本:
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 处理触发器中的错误的默认行为。
我的问题是,如果我这样做,是否会给系统带来任何问题?
我们将不胜感激除了剥离触发逻辑之外的任何其他解决方案。
【问题讨论】:
-
在您的 catch 语句中,您插入并发出回滚。应该反过来。无需更改
XACT_ABORT -
@ughai,问题是一旦 SQL 在触发器中生成错误,因为设置事务注定要失败,除非我们关闭该开关,否则我找不到解决它的方法。我不在乎我在 catch 块中做什么,我只需要让我的交易保持活跃。
标签: sql-server exception-handling