我在生產環境中遇到了本地不在的問題。在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不會發生。
可以幫助 http://stackoverflow.com/questions/2884863/under-what-circumstances-is-an-sqlconnection-automatically-enlisted-in-an-ambien – Joe