SQL Server のセッションに Microsoftの新しいUniversal Providersを使用しています。SQL Server でのセッションの古い実装では、期限切れのセッションをクリアするために (毎分実行される) ジョブが必要でした。新しいものは、このチェックを行い、リクエストごとにクリアします。私は実際に SQL Azure で実行しているので、ジョブをスケジュールするための SQL エージェントを持っていないので、これは合理的な方法のように思えます (いいえ、Azure Cache のセッションに料金を支払いたくありません)。
問題は、複数のユーザーが同時にサイトにアクセスすると、両方のユーザーが同時に期限切れの同じセッションをクリアしようとし、2 番目のユーザーが楽観的同時実行例外を取得することです。
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 を構成しようとする前に、そもそもエラーが発生しないようにする方法を知っている人はいますか? 不足している新しいプロバイダーの構成はありますか?