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

时间:2013-04-16 09:28:20

标签: sql-server-2008

从下面的代码中,我们在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;

2 个答案:

答案 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. 为此proc设置XACT_ABORT为OFF。那应该处理 针对此特定方案的XACT_STATE问题以及您的ROLLBACK 应该处理你的触发问题。
  2. 移动您的ENABLE / DISABLE触发器 到您的父proc并在事务之外处理它们 完全。他们不需要依赖于你的其他行为 这个孩子过程;无论如何,你总是禁用/启用它们。

答案 1 :(得分:0)

在我的案例中,这被证明是环境的:分布式事务协调器服务已经停止。重新启动此Windows服务为我们解决了问题。