2011-05-05 39 views
5

Verileri iki farklı veri kaynağı arasında senkronize etmek için bir sınıf yapıyorum. Bu senkronizasyon birden fazla parçaya bölünür (ve yöntemler). Her yöntemin kendi TransactionScope'u vardır ve yöntemler sırayla çalışır.ASP.NET'te TransactionScope ile ilgili sorunlar

Everytime ı aşağıdaki errorMessage olsun bu kodu çalıştırın:

"Mevcut bağlantıyla ilişkili hareket tamamladı ancak bağlantı SQL çalıştırmak için kullanılmadan önce işlem bertaraf edilmelidir bertaraf edilmemiştir. ifadeleri."

aşağıdaki kod TransactionScope ile böyle bir yöntemin bir örneğidir:

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; 
     } 
} 

çağrı "_transactionScope.Complete()" TransactionScope öldürmek için yeterli olmadığını görünüyor .. Benim yanlış yaptığım bir ipucu var mı?

Şimdiden teşekkürler!

UPDATE Yanıtlarınız için teşekkür ederiz. Birkaç testten sonra, bu problemin sadece bir yöntemde birden fazla sorgu olduğunda var olduğunu keşfettim. örneğin:

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

işlem için çalışır, bu hata oluşabilir maxTimeout'tan daha uzun bir süre. Bu blog yayınına bakın: http://thecodesaysitall.blogspot.se/2012/04/long-running-systemtransactions.html veya bu cevap: http://stackoverflow.com/a/10017056/205023 – Marcus

+1

, 10'dan fazla süren işleminizdir dakika mı? –

+0

Sonunda 10 dakikadan fazla süren bazı işlemler var, ancak 'transactionOptions.Timeout' özelliğini ve de SqlCommand.CommandTimeout özelliğini bir saate ayarlayarak işledim. – user740229

cevap

5

Yapıcıyı değiştirmeyi deneyin.

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

yaptım bir işlem kapsamı

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); 
    } 

üzerinde Max zaman aşımı değerini oluşturarak ve ardından bunu kullanan bir yöntem:

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

Bu bağlantıya da göz atın: http://social.msdn.microsoft.com/forums/en-US/windowstransactionsprogramming/thread/250b40b9-0838-4142-a8ff-d9d26690083b/ –