我正在使用 Microsoft 的新通用提供程序在 SQL Server 中进行会话。SQL Server 上会话的旧实现需要一个作业(每分钟运行一次)来清除过期的会话。新的对每个请求进行检查和清除。因为我实际上是在 SQL Azure 中运行,所以我没有 SQL 代理来安排作业,所以这听起来是一种合理的方法(不,我不想为会话支付 Azure 缓存)。
问题是当多个用户同时访问该站点时,他们都试图同时清除相同的过期会话,而第二个用户则获得了乐观并发异常。
System.Data.OptimisticConcurrencyException: Store update, insert, or delete statement affected an unexpected number of rows (0). Entities may have been modified or deleted since entities were loaded. Refresh ObjectStateManager entries.
at System.Data.Mapping.Update.Internal.UpdateTranslator.Update(IEntityStateManager stateManager, IEntityAdapter adapter)
at System.Data.Objects.ObjectContext.SaveChanges(SaveOptions options)
at System.Web.Providers.DefaultSessionStateProvider.PurgeExpiredSessions()
at System.Web.Providers.DefaultSessionStateProvider.PurgeIfNeeded()
at System.Web.SessionState.SessionStateModule.BeginAcquireState(Object source, EventArgs e, AsyncCallback cb, Object extraData)
at System.Web.HttpApplication.AsyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
我正在使用 ELMAH 进行错误记录,并且这种情况经常出现。在我尝试将 ELMAH 配置为忽略错误之前,是否有人知道首先阻止错误发生的方法?我缺少的新提供程序是否有一些配置?