2013-05-13 31 views
0

在MVC 4應用程序中使用.NET 4,LINQtoSQL我剛開始遇到大量請求失敗的問題。這些請求似乎無法從數據庫中進行非常簡單的選擇。大約一個星期沒有更新服務器或代碼庫,但這個問題只在今天上午開始。
該異常隨機拋出(看似),並且可能發生在所有頁面上。
事件查看器日誌顯示以下堆棧跟蹤:Frequent TransactionException for simple query

Exception information: 
    Exception type: TransactionException 
    Exception message: The operation is not valid for the state of the transaction. 
    at System.Transactions.TransactionState.EnlistPromotableSinglePhase(InternalTransaction tx, IPromotableSinglePhaseNotification promotableSinglePhaseNotification, Transaction atomicTransaction) 
    at System.Transactions.Transaction.EnlistPromotableSinglePhase(IPromotableSinglePhaseNotification promotableSinglePhaseNotification) 
    at System.Data.SqlClient.SqlInternalConnection.EnlistNonNull(Transaction tx) 
    at System.Data.ProviderBase.DbConnectionInternal.ActivateConnection(Transaction transaction) 
    at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject) 
    at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection) 
    at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory) 
    at System.Data.SqlClient.SqlConnection.Open() 
    at System.Data.Linq.SqlClient.SqlConnectionManager.UseConnection(IConnectionUser user) 
    at System.Data.Linq.SqlClient.SqlProvider.get_IsSqlCe() 
    at System.Data.Linq.SqlClient.SqlProvider.InitializeProviderMode() 
    at System.Data.Linq.SqlClient.SqlProvider.System.Data.Linq.Provider.IProvider.Execute(Expression query) 
    at System.Data.Linq.Table`1.System.Linq.IQueryProvider.Execute[TResult](Expression expression) 
    at System.Linq.Queryable.SingleOrDefault[TSource](IQueryable`1 source, Expression`1 predicate) 
    at MYPROJECT.Services.Concrete.SettingsService.GetString(Settings settingID, String defaultValue) in c:\TeamCity\buildAgent\work\123456789\MYPROJECT.Services\Concrete\SettingsService.cs:line 40 
    at MYPROJECT.Controllers.BaseController.OnActionExecuted(ActionExecutedContext filterContext) in c:\TeamCity\buildAgent\work\123456789\MYPROJECT\Controllers\BaseController.cs:line 37 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<BeginInvokeActionMethodWithFilters>b__36(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<>c__DisplayClass2a.<BeginInvokeAction>b__20() 
    at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass25.<BeginInvokeAction>b__22(IAsyncResult asyncResult) 
    at System.Web.Mvc.Controller.<>c__DisplayClass1d.<BeginExecuteCore>b__18(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) 
    at System.Web.Mvc.Controller.EndExecuteCore(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) 
    at System.Web.Mvc.MvcHandler.<>c__DisplayClass8.<BeginProcessRequest>b__3(IAsyncResult asyncResult) 
    at System.Web.Mvc.Async.AsyncResultWrapper.<>c__DisplayClass4.<MakeVoidDelegate>b__3(IAsyncResult ar) 
    at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.<>c__DisplayClass4.<Wrap>b__3() 
    at System.Web.Mvc.HttpHandlerUtil.ServerExecuteHttpHandlerWrapper.Wrap[TResult](Func`1 func) 
    at System.Web.HttpServerUtility.ExecuteInternal(IHttpHandler handler, TextWriter writer, Boolean preserveForm, Boolean setPreviousPage, VirtualPath path, VirtualPath filePath, String physPath, Exception error, String queryStringOverride) 

中間的方法,它是我的代碼基本上是返回此:

dc.Settings.SingleOrDefault(x => x.SettingID == settingID) 

從谷歌搜索我讀過檢查數據庫連接並確保MSDTC正在運行。這是,但這導致我檢查服務器上的時間。 SQL和Web服務器之間的差異大約是5秒。所以我認爲這可能是相關的,但在與域控制器重新同步後,我仍然有這個問題!任何幫助將非常感激。

更新更多的信息
什麼可值得一提的是,我使用NInject。所以在DataContext被像這樣處理:

Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope().WithConstructorArgument("connectionString", connectionString); 

我的服務,那麼一切都能夠引用相同數據的上下文。

回答

0

狩獵是一場瘋狂的追逐。問題出在代碼上。一個ChangeConflictException發生,然後後續請求仍在同一個數據上下文中執行。我不知道如何,但只要發生這種情況,就會使一些請求在最簡單的數據庫調用中完全失敗(如上所示)。拿出違規代碼完全解決了這個問題。