1

単純にストアド プロシージャを実行する SQL ジョブがあります。毎朝ジョブを実行しようとすると、次のエラーが表示されます:

現在のトランザクションはコミットできず、ログ ファイルに書き込む操作をサポートできません。

ジョブを再起動しようとすると、同じエラーが発生し続けます。ただし、ジョブを使用せずにストア プロシージャを実行するだけでは問題なく動作します。

そして、ここが本当にトリッキーな部分です。ストアド プロシージャを実行し、キャンセルしてからジョブを実行すると、ジョブは問題なく動作します。

誰かがこのかなりユニークな問題に遭遇したか、それを引き起こしている可能性のあるアイデアを持っていますか?

4

2 に答える 2

3

このエラーは、失敗したトランザクション中にログに記録された操作を実行しようとしていることを示しています。-1 のXACT_STATE値を無視している場合、これは BEGIN CATCH ブロックでのみ発生する可能性があります。

現在の要求にはアクティブなユーザー トランザクションがありますが、トランザクションがコミット不可能なトランザクションとして分類される原因となったエラーが発生しました。リクエストは、トランザクションをコミットすることも、セーブポイントにロールバックすることもできません。トランザクションの完全なロールバックのみを要求できます。リクエストは、トランザクションをロールバックするまで書き込み操作を実行できません。要求は、トランザクションをロールバックするまで、読み取り操作のみを実行できます。トランザクションがロールバックされた後、要求は読み取り操作と書き込み操作の両方を実行でき、新しいトランザクションを開始できます。

これを行おうとしているという事実は、例外処理に関するコードの問題を示しているにすぎません (つまり、プロシージャにバグがあります)。私は最近、BEGIN TRY/BEGIN CATCH を使用する手順のテンプレートについてブログに書きました。手順を修正するための出発点としてそれを使用できます。Erland Sommarskogの Transact-SQL エラー処理に関する有名な記事がありますが、BEGIN TRY/BEGIN CATCH についてはあまり詳しく説明していません。

適切なエラー処理を行うことで、最初に発生し、CATCH ブロックが最初に実行される原因となった元のエラーを見つけることができます。プロシージャを手動で実行しても問題は発生しないと述べているため、問題は SQL Agent ジョブと手動実行のコンテキストの違いである可能性があります。データなしで問題を診断することはできませんが、最も可能性の高い原因はセキュリティ コンテキストの違いであると推測されます (つまり、Agent ログインには、自分のログインが持ついくつかの権限がありません)。

于 2009-06-24T16:41:04.063 に答える
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
于 2010-11-02T21:04:20.190 に答える