用户A登录工单管理系统,在SomePage.aspx上编辑内容
用户B在30秒后登录以编辑"SomePage.aspx“上的同一票证
在三层架构中,通知每个用户其他人正在修改相同内容的最佳实践是什么?
发布于 2008-10-24 15:04:43
Roundup使用(例如)乐观并发方法:当您提交更改时,您可能会看到有人在您之前进行了更改的警告,以及显示其更改的页面的链接。您可以单击“提交”,继续更改,或者编辑表单中的值,然后再提交。
这对于票务系统来说工作得很好,因为票证上几乎没有共享状态--主要是添加到消息日志(或等效项)中,因此这两条消息会一个接一个地添加。
发布于 2008-10-24 07:33:41
在HTTP这样的请求/响应系统中,没有太多关于用户当前正在做什么的概念。您可以通知他们,其他人在“最后两分钟内”打开了票据进行编辑(或者在这种情况下甚至阻止他们打开),但用户A可以编辑半小时-除非您也禁止这样做。你可以记下这样一个事实,即你相信用户A已经有效地“获得”了要编辑的项目,但是对于web应用程序来说,没有什么可以阻止用户离开计算机,而永远不会保存/取消。
在考虑技术解决方案之前,我建议先考虑技术限制(基本上是web的异步和请求/响应性质),并制定出所需的行为。一些常见的行为包括:
第一次编辑成功(告诉第二个编辑器他们的更改已被拒绝,basically)
发布于 2008-10-24 07:40:54
我在这方面经验不是很丰富,但如果我需要这样做,我会在票证表上的数据库上创建一个名为EditingBy的新字段,并添加一个默认值'0‘。
当用户调用TicketID =897时,查询应该如下所示:
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中。
https://stackoverflow.com/questions/232748
复制相似问题