2011-05-05 5 views
5

두 개의 서로 다른 데이터 소스간에 데이터를 동기화하는 클래스를 작성했습니다. 이 동기화는 여러 부분 (및 메소드)으로 나뉩니다. 모든 메소드에는 고유의 TransactionScope가 있으며 메소드는 순차적으로 실행됩니다.ASP.NET에서 TransactionScope 관련 문제

매번 내가 다음으로 ErrorMessage를 얻을이 코드를 실행

"현재 연결과 관련된 거래가 완료했지만 연결이 SQL을 실행하는 데 사용되기 전에 트랜잭션을 처리해야 배치되지 않았습니다. 진술. "

다음 코드는 TransactionScope에와 이러한 방법의 예입니다

private void SomeMethod() 
{ 
     try 
     { 
      using (var _transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) 
      { 
       using (SqlConnection _connection = new SqlConnection(connectionstring)) 
       { 
        _connection.Open(); 

        DoSomething()... 
       } 

       _transactionScope.Complete(); 
      } 
     } 
     catch (TransactionAbortedException e) 
     { 
      nlog.Error(string.Format("The transaction has been aborted: {0}", e.Message)); 
      throw e; 
     } 
     catch (Exception e) 
     { 
      throw e; 
     } 
} 

전화 는 "_transactionScope.Complete()"는 TransactionScope에 죽일 충분하지 않은 것 같다 .. 누구든지 내가 뭘 잘못하고 있는지 단서가 있습니까?

미리 감사드립니다.

업데이트 답장을 보내 주셔서 감사합니다. 몇 가지 테스트를 한 후에 한 가지 방법으로 여러 개의 쿼리가있을 때만이 문제가 있음을 발견했습니다. 예 :

try 
    { 
     using (TransactionScope _transactionScope = new TransactionScope(TransactionScopeOption.Required, transactionOptions)) 
     { 
      using (SqlConnection _connection = new SqlConnection(connectionstring)) 
      { 
       _connection.Open(); 

       //new method: 
       using (TransactionScope _transactionScope = new TransactionScope(TransactionScopeOption.Suppress)) 
       { 
        //a selectquery 
       } 

       //an update or insert query 

      _transactionScope.Complete(); 
     } 
    } 
+1

트랜잭션에 대한 실행하는 경우이 오류가 발생할 수 있습니다 maxTimeout보다 긴 기간 다음 blogpost를 참조하십시오. http://thecodesaysitall.blogspot.se/2012/04/long-running-systemtransactions.html 또는이 답변 : http://stackoverflow.com/a/10017056/205023 – Marcus

+1

은 10 분 이상 지속되는 거래입니다. 의사록? –

+0

지난 10 분 동안 생각한 트랜잭션이 몇 가지 있지만 'transactionOptions.Timeout'속성과 SqlCommand.CommandTimeout 속성을 한 시간으로 설정하여 처리했습니다. – user740229

답변

5

생성자를 변경해보십시오.

using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required, 
       new TransactionOptions() 
       { 
        IsolationLevel = System.Transactions.IsolationLevel.Serializable, 
        Timeout = TimeSpan.FromSeconds(120) 
       })) 
3

내가했던 트랜잭션 범위

public static TransactionScope CreateDefaultTransactionScope(TransactionScopeOption option = TransactionScopeOption.Required) 
    { 
     var transactionOptions = new TransactionOptions(); 
     transactionOptions.Timeout = TimeSpan.MaxValue; 
     transactionOptions.IsolationLevel = IsolationLevel.ReadCommitted; 
     return new TransactionScope(option, transactionOptions); 
    } 

에 최대 시간 초과 값을 생성하고 당신이 그것을 사용하는 것이 방법 :

using (TransactionScope transaction = TransactionHelper.CreateDefaultTransactionScope()) 
+0

이 링크도 확인하십시오. http://social.msdn.microsoft.com/forums/en-US/windowstransactionsprogramming/thread/250b40b9-0838-4142-a8ff-d9d26690083b/ –