복붙노트

[SQL] "이 SqlTransaction이 완료되었습니다; 더 이상 사용할 수 없습니다. "... 구성 오류?

SQL

"이 SqlTransaction이 완료되었습니다; 더 이상 사용할 수 없습니다. "... 구성 오류?

지금은 하루 반에 대해이 작업을하고 numberous 블로그와 웹에서 도움말을 검색했습니다. 그래서이 오류에 관한 여러 질문을 찾았지만, 내가 (또는 경우에 따라, 불행하게도, 나는 충분히 잘 구현하는 방법을 이해할 수 없었다 : P)가 아주 내 상황에 적용 생각하지 않았다. 나는 확실히 내가 간다 여기에 도움이 충분히 설명 ...하지만 수 아니에요 :

우리는 우리의 자원을 추적 할 수있는 .NET 응용 프로그램을 가지고있다. 시간 추적 시스템과 결제 시스템에 자원을 복사하는 내보내기 기능이있다; 이 저장 프로 시저에 액세스 시간 및 결제 데이터베이스에 대한 링크가.

나는 최근에 새 서버로 과금 시스템 데이터베이스 이동 (원래 서버 : 서버 2003 SP2, SQL 2005, 새로운 서버 : 서버 2008 R2, SQL 2008 R2). 나는 2008 데이터베이스에 그 지점까지 연결된 서버 세트가 있습니다. 나는 2008 서버를 가리 키도록 저장 프로 시저를 업데이트 한 다음 나는 MSDTC 및 RPC (http://www.safnet.com/writing/tech/archives/2007/06/server_myserver.html)에 대한 오류를 얻었다. 나는 연결된 서버에 'RPC / RPC 아웃'을 사용하고 네트워크 액세스를 (이 같은 : http://www.sqlwebpedia.com/content/msdtc-troubleshooting)을 허용하도록 MSDTC를 설정합니다.

"이 SqlTransaction 완료 없다, 그것은 더 이상 사용할 수 있습니다."지금은 내보내기 기능을 실행하려고 할 때, 위군요 무엇이 나에게 이상한 것 같다 것은 그냥 (SSMS에서) 저장 프로 시저를 실행할 때, 그것이 성공적으로 완료 말한다는 것이다.

사람이 전에 본 적이 있습니까? 나는 구성에서 뭔가를 놓친 적이 있습니까? 저도 같은 페이지에 걸쳐 계속하고, 내가 찾은 유일한 것은 내가 재부팅 여기에 언급 된 MSDTC 변경 (한 후하지 않았다이었다 : http://social.msdn.microsoft.com/forums/en-US/adodotnetdataproviders / 스레드 / 7172223f-acbe-4472-8cdf-feec80fd2e64 /).

나는 그것이 도움이 될 경우 ... 알려 주시기 바랍니다, 일부 또는 저장 프로 시저를 모두 게시 할 수 있습니다.

해결법

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

    1.이 오류 메시지는 "좀비 거래"때문이다 믿습니다.

    이 오류 메시지는 "좀비 거래"때문이다 믿습니다.

    transacton가 (등 또는 롤백 회 또는 롤백 커미트) 회 커밋 될 수 영역을 찾는다. SP가 이미 저지른 후 닷넷 코드는 트랜잭션을 커밋합니까? 이 오류가 발생한 다시 닷넷 코드 롤, 다음 캐치 (또는 마지막) 절에서 다시 그것을 롤하려고합니까?

    이 오류 조건이 결코 기존 서버에 박히는되지 않았다 가능하고, 따라서 결함 "을 두 번 롤백"코드가 맞았 적이 있습니다. 어쩌면 지금 당신은 예외 처리를 통해 일부 구성 새 서버에 오류가, 지금은 결함이있는 코드가 점점 인기가있는 상황이있다.

    당신은 오류 코드에 디버깅 할 수 있습니까? 당신은 스택 추적을 가지고 있습니까?

  2. ==============================

    2.나는 최근에 새로운 연결 관리자에서 리팩토링 후이 있었다. 새로운 루틴, 그것은 배치의 일부로 실행 될 수 있도록 트랜잭션을 허용 문제는 사용하여 블록을했다 :

    나는 최근에 새로운 연결 관리자에서 리팩토링 후이 있었다. 새로운 루틴, 그것은 배치의 일부로 실행 될 수 있도록 트랜잭션을 허용 문제는 사용하여 블록을했다 :

    public IEnumerable<T> Query<T>(IDbTransaction transaction, string command, dynamic param = null)
    {
      using (transaction.Connection)
      {
        using (transaction)
        {
          return transaction.Connection.Query<T>(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure);
        }
      }
    }
    

    그것은 본다 마치 따라서 트랜잭션 (transaction)를 위탁 또는 메시지를 던졌다 롤백하려는 시도 기본 연결을 종료하고 사용하여 외부 "이 SqlTransaction이 완료 없다,. 더 이상 사용할 수를"

    나는 커버하는 테스트를 추가 using이 제거하고 문제가 멀리 갔다.

    public IEnumerable<T> Query<T>(IDbTransaction transaction, string command, dynamic param = null)
    {
      return transaction.Connection.Query<T>(command, new DynamicParameters(param), transaction, commandType: CommandType.StoredProcedure);
    }
    

    트랜잭션의 컨텍스트 내부에있는 동안 연결을 종료 할 수있는 것을 확인합니다.

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

    3.나는 최근에 비슷한 상황 가로 질러왔다. 어떤 VS IDE 버전에서 디버깅하려면, 디버그 (Ctrl 키 + D, E)에서 열린 예외 - 열 "슬로우"에 대한 모든 체크 박스를 확인하고 디버그 모드에서 응용 프로그램을 실행합니다. 나는 테이블 중 하나가 새 데이터베이스에서 제대로 가져 오지 것을 실현, 그래서 내부는 SQL 예외가 연결을 죽이는, 따라서이 오류로 발생합니다.

    나는 최근에 비슷한 상황 가로 질러왔다. 어떤 VS IDE 버전에서 디버깅하려면, 디버그 (Ctrl 키 + D, E)에서 열린 예외 - 열 "슬로우"에 대한 모든 체크 박스를 확인하고 디버그 모드에서 응용 프로그램을 실행합니다. 나는 테이블 중 하나가 새 데이터베이스에서 제대로 가져 오지 것을 실현, 그래서 내부는 SQL 예외가 연결을 죽이는, 따라서이 오류로 발생합니다.

    이전 코드를 작업하는 새로운 데이터베이스에서이 오류를 반환하면 이야기의 요점은,이, 디버깅 팁 위가 데이터베이스 스키마없는 문제, 실현 될 수있다

    희망이, 도움 HydTechie

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

    4.나도 같은 문제가있어. 이 오류는 conection에 풀링 때문에 발생합니다. 시스템 ACESS 둘 이상의 사용자 connetion와 너무 transation 재사용 풀링 connetion 존재합니다. 첫 번째 사용자가 커밋 실행하면 OU는 트랜잭션이 더 조마를 사용할 수 없습니다 롤백.

    나도 같은 문제가있어. 이 오류는 conection에 풀링 때문에 발생합니다. 시스템 ACESS 둘 이상의 사용자 connetion와 너무 transation 재사용 풀링 connetion 존재합니다. 첫 번째 사용자가 커밋 실행하면 OU는 트랜잭션이 더 조마를 사용할 수 없습니다 롤백.

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

    5.내 경우에는 문제가 트랜잭션에 포함 된 쿼리의 하나가 예외를 발생되고, 예외가 "우아하게"처리에도 불구하고, 여전히 전체 트랜잭션을 롤백하는 데 성공했다.

    내 경우에는 문제가 트랜잭션에 포함 된 쿼리의 하나가 예외를 발생되고, 예외가 "우아하게"처리에도 불구하고, 여전히 전체 트랜잭션을 롤백하는 데 성공했다.

    내 의사 코드는 같았다 :

    var transaction = connection.BeginTransaction();
    for(all the lines in a file)
    {
         try{
             InsertLineInTable(); // INSERT statement might fail and throw an exception
         }
         catch {
             // notify the user about the error on line x and continue
         }
    }
    
    // Commit and Rollback will fail if one of the queries 
    // in InsertLineInTable threw an exception
    if(CheckTableForErrors())
    {
        transaction.Commit();
    }
    else
    {
        transaction.Rollback();
    }
    
  6. ==============================

    6.또한 DB에 대한 사용자의 .NET 응용 프로그램에서 실행되는 모든 장기 실행 프로세스를 점검하십시오. 예를 들어, 당신은 당신의 로그와 같은에 표시 할 수있는 완료하는 데 충분한 시간이없는 저장 프로 시저 또는 쿼리를 호출 할 수있다 :

    또한 DB에 대한 사용자의 .NET 응용 프로그램에서 실행되는 모든 장기 실행 프로세스를 점검하십시오. 예를 들어, 당신은 당신의 로그와 같은에 표시 할 수있는 완료하는 데 충분한 시간이없는 저장 프로 시저 또는 쿼리를 호출 할 수있다 :

    명령 제한 시간 설정을 확인 추적 (프로파일)을 실행하고 DB 측에서 무슨 일이 일어나고 있는지 보려고 ...

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

    7.내 경우, 나는 코드의 같은 시도 캐치 block.One 줬어요에서 트랜잭션을 커밋 한 후 실행해야 몇 가지 코드를했습니다 오류는 트랜잭션 롤백을 포함 그것의 catch 블록에 오류 넘겨 블록을 시도합니다. 그것은 유사한 오류가 표시됩니다. 아래의 코드 구조의 예를 들어보기 위해 :

    내 경우, 나는 코드의 같은 시도 캐치 block.One 줬어요에서 트랜잭션을 커밋 한 후 실행해야 몇 가지 코드를했습니다 오류는 트랜잭션 롤백을 포함 그것의 catch 블록에 오류 넘겨 블록을 시도합니다. 그것은 유사한 오류가 표시됩니다. 아래의 코드 구조의 예를 들어보기 위해 :

    SqlTransaction trans = null;
    
    try{
     trans = Con.BeginTransaction();
    // your codes
    
      trans.Commit();
    //your codes having errors
    
    }
    catch(Exception ex)
    {
         trans.Rollback(); //transaction roll back
        // error message
    }
    
    finally
    { 
        // connection close
    }
    

    누군가 바랍니다 :)

  8. ==============================

    8.여기에 좀비 트랜잭션을 감지 할 수있는 방법이다

    여기에 좀비 트랜잭션을 감지 할 수있는 방법이다

    SqlTransaction trans = connection.BeginTransaction();
    
    //some db calls here
    
    if (trans.Connection != null) //Detecting zombie transaction
    {
      trans.Commit();
    }
    

    SqlTransaction 클래스를 디 컴파일하여 다음을 볼 수

    public SqlConnection Connection
    {
      get
      {
        if (this.IsZombied)
          return (SqlConnection) null;
        return this._connection;
      }
    }
    

    나는 연결이 종료되면, transOP 따라서 커밋 할 수없는, 좀비가 될 것이다 알 수 있습니다. 나는이 finally 블록 내에서 () 커밋이 있기 때문에 연결이 try 블록에있는 동안 나의 경우, 그것은이다. 이러한 형태는 연결 배치되도록 가비지 수집 유발된다. 이 솔루션은 대신 try 블록 내에서 커밋 넣어했다.

  9. from https://stackoverflow.com/questions/6358806/this-sqltransaction-has-completed-it-is-no-longer-usable-configuration-er by cc-by-sa and MIT license