2013-05-13 1 views
0

.NET 4, LINQtoSQL을 MVC 4 앱에서 사용하면서 막대한 양의 요청이 실패하는 문제가 발생하기 시작했습니다. 요청은 데이터베이스에서 매우 간단한 선택으로 실패한 것으로 보입니다. 약 1 주 동안 서버 나 코드베이스에 대한 업데이트가 없었지만이 문제는 오늘 아침에만 시작되었습니다.
예외가 임의로 발생합니다 (겉으로보기에) 모든 페이지에서 예외가 발생할 수 있습니다.간단한 쿼리에 대한 자주 발생하는 TransactionException

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과 웹 서버의 차이는 약 5 초였습니다. 그래서 이것이 관련 될 수 있다고 생각했지만 도메인 컨트롤러에 다시 동기화 한 후에도 여전히이 문제가있는 것으로 보입니다! 어떤 도움이라도 대단히 감사 할 것입니다. 자세한 정보와

업데이트
어떤 언급 할 가치가있을 수 있습니다 것은 내가 Ninject에 사용하고 있다는 점이다. 따라서 datacontext는 다음과 같이 처리됩니다.

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

그러면 모든 서비스가 동일한 데이터 컨텍스트를 참조 할 수 있습니다.

답변

0

시간 사냥은 야생 거위 추격전이었습니다. 문제는 코드에있었습니다. ChangeConflictException이 발생하고 이후의 요청이 동일한 datacontext에서 계속 수행되고 있습니다. 나는 어떻게되는지는 모르겠지만, 이런 일이 발생할 때마다 (위에서 볼 수 있듯이) 가장 간단한 데이터베이스 호출에서 일부 요청을 완전히 실패하게 만들 것입니다. 문제가되는 코드를 수정하면 문제가 완전히 해결됩니다.

관련 문제