2010-10-09 51 views
2

該aspx.cs代碼: 代碼本身是非常大的,這裏的代碼是虛構的,但它看起來(的重要組成部分)是這樣的:「服務器無法恢復事務」SQL Server 2008 + .NET 3.5中的錯誤LINQ

foreach (Transaction trans in vTransactionList) 
     { 
      switch (trans) 
      { 
       case 201: codehere; break; 
       case 202: codehere; break; 
       case 203: 
         vProcesso.MarcaEnvioServico(
            trans.ProcessId, 
            trans.CodTrans); 
         break; 

      } 
     }  

業務類方法:

  RENDataContext db = new RENDataContext(); 

      Processo update = tabela.SingleOrDefault(
       x => x.CodTrans == pCodTrans); 

      update.SentDate= DateTime.Now; 
      update.ProcessId = pProcessId; 
      update.LogUsuario = pUsuario_Id; 
      update.LogVersaoRegistro = servico.LogVersaoRegistro + 1; 
      update.LogDataAlteracao = DateTime.Now; 

      db.SubmitChanges(); 

有時(很頻繁,我得到這個錯誤(sqlserverexception)執行此代碼時:「服務器未能恢復交易。」同樣,它只是隨機的,有時執行有時它沒有。當它首先失敗時,它會在一段時間內失敗。

我使用一個存儲過程來更新表,而不是該LINQ代碼,同樣的問題發生。

+0

什麼vCodTrans ...它應該是反式? – 2010-10-09 00:10:28

+0

更新trans.Cod – 2010-10-09 00:44:34

回答

5

您可能想要諮詢此鏈接: server failed to resume transaction。我所看到的這個錯誤的總結是多個命令正在用一個連接執行。客戶端代碼,然後會很困惑,就根據SQL服務器已提交或回滾在交易中力仍在。在查看業務類方法的代碼時,我注意到上下文不在using語句中。上下文類應該實現IDisposable,因此在完成使用上下文時應該調用Dispose。您可以嘗試將您的代碼更改爲:

  using(RENDataContext db = new RENDataContext()){ 

       Processo update = tabela.SingleOrDefault(
        x => x.CodTrans == pCodTrans); 

       update.SentDate= DateTime.Now; 
       update.ProcessId = pProcessId; 
       update.LogUsuario = pUsuario_Id; 
       update.LogVersaoRegistro = servico.LogVersaoRegistro + 1; 
       update.LogDataAlteracao = DateTime.Now; 

       db.SubmitChanges(); 
      } 

並查看是否無法解決您的問題。

+0

這確實是一個可行的解決方案,我會嘗試,並回答回來 – 2010-10-09 05:09:36

相關問題