簡體   English   中英

SQL作業與事務日志有問題

[英]SQL Job having issues with transaction log

我有一個簡單執行存儲過程的SQL作業。 每天早上當作業嘗試運行時,我都會收到以下錯誤:

當前事務無法提交,也無法支持寫入日志文件的操作。

當我不斷嘗試重新啟動作業時,它會一直給我同樣的錯誤。 但是,如果我只是在不使用Job的情況下執行存儲過程,它可以正常工作。

這是真正棘手的部分。 如果我只是運行存儲過程,取消它,然后運行作業,工作完全正常。

有沒有人遇到這個相當獨特的問題,或者有任何想法可能導致它?

此錯誤表示您正在嘗試在注定的事務期間執行記錄操作。 如果您忽略XACT_STATE值為-1,則只能在BEGIN CATCH塊中發生:

當前請求具有活動用戶事務,但是發生了導致事務被分類為不可提交事務的錯誤。 請求無法提交事務或回滾到保存點; 它只能請求完全回滾事務。 在回滾事務之前,請求無法執行任何寫入操作。 請求只能在回滾事務之前執行讀取操作。 事務回滾后,請求可以執行讀取和寫入操作,並可以開始新事務。

您嘗試執行此操作僅表示您的異常處理存在代碼問題(換句話說,您的過程是錯誤的)。 我最近在博客上寫了一個關於使用BEGIN TRY / BEGIN CATCH的程序的模板 ,你可以用它作為修復程序的起點。 Erland Sommarskog有一篇關於Transact-SQL錯誤處理的着名文章 ,但這並沒有涵蓋BEGIN TRY / BEGIN CATCH太深入。

通過適當的錯誤處理,您可以找出發生的原始錯誤並使您的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM