Вопрос по sql, sql-server – Задание SQL, имеющее проблемы с журналом транзакций

1

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

The current transaction cannot be committed and cannot support operations that write to the log file.

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

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

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

На самом деле, нет. Это довольно длительные процессы. Часть, которая только что поставила меня в тупик, - это то, почему у меня никогда не было проблем с выполнением самой процедуры, но у агента есть проблемы. И тогда агент сможет запустить его после того, как я его запущу. Justin Balvanz
можете выложить код процедуры. Raj More

Ваш Ответ

2   ответа
3

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

The current request has an active user transaction, but an error has occurred that has caused the transaction to be classified as an uncommittable transaction. The request cannot commit the transaction or roll back to a savepoint; it can only request a full rollback of the transaction. The request cannot perform any write operations until it rolls back the transaction. The request can only perform read operations until it rolls back the transaction. After the transaction has been rolled back, the request can perform both read and write operations and can begin a new transaction.

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

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

Error: User Rate Limit Exceeded
1

икации (отсутствует дефект программного обеспечения)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

Похожие вопросы