我有一个ASP.NET 4应用程序,我有一个项目列表,用户需要对每个项目进行一些工作。由于列表可能很长,我希望每个项目的审核过程尽可能高效地进行。我的想法是有一个显示一个项目的网页,用户做他们需要做的事情,然后点击下一个项目按钮。系统自动从列表中选择下一个项目。到目前为止一切都很好......如果只有一个用户需要这样做。
困难在于提出一种可靠而有效的解决方案,允许多个用户在列表中工作。如果用户单击“下一步”,我不希望系统显示另一个用户正在处理的项目。
如果两个用户使用同一个项目(最后一次保存获胜),那么这不是世界末日,但这是浪费时间,应该保持在最低限度。
我能想到的一些技巧:
1)从列表中随机选择下一个项目。两个用户获得相同项目的可能性相形见绌。糟糕的是,用户无法预测他们接下来会得到什么,并且无法在列表中按顺序工作。
2)使用某种乐观锁定来锁定记录。这通常对Web应用程序不利,因为用户可以访问任何页面或终止连接,可能会将锁定留在那里直到某种过期。关于这一点的好处是用户可以按顺序处理列表或部分列表,系统将简单地跳过其他人正在处理的记录。
但是,有没有其他建议?
更新 假设一次只允许用户编辑一条记录(即不打开同一列表中的其他浏览器页面或会话),使用乐观锁定的一种可能解决方案如下:
对于每条记录,(如@Shai建议)跟踪:编辑状态(可用,InProgress),用户当前正在编辑,日期编辑已启动。
当用户想要获取下一条记录时,锁定表格,扫描下一条可用记录,将其状态更改为InProgress,解锁表格。更新用户和日期信息。
会话过期时(可能是用户关闭了浏览器),请将与此用户关联的任何记录设置为“可用”。会话持续几个小时,以支持延长编辑时间。
如果同一用户在其他会话过期之前再次登录,请再次将与该用户关联的任何记录设置为“可用”。
现在,这是一个有点复杂的地方。如果用户回家但未完成记录(或记录列表,如果我们允许多个记录),该怎么办?如何让其他用户无需等待即可接管?我们可以添加一个特殊的UI来列出所有当前用户会话,并允许某人(谁知道用户不再工作)明确解锁任何记录。
有关改进此事的任何建议吗?
答案 0 :(得分:1)
似乎这些项目可能有3种状态(statusi?):Open,InProgress和Completed。当用户请求项目时,您返回状态为“打开”的第一个项目,同时将该项目的状态设置为“InProgress”。当他们保存项目时,您可以将其状态设置为“已完成”。冲洗。重复。
为了确保没有两个用户获得相同的打开项目,您可以在快速选择打开项目并将其状态设置为“InProgress”的过程中锁定表。这个sproc可以将item id作为返回值。通过仅返回id而不是整个记录,您将锁定表格较短的时间。然后,您可以选择实际记录,而无需担心其他用户检索同一记录的所有权。
您可能还想考虑记录获得该项目所有权的用户。如果您需要执行审核,这可能会派上用场。
这是你想要的方向吗?