2012-05-22 71 views
3

我在生產環境中遇到了本地不在的問題。在TransactionScope中導致NLog事務導致事務無效

我運行一些的LINQ to SQL代碼,如下一個TransactionScope內:

 using (var scope = new TransactionScope()) 
     { 
      uploadRepository.SubmitChanges(); 
      result = SubmitFileResult.Succeed(); 

      ScanForNewData(upload); 

      scope.Complete(); 
     } 

ScanForNewData()調用GetSubmittedData()。如果GetSubmitted發生異常(),我們使用NLOG寫錯誤到文件,數據庫,並同時發送電子郵件:

 catch (Exception ex) 
     { 
      //MT - having to comment this out beause it is causing a problem with transactions on theproduction server 
      logger.ErrorException(String.Format("Error reading txt file {0} into correct format", upload.DocumentStore.FileName), ex); 
      return new UploadGetSubmittedDataResult { Exception = ex, Success = false, Message = String.Format("Error reading txt file {0} into correct format", upload.DocumentStore.FileName) }; 
     } 

在ScanForNewData就可以調用repository.SubmitChanges()然後,這會導致:

該操作對交易狀態無效。 System.Transactions.TransactionException TransactionException System.Transactions.TransactionException:該操作對於事務狀態無效。

我想到的最好的想法是,在生產中,這個代碼在Web服務器上運行並調用一個單獨的數據庫服務器。 DataContext和Nlog都具有相同的連接字符串配置和Sql用戶,但也許是因爲服務器是遠程的(而本地我正在使用集成安全性),這有點奇怪。

任何想法在這種情況下事務會發生什麼?

更新 - 我只是用SQL用戶在本地嘗試它,它仍然正常工作。必須與生產設置有關...

另一個更新 - 我說謊。在開發過程中,Nlog數據庫記錄從不寫入,電子郵件被髮送,並且TransactionException不會發生。

+0

可以幫助 http://stackoverflow.com/questions/2884863/under-what-c​​ircumstances-is-an-sqlconnection-automatically-enlisted-in-an-ambien – Joe

回答

0

很難猜測沒有完整的異常堆棧跟蹤是什麼問題,它可能取決於多種事情。

例如,我假設NLog打開一個到我自己的數據庫的新連接,這可能會導致事務被提升爲分佈式事務,並且分佈式事務處理協調器將會啓動。您的應用程序在生產環境和本地環境中的行爲不對稱。

您可能會通過其中的某些操作來破壞事務,如某些未處理的異常或非法訪問某些數據。

提供完整的堆棧跟蹤和更深入的分析代碼。

0

不知道什麼關你TransactionException的內部異常時也難以解決,但這裏是一個想法:

如果您重構代碼有記錄發生後用塊事務各地範圍已經結束,您可能會避免您遇到的問題,因爲交易範圍將結束,並且DTC將回滾該交易。

我在過去使用過並看到過這種模式(在事務結束並回滾之前不要記錄),而且它在處理事務時運行良好。

在單獨的數據庫上進行日誌記錄總是建議避免這樣的問題。如果你這樣做,這個問題也將被避免。

相關問題