我有一个简单的执行存储过程的SQL作业。 当作业尝试运行每天早晨,我得到以下错误:
当前事务无法提交,无法支持写入日志文件的操作。
当我一直试图重新开始作业,它不断给我同样的错误。 但是,如果我只是执行该存储过程不使用工作,它工作正常。
而这里的真的很棘手的部分。 如果我只是运行存储过程,取消它,然后运行作业,作业工作完全正常。
有没有人碰到这个独特问题或有任何想法可能是什么造成的呢?
我有一个简单的执行存储过程的SQL作业。 当作业尝试运行每天早晨,我得到以下错误:
当前事务无法提交,无法支持写入日志文件的操作。
当我一直试图重新开始作业,它不断给我同样的错误。 但是,如果我只是执行该存储过程不使用工作,它工作正常。
而这里的真的很棘手的部分。 如果我只是运行存储过程,取消它,然后运行作业,作业工作完全正常。
有没有人碰到这个独特问题或有任何想法可能是什么造成的呢?
此错误表明您正在尝试注定交易过程中做了记录的操作。 如果你忽略了这只能在BEGIN CATCH块发生XACT_STATE值-1:
当前的请求具有一个活跃的用户交易,但出现了错误已经导致事务被分类为提交的事务。 请求不能提交事务或回滚到保存点; 它只能请求交易的全部回滚。 直到它回滚事务请求不能执行任何写操作。 直到它回滚事务请求只能执行读操作。 该交易已回滚后,要求能进行读取和写入操作,并且可以开始一个新的事务。
你试图做到这一点的事实仅仅表明一个代码问题,您的异常处理(换句话说,你的程序是越野车)。 我最近的博客上讲述了使用BEGIN TRY程序模板/ BEGIN CATCH ,你可以使用它作为出发点,以解决您的程序。 厄兰Sommarskog有上的Transact-SQL的错误处理一个众所周知的物品 ,但不包括在BEGIN TRY / CATCH BEGIN太深。
随着搬运就位正确的错误,你就可以发现,发生并引起你的catch块摆在首位,执行原判错误。 既然你提到的是手动运行该程序不会造成问题,那么问题很可能在SQL代理作业和您手动执行上下文之间的差异。 没有任何数据我无法诊断的问题,但我对最可能的原因的猜测是在安全范围内(即代理登录缺乏某些权利自己的登录了)的区别。
我在不同的条件下得到这个错误,我来了,用了很短的复制路径(软件缺陷是缺少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