ASP.NET会话和并发

时间:2010-08-23 20:41:40

标签: c# asp.net session concurrency

我有一个遗留的ASP.NET应用程序,其中存在一些与会话/并发相关的问题和不一致。

我正在寻找重新设计的最佳方式/

这就是场景 答:多个用户可以登录该站点并访问/修改故障单的详细信息。但是,如果用户已经在更改工作流程... TicketId,UserId将存储在带有时间戳的DB中。

B中。如果另一个用户尝试访问同一故障单,而其他用户已经在处理该故障单。然后,从数据库访问数据,并为最新用户提供一个信息框,说明故障单已被锁定。

℃。如果初始/锁定用户执行“注销”,则在DB中释放锁定。现在,后续用户可以轻松访问

所有这一切都很好......但是如果初始用户...而不是“退出”...只是关闭浏览器窗口......应用程序仍然保持锁定状态。

如何避免这种情况?这种情况下最好的设计是什么?

3 个答案:

答案 0 :(得分:2)

这称为pesimistic并发。您可以处理SessionEnd事件(但仅当您使用InProc会话时)并释放故障单上的锁定。问题是默认情况下会话在20分钟后到期。因此,如果您真的想要使用pesimistic并发,则必须尽可能缩短会话时间,但这可能会影响当前用户 - 会话在浏览器工作期间可能会丢失。为了避免这个实现javascript计时器和一些ping javascript / ajax操作,这将使用户打开浏览器时保持会话活动。如果他关闭浏览器而不释放票证会话将很快到期。还有一个缺点 - 如果您的用户关闭浏览器并在一段时间后打开新的浏览器,那么他的所有会话数据都将丢失。

编辑:此解决方案也不会处理用户打开浏览器,锁定票证并离开2小时午餐的情况。如果您还想处理此解决方案,则可以将其与故障单活动的某些超时结合起来。

答案 1 :(得分:0)

在我看来,你能做的最好的事情就是建立一个转移会话超时。当票证被锁定时,您可以将其标记为锁定时间。每当另一个人试图访问此票证时,您可以检查不仅是因为它已被锁定,而且当它被锁定时,以及它是否被锁定超过哦...让我们说5小时前,您可以提示用户解锁票证,但丢失以前的用户修改。

您也可以将各种基于角色的逻辑推入其中,并且仅授予某些人解锁过期编辑会话等的权利。

答案 2 :(得分:0)

不幸的是,你没有其他选择只是超时'锁定'。由于浏览器和服务器之间的链接不是耐用/可靠的链接,因此您无法真正检测到用户已放弃工作的所有方式,包括突然的浏览器关闭,客户端宽带调制解调器重置,网络停电或电源中断。因此,您所能做的就是让物品上的“锁定”超时。如果用户没有完成工作,例如30分钟,则该项目将返回到可用项目池中。这个'return'不一定是一个活动的操作,它可以是隐含的:“锁定”或保留一个工作项的行为会添加一个UTCNOW()+ 30分钟的时间戳。在过去中具有时间戳的任何项目都有助于抓取并被视为已解锁(即,用户未完成30分钟的工作)。如果用户从午餐返回并在45分钟后尝试完成工作,则拒绝提交并要求他重新开始。如果用户定期刷新工作(比如它每10分钟节省一次),也许它可以延长“锁定”,新的30分钟时间。

对于这种模式,您应该查看Using Tables as Queues