SQL工作具有事务日志的问题(SQL Job having issues with transact

2019-06-24 02:04发布

我有一个简单的执行存储过程的SQL作业。 当作业尝试运行每天早晨,我得到以下错误:

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

当我一直试图重新开始作业,它不断给我同样的错误。 但是,如果我只是执行该存储过程不使用工作,它工作正常。

而这里的真的很棘手的部分。 如果我只是运行存储过程,取消它,然后运行作业,作业工作完全正常。

有没有人碰到这个独特问题或有任何想法可能是什么造成的呢?

Answer 1:

此错误表明您正在尝试注定交易过程中做了记录的操作。 如果你忽略了这只能在BEGIN CATCH块发生XACT_STATE值-1:

当前的请求具有一个活跃的用户交易,但出现了错误已经导致事务被分类为提交的事务。 请求不能提交事务或回滚到保存点; 它只能请求交易的全部回滚。 直到它回滚事务请求不能执行任何写操作。 直到它回滚事务请求只能执行读操作。 该交易已回滚后,要求能进行读取和写入操作,并且可以开始一个新的事务。

你试图做到这一点的事实仅仅表明一个代码问题,您的异常处理(换句话说,你的程序是越野车)。 我最近的博客上讲述了使用BEGIN TRY程序模板/ BEGIN CATCH ,你可以使用它作为出发点,以解决您的程序。 厄兰Sommarskog有上的Transact-SQL的错误处理一个众所周知的物品 ,但不包括在BEGIN TRY / CATCH BEGIN太深。

随着搬运就位正确的错误,你就可以发现,发生并引起你的catch块摆在首位,执行原判错误。 既然你提到的是手动运行该程序不会造成问题,那么问题很可能在SQL代理作业和您手动执行上下文之间的差异。 没有任何数据我无法诊断的问题,但我对最可能的原因的猜测是在安全范围内(即代理登录缺乏某些权利自己的登录了)的区别。



Answer 2:

我在不同的条件下得到这个错误,我来了,用了很短的复制路径(软件缺陷是缺少IF XACT_STATE() != 1 ROLLBACK

-- prepare SP

IF OBJECT_ID(N'ShortReplicationPath',N'P') IS NOT NULL     DROP PROCEDURE dbo.ShortReplicationPath
GO

CREATE PROCEDURE dbo.ShortReplicationPath
AS 

BEGIN  
    BEGIN TRY   

        insert #TempTabDateTime (ValidFrom) Values ('date')

    END TRY

    BEGIN CATCH

        PRINT ERROR_NUMBER();        PRINT ERROR_MESSAGE();

    INSERT INTO     #TempTabVarChar
    (       Text    )
    VALUES  (       'abcdefg'   )

    END CATCH

END 

GO

-- Execute test:

IF OBJECT_ID ('TEMPDB..#TempTabDateTime') IS NOT NULL drop table #TempTabDateTime

create table #TempTabDateTime (ValidFrom DATETIME)

IF OBJECT_ID ('TEMPDB..#TempTabVarChar') IS NOT NULL drop table #TempTabVarChar

create table #TempTabVarChar (Text VarChar(MAX))

BEGIN TRANSACTION

    EXEC dbo.ShortReplicationPath
ROLLBACK

GO


文章来源: SQL Job having issues with transaction log