[英]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.