2009-06-24 5 views
1

단순히 저장 프로 시저를 실행하는 SQL 작업이 있습니다. 작업이 실행될 때마다 매일 다음과 같은 오류가 발생합니다.

현재 트랜잭션을 커밋 할 수 없으며 로그 파일에 쓰는 작업을 지원할 수 없습니다.트랜잭션 로그에 문제가있는 SQL 작업

계속 작업을 다시 시작하려고하면 동일한 오류가 발생합니다. 그러나, 그냥 작업을 사용하지 않고 저장 프로 시저를 실행하면 잘 작동합니다.

여기에 정말 까다로운 부분이 있습니다. 방금 저장 프로 시저를 실행하고 취소 한 다음 작업을 실행하면 작업이 정상적으로 작동합니다.

누군가가이 독창적 인 문제를 접하게되었거나 아이디어를 유발할 수 있습니까?

+0

당신은 프로 시저의 코드를 게시 할 수 있습니다. –

+0

아닙니다. 꽤 긴 프로세스입니다. 그저 나를 괴롭히는 부분은 프로 시저 자체를 실행하는 데 문제가 없지만 에이전트에 문제가있는 이유입니다. 그리고 에이전트가 실행 한 후에 에이전트를 실행할 수 있습니다. –

답변

3

이 오류는 운명 거래 중에 기록 된 작업을 수행하려고 시도했음을 나타냅니다. -1의 XACT_STATE 값을 무시하고 경우에만 BEGIN CATCH 블록에서 발생할 수 :

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.

은이 작업을 수행하기 위해 노력하고 있다는 사실은 단순히 즉 (당신의 예외 처리와 코드에 문제가 있음을 나타냅니다 당신의 프로 시저가 버그입니다.) 나는 최근에 a template for procedures that use BEGIN TRY/BEGIN CATCH에 대해 블로깅을했고,이를 사용하여 절차를 수정하는 출발점으로 사용할 수 있습니다. Erland Sommarskog는 a well known article on Transact-SQL error handling을 가지고 있지만 BEGIN TRY/BEGIN CATCH는 너무 깊이 다루지 않습니다.

올바른 오류 처리를하면 원래 오류가 발생하여 CATCH 블록이 처음 실행됩니다. 수동으로 프로 시저를 실행해도 문제가 발생하지 않는다고 언급 했으므로 문제는 SQL Agent 작업과 수동 실행 사이의 컨텍스트의 차이 일 가능성이 있습니다. 데이터가 없어도 문제를 진단 할 수는 없지만 가장 가능성있는 원인은 보안 컨텍스트의 차이입니다 (예 : 에이전트 로그인에 자신의 로그인 권한이 없음).

+0

첫 번째 기사는 괜찮습니다.하지만 더 좋은 방법이 있다고 생각합니다. 나 또는 내 MVP 동료가 곧 기사를 게시합니다. – gbn

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 
관련 문제