복붙노트

[SQL] EXECUTE 후 트랜잭션 개수가 일치하지 않는 BEGIN 및 COMMIT 문을 수를 나타냅니다. 이전 카운트 = 1, 현재 카운트 = 0

SQL

EXECUTE 후 트랜잭션 개수가 일치하지 않는 BEGIN 및 COMMIT 문을 수를 나타냅니다. 이전 카운트 = 1, 현재 카운트 = 0

나는 표에 데이터를 공급하고 표에서 열 1의 값을 얻을과 표 2를 공급합니다 번째 저장 프로 시저를 호출 할 것이다 삽입 저장 프로 시저가 있습니다.

하지만이 같은 두 번째 저장 프로 시저를 호출 할 때 :

Exec USPStoredProcName

나는 다음과 같은 오류가 발생합니다 :

본인은 이러한 질문에 대한 답변을 읽고는 카운트가 엉망지고 커밋 정확한 위치를 찾을 수없는 생각했다.

해결법

  1. ==============================

    1.당신이 try / catch 블록이있는 경우 그 원인은 예외 중단 트랜잭션을 잡기 계속된다는 것입니다. CATCH 블록에서 당신은 항상 XACT_STATE () 및 중단 핸들 적절하고 uncommitable (운명) 트랜잭션을 확인해야합니다. 발신자가 트랜잭션과 캬 히트를 시작하면, 말, (트랜잭션을 중단) 교착 상태가 어떻게 호출자가 트랜잭션이 중단 한 것을 호출자에게 전달하는 것입니다 그것은 '평소와 같이 사업'을 계속하지 않겠습니까? 유일하게 가능한 방법은 상황을 처리하기 위해 호출을 강제로 재 인상에 예외입니다. 당신이 자동으로 중단 된 트랜잭션을 삼켜 호출자가 원래 트랜잭션에 여전히 가정 지속될 경우에만 신체 상해는 보장 할 수 있습니다 (그리고 당신이 얻을 오류는 엔진 시도 자체를 보호하는 방법입니다).

    당신이 try / catch 블록이있는 경우 그 원인은 예외 중단 트랜잭션을 잡기 계속된다는 것입니다. CATCH 블록에서 당신은 항상 XACT_STATE () 및 중단 핸들 적절하고 uncommitable (운명) 트랜잭션을 확인해야합니다. 발신자가 트랜잭션과 캬 히트를 시작하면, 말, (트랜잭션을 중단) 교착 상태가 어떻게 호출자가 트랜잭션이 중단 한 것을 호출자에게 전달하는 것입니다 그것은 '평소와 같이 사업'을 계속하지 않겠습니까? 유일하게 가능한 방법은 상황을 처리하기 위해 호출을 강제로 재 인상에 예외입니다. 당신이 자동으로 중단 된 트랜잭션을 삼켜 호출자가 원래 트랜잭션에 여전히 가정 지속될 경우에만 신체 상해는 보장 할 수 있습니다 (그리고 당신이 얻을 오류는 엔진 시도 자체를 보호하는 방법입니다).

    난 당신이 예외 처리와 쇼 중첩 된 트랜잭션과 예외와 함께 사용할 수있는 패턴을 중첩 된 트랜잭션을 가서 추천 :

    create procedure [usp_my_procedure_name]
    as
    begin
        set nocount on;
        declare @trancount int;
        set @trancount = @@trancount;
        begin try
            if @trancount = 0
                begin transaction
            else
                save transaction usp_my_procedure_name;
    
            -- Do the actual work here
    
    lbexit:
            if @trancount = 0
                commit;
        end try
        begin catch
            declare @error int, @message varchar(4000), @xstate int;
            select @error = ERROR_NUMBER(), @message = ERROR_MESSAGE(), @xstate = XACT_STATE();
            if @xstate = -1
                rollback;
            if @xstate = 1 and @trancount = 0
                rollback
            if @xstate = 1 and @trancount > 0
                rollback transaction usp_my_procedure_name;
    
            raiserror ('usp_my_procedure_name: %d: %s', 16, 1, @error, @message) ;
        end catch
    end
    go
    
  2. ==============================

    2.나도이 문제를 가지고 있었다. 나를 위해, 그 이유는 내가 뭐하고 있었이었다

    나도이 문제를 가지고 있었다. 나를 위해, 그 이유는 내가 뭐하고 있었이었다

    return
    commit
    

    대신에

    commit
    return   
    

    하나의 저장 프로 시저입니다.

  3. ==============================

    3.이것은 트랜잭션이 시작될 때 일반적으로 발생하고 어느 것이 최선을 다하고되지 않았거나 롤백되지 않습니다.

    이것은 트랜잭션이 시작될 때 일반적으로 발생하고 어느 것이 최선을 다하고되지 않았거나 롤백되지 않습니다.

    오류가 저장 프로 시저에 오는 경우 트랜잭션이 완료되지 않았기 때문에,이 때문에 예외 처리의 부재에서 일부 런타임 오류에 데이터베이스 테이블을 잠글 수 있습니다         당신은 아래와 같이 예외 처리를 사용할 수 있습니다. SET XACT_ABORT

    SET XACT_ABORT ON
    SET NoCount ON
    Begin Try 
         BEGIN TRANSACTION 
            //Insert ,update queries    
         COMMIT
    End Try 
    Begin Catch 
         ROLLBACK
    End Catch
    

    출처

  4. ==============================

    4.당신이 중첩 된 트랜잭션을 사용하는 경우, 롤백 작업 롤의 가장 바깥 일을 포함하여 모든 중첩 된 트랜잭션을 백업 할 것을 알고 있어야합니다.

    당신이 중첩 된 트랜잭션을 사용하는 경우, 롤백 작업 롤의 가장 바깥 일을 포함하여 모든 중첩 된 트랜잭션을 백업 할 것을 알고 있어야합니다.

    당신이 설명하는 오류에서 TRY / CATCH, 결과와 함께 사용이 힘. 자세한 내용은 여기를 참조하십시오.

  5. ==============================

    5.저장 프로 시저가 트랜잭션 (예를 들어, 테이블을 찾을 수 없습니다, 잘못된 열 이름)를 연 후 컴파일 오류가 발생하는 경우가 발생할 수 있습니다.

    저장 프로 시저가 트랜잭션 (예를 들어, 테이블을 찾을 수 없습니다, 잘못된 열 이름)를 연 후 컴파일 오류가 발생하는 경우가 발생할 수 있습니다.

    난 내가 레무스 Rusanu에 의해 설명 된 것과 유사한 논리를 모두 잡을 / 2 저장 프로 시저는 "노동자"하나의 시도와 래퍼를 사용했다 발견했다. 작업자 캐치는 "정상"실패를 처리하는 데 사용되며, 래퍼 캐치 컴파일 실패 오류를 처리 할 수 ​​있습니다.

    https://msdn.microsoft.com/en-us/library/ms175976.aspx

    시도 ... CATCH 구문에 의해 영향을받지 오류

    희망이 디버깅 몇 시간 저장 다른 사람이 도움이 ...

  6. ==============================

    6.저도 같은 오류 메시지가 있었다, 내 실수는 내가의 끝에 세미콜론을 한 것으로이었다 트랜잭션 라인을 COMMIT

    저도 같은 오류 메시지가 있었다, 내 실수는 내가의 끝에 세미콜론을 한 것으로이었다 트랜잭션 라인을 COMMIT

  7. ==============================

    7.(가) 트랜잭션을 BEGIN 안에 내 경우, 오류가 RETURN에 의해 ​​발생되고 있었다. 그래서 내가 이런 일을했다 :

    (가) 트랜잭션을 BEGIN 안에 내 경우, 오류가 RETURN에 의해 ​​발생되고 있었다. 그래서 내가 이런 일을했다 :

    Begin Transaction
     If (@something = 'foo')
     Begin
         --- do some stuff
         Return
     End
    commit
    

    그것은 할 필요가 :

    Begin Transaction
     If (@something = 'foo')
     Begin
         --- do some stuff
         Rollback Transaction ----- THIS WAS MISSING
         Return
     End
    commit
    
  8. ==============================

    8.나는 한 번 내 거래에서이 문을 생략 한 후이 오류가 발생했습니다.

    나는 한 번 내 거래에서이 문을 생략 한 후이 오류가 발생했습니다.

    COMMIT TRANSACTION [MyTransactionName]
    
  9. ==============================

    9.나를 위해 광범위한 디버깅 후 수정 던져 누락 간단한이었다; 롤백 후 캐치의 문. 그게 없으면이 추한 오류 메시지가 끝낼 것입니다.

    나를 위해 광범위한 디버깅 후 수정 던져 누락 간단한이었다; 롤백 후 캐치의 문. 그게 없으면이 추한 오류 메시지가 끝낼 것입니다.

    begin catch
        if @@trancount > 0 rollback transaction;
        throw; --allows capture of useful info when an exception happens within the transaction
    end catch
    
  10. ==============================

    10.확실히 당신은 하나 더 미트되지 않은 남아 있습니다 그 중 동일한 절차 / 쿼리에 여러 트랜잭션이없는 있는지 확인하십시오.

    확실히 당신은 하나 더 미트되지 않은 남아 있습니다 그 중 동일한 절차 / 쿼리에 여러 트랜잭션이없는 있는지 확인하십시오.

    내 경우에는, 내가 실수로 쿼리에 TRAN 문을 BEGIN했다

  11. ==============================

    11.이것은 또한 당신이 당신의 C # 코드에서 SP를 호출하는 방법에 따라 달라질 수 있습니다. SP에서 ExecuteStoreQuery와 SP 된 invoke 후 일부 테이블 형식의 값을 반환하고, SP가하는 경우하지 ExecuteStoreCommand와 SP 된 invoke 값을 반환하는 경우

    이것은 또한 당신이 당신의 C # 코드에서 SP를 호출하는 방법에 따라 달라질 수 있습니다. SP에서 ExecuteStoreQuery와 SP 된 invoke 후 일부 테이블 형식의 값을 반환하고, SP가하는 경우하지 ExecuteStoreCommand와 SP 된 invoke 값을 반환하는 경우

  12. ==============================

    12.내 의견으로는 허용 대답은 대부분의 경우에 과잉이다.

    내 의견으로는 허용 대답은 대부분의 경우에 과잉이다.

    오류의 원인은 종종 BEGIN의 불일치하고 명확 오류에 의해 언급 COMMIT. 사용이 수단 :

    Begin
      Begin
        -- your query here
      End
    commit
    

    대신에

    Begin Transaction
      Begin
        -- your query here
      End
    commit
    

    시작 후 트랜잭션을 생략하면이 오류가 발생합니다!

  13. ==============================

    13.사용하지 마십시오

    사용하지 마십시오

    당신이 사용하는 문

    SQL 저장 프로 시저의 문

  14. ==============================

    14.당신은 같은의 코드 구조가있는 경우 :

    당신은 같은의 코드 구조가있는 경우 :

    SELECT 151
    RETURN -151
    

    그런 다음 사용 :

    SELECT 151
    ROLLBACK
    RETURN -151
    
  15. from https://stackoverflow.com/questions/21930156/transaction-count-after-execute-indicates-a-mismatching-number-of-begin-and-comm by cc-by-sa and MIT license