首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并发ASP.NET会话最佳实践

并发ASP.NET会话最佳实践
EN

Stack Overflow用户
提问于 2008-10-24 07:29:51
回答 5查看 2.4K关注 0票数 3

用户A登录工单管理系统,在SomePage.aspx上编辑内容

用户B在30秒后登录以编辑"SomePage.aspx“上的同一票证

在三层架构中,通知每个用户其他人正在修改相同内容的最佳实践是什么?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2008-10-24 15:04:43

Roundup使用(例如)乐观并发方法:当您提交更改时,您可能会看到有人在您之前进行了更改的警告,以及显示其更改的页面的链接。您可以单击“提交”,继续更改,或者编辑表单中的值,然后再提交。

这对于票务系统来说工作得很好,因为票证上几乎没有共享状态--主要是添加到消息日志(或等效项)中,因此这两条消息会一个接一个地添加。

票数 2
EN

Stack Overflow用户

发布于 2008-10-24 07:33:41

在HTTP这样的请求/响应系统中,没有太多关于用户当前正在做什么的概念。您可以通知他们,其他人在“最后两分钟内”打开了票据进行编辑(或者在这种情况下甚至阻止他们打开),但用户A可以编辑半小时-除非您也禁止这样做。你可以记下这样一个事实,即你相信用户A已经有效地“获得”了要编辑的项目,但是对于web应用程序来说,没有什么可以阻止用户离开计算机,而永远不会保存/取消。

在考虑技术解决方案之前,我建议先考虑技术限制(基本上是web的异步和请求/响应性质),并制定出所需的行为。一些常见的行为包括:

第一次编辑成功(告诉第二个编辑器他们的更改已被拒绝,basically)

  • Second 成功(覆盖第一次编辑-现在告诉第一个编辑器为时已晚)
  • Merge(可能非常困难和/或不可能,具体取决于内容)。这可能是自动的,也可能是手动的(在第二个editor).
  • Prevent的一部分,第二个人可能正在编辑,而您认为第一个人可能正在编辑(由于第一段中提到的问题,很少适用于web应用程序)
票数 8
EN

Stack Overflow用户

发布于 2008-10-24 07:40:54

我在这方面经验不是很丰富,但如果我需要这样做,我会在票证表上的数据库上创建一个名为EditingBy的新字段,并添加一个默认值'0‘。

当用户调用TicketID =897时,查询应该如下所示:

代码语言:javascript
复制
SELECT * FROM Tickets WHERE TicketID = 897; 
UPDATE Tickets SET EditingBy = @UserID WHERE TicketID = 897;

然后,在代码中,您可以看到如果EditingBy大于0,您可以警告UserB UserA (您知道UserID)正在编辑工单,例如,当有人发布答案而您正在撰写您的答案时,或者当您获得新徽章时也是如此。

当提交更新的票证时,您可以将该字段更新回0。

并建议用户可以输入SomePage.aspx,然后不做任何事情就离开,因为在body标记中使用javascript onUnload可以触发异步调用,将EdittingBy更新回0。

希望这能给你一个这样做的想法。

如果你不能编辑数据库本身,你总是可以将EditingBy记录在一个文件中,只需要保留TicketID和UserID,而不是检查它是否大于0,只需要检查TicketID是否在XML中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/232748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档