icr*_*crf 6 sql-server asp.net asp.net-mvc optimistic-concurrency
我正在使用Microsoft 的新Universal Develors进行SQL Server会话.SQL Server上的旧会话实现需要一个作业(每分钟运行一次)来清除过期的会话.新的一个检查并清除每个请求.由于我实际上是在SQL Azure中运行,因此我没有SQL Agent来安排作业,所以这听起来像是一种合理的方式(不,我不想为会话支付Azure Cache).
问题是当多个用户同时访问该站点时,他们都试图同时清除相同的过期会话,第二个获得乐观的并发异常.
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)
Run Code Online (Sandbox Code Playgroud)
我正在使用ELMAH进行错误记录,这显示出一些频率.在我尝试配置ELMAH以忽略错误之前,有没有人知道一种方法来阻止错误发生在第一位?是否有一些我缺少的新提供商的配置?
这个包有一个我所说的错误。进程外会话状态的前提是多个实例可能正在管理会话状态清理。在这种情况下,所有实例都在运行此方法......
private void PurgeExpiredSessions()
{
using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString))
{
foreach (SessionEntity entity in QueryHelper.GetExpiredSessions(entities))
{
entities.DeleteObject(entity);
}
entities.SaveChanges();
this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks;
}
}
Run Code Online (Sandbox Code Playgroud)
问题在于,一个实例在其他实例之前删除实体,并且实体抛出帖子中描述的错误。我要求包作者发布源代码或修复此问题。我未经测试的文本编辑器修复方法是添加公共虚拟,这样人们就可以覆盖该方法或只是更改它。
private void PurgeExpiredSessions()
{
using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString))
{
var sqlCommand = @"DELETE dbo.Sessions WHERE Expires < GETUTCDATE()";
entities.ExecuteStoreCommand(sqlCommand);
this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks;
}
}
Run Code Online (Sandbox Code Playgroud)
软件包作者的回复速度非常快(在发布此内容时回答了!),今天他们表示他们正在努力发布代码,但他们可能能够解决这个问题。我请求了预计到达时间,如果收到,我会尝试在此处跟进。
很棒的包,只需要一点维护。
正确答案:等待源代码发布或修复更新。或者自己反编译并修复(如果与许可证一致!)
*更新包所有者正在考虑本周修复它。是的!* *更新。已解决!他们显然不久前修复了它,我安装了错误的包..我使用的是http://nuget.org/packages/System.Web.Providers,我应该使用http://nuget.org/packages/ Microsoft.AspNet.Providers/ .. 对我来说,不清楚哪一个是遗留的并包含在另一个包中。他们把它包裹在一个空的渔获中。
private void PurgeExpiredSessions()
{
try
{
using (SessionEntities entities = ModelHelper.CreateSessionEntities(this.ConnectionString))
{
foreach (SessionEntity entity in QueryHelper.GetExpiredSessions(entities))
{
entities.DeleteObject(entity);
}
entities.SaveChanges();
this.LastSessionPurgeTicks = DateTime.UtcNow.Ticks;
}
}
catch
{
}
}
Run Code Online (Sandbox Code Playgroud)
感谢包装团队如此快速的回复和大力支持!