从下面的代码中,我们在raiseerror上遇到异常 - 当前事务无法提交,也无法支持写入日志文件的操作。回滚交易。
IF @insertOrUdate = 'D'
BEGIN
-- DescType depends on CorrectionType and is also a protected sync table,
-- it needs to be cleared out before we can remove this type
IF EXISTS(
SELECT TOP 1 *
FROM [dbo].[DescType]
WHERE
[CorrectionTypeId] = @correctionTypeId
)
BEGIN
PRINT 'raise error'
RAISERROR('Dependent Desc Role Type Rollups must be removed prior to removing a type that they depend on', 16, 1)
PRINT 'after raise error'
END
-- Delete protected Sync record
DELETE FROM [dbo].[CorrectionType] WHERE [CorrectionTypeId] = @correctionTypeId;
END;
答案 0 :(得分:6)
因为您将SET XACT_ABORT ON' when you do your
RAISERROR()you're setting the
XACT_STATE`设置为-1,这意味着您无法再对数据库执行任何可提交的工作,您只能回滚事务。
使用temp procs和上面的一个触发器的示例:
create proc #a
as
--This is the proxy for the parent proc
begin try
begin tran
exec #b
commit tran
end try
begin catch
if @@trancount > 0 rollback
select error_message();
end catch
go
create proc #b
as
set xact_abort on;
begin try;
DISABLE TRIGGER [dbo].[trg_dml_CorrectionType_InsteadOfDelete] ON [dbo].[CorrectionType];
--Check state
select xact_state() one;
raiserror('Error!', 16,1)
--This one doesn't run of course
select xact_state() two
end try
begin catch
select xact_state() three;
select error_message() as msgprior;
ENABLE TRIGGER [dbo].[trg_dml_CorrectionType_InsteadOfDelete] ON [dbo].[CorrectionType];
--This doesn't run either, new error
select xact_state() four;
--if @@trancount > 0 rollback transaction;
declare @error nvarchar(2500)
select @error = error_message()
raiserror(@error, 16,1);
end catch
GO
exec #a
我相信你有几个选择:
答案 1 :(得分:0)
在我的案例中,这被证明是环境的:分布式事务协调器服务已经停止。重新启动此Windows服务为我们解决了问题。