Задание SQL, имеющее проблемы с журналом транзакций - PullRequest
1 голос
/ 24 июня 2009

У меня есть задание SQL, которое просто выполняет хранимую процедуру. Каждое утро при попытке запуска задания я получаю следующую ошибку:

Текущая транзакция не может быть зафиксирована и не может поддерживать операции записи в файл журнала.

Когда я продолжаю пытаться перезапустить работу, она продолжает выдавать мне ту же ошибку. Однако, если я просто выполню процедуру сохранения без использования задания, она будет работать нормально.

А вот действительно очень сложная часть. Если я просто запускаю хранимую процедуру, отменяю ее и затем запускаю задание, задание работает отлично.

Кто-нибудь сталкивался с этой довольно уникальной проблемой или есть идеи, что может быть ее причиной?

Ответы [ 2 ]

3 голосов
/ 24 июня 2009

Эта ошибка означает, что вы пытаетесь выполнить зарегистрированную операцию во время обреченной транзакции. Это может произойти только в блоке BEGIN CATCH, если вы игнорируете значение XACT_STATE , равное -1:

У текущего запроса есть активный пользователь транзакция, но произошла ошибка что привело к транзакции классифицируется как uncommittable сделка. Запрос не может быть зафиксирован сделка или откат к Точка сохранения; он может запросить только полный откат сделки. запрос не может выполнить запись операции, пока он не откатит сделка. Запрос может только выполнять операции чтения, пока он не катится вернуть сделку После транзакция была отменена, Запрос может выполнять как чтение, так и Операции записи и могут начать новый сделка.

Тот факт, что ваша попытка сделать это просто указывает на проблему кода с обработкой исключений (другими словами, ваша процедура глючит). Недавно я написал в блоге шаблон для процедур, которые используют BEGIN TRY / BEGIN CATCH , и вы можете использовать его в качестве отправной точки для исправления вашей процедуры. У Эрланда Соммарскога есть хорошо известная статья об обработке ошибок Transact-SQL , но она не охватывает слишком глубоко BEGIN TRY / BEGIN CATCH.

При правильной обработке ошибок вы можете узнать исходную ошибку, которая возникает и в первую очередь приводит к выполнению блока CATCH. Поскольку вы упоминаете, что выполнение процедуры вручную не вызывает проблем, проблема, скорее всего, заключается в различиях контекста между заданием агента SQL и выполнением вручную. Я не могу диагностировать проблему без каких-либо данных, но мое предположение о наиболее вероятной причине заключается в разнице в контексте безопасности (т. Е. Для входа в систему агента не хватает некоторых прав, которыми обладает ваш собственный вход).

1 голос
/ 03 ноября 2010

Я получал эту ошибку при других условиях и придумал короткий путь репликации (отсутствует дефект программного обеспечения 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
...