代码之家  ›  专栏  ›  技术社区  ›  K Richard

防止用户在同一行上工作

  •  12
  • K Richard  · 技术社区  · 17 年前

    我在工作中有一个web应用程序,类似于票务工作系统。一些用户输入新问题。其他工人选择并解决问题。所有数据都保存在MS SQL server 2005中。

    为了解决这个问题,我做了两件事。首先,显示要选择的问题的gridview使用AJAX计时器每秒更新一次。一旦选择了问题,它最多在一秒钟后消失。如果他们在这秒钟内选择了一个,他们会收到一条信息,要求他们选择另一个。

    问题是AJAX部分发送了太多的更新(我假设是这样),并且影响了页面和数据库的性能。此外,更新不是每秒钟执行一次。我发现计时器在触发存储过程时不可靠。

    一定有更好的办法,但我似乎找不到。是否有人有过类似情况的经验,或者有建议阻止多个用户选择要维护的相同记录?我真的不想完全禁用AJAX部分,因为我觉得单是消息本身就会让应用程序难以使用。

    谢谢

    6 回复  |  直到 17 年前
        1
  •  4
  •   craigmoliver    17 年前

    在数据库中的行上放置一个lock timestamp字段。编写一个存储过程,如果过期时间超过特定时间,则返回true或false。将web应用上的会话设置为在同一时间(一两分钟)过期。当用户选择一行时,他们点击存储的进程,这有助于应用程序决定是否允许用户修改它。

    希望这是有道理的。。。。

        2
  •  3
  •   Slee    17 年前

        3
  •  3
  •   Jacob Proffitt    15 年前

    有两件事可以帮助缓解您的问题。

    首先,无论您的ajax更新时间框架如何,都需要在选择后通知案例已被处理。即使每秒钟检查一次也不意味着两个人不能在他们认为是同一时间单击同一个案例。在这种情况下,需要通知其中一个用户他们的选择是无效的,即使选择时它看起来是有效的。此通知无需详细说明;即使在失望的情况下,保持轻松、有益的语气也可以改善用户的感知。而且,如果您确定已经选择了该记录的用户,这不仅有助于您的用户在将来进行协调,而且还可以将注意力从您的程序转移到破坏该有趣案例的用户身上。(事实上,管理层可能会

    其次,对案例的显示方式进行一个小调整可以减少选择冲突。在显示顺序中添加一个随机元素和/或过滤掉显示的每一个案例将帮助用户自然地选择不同的案例。人类的模式识别和任务选择并不是真正随机的,所以对表现形式的微小改变可以等同于对选择行为的巨大改变。碰撞机会的减少使碰撞通知变得很少(从而减少用户的沮丧情绪)。如果您的用户可以被划分为可以帮助确定有用的案例排序/筛选的分类,这就更好了。

    好的,随着时间的推移,第三件事将帮助您,如果您记录碰撞发生的时间(使用有关碰撞的有用元数据,如参与碰撞的人员和选择时间)。借助可靠的碰撞数据,您可以找到哪些有效,哪些无效。随着时间的推移,您可以根据您的实际用例改进您的应用程序,并尽早发现潜在的问题。没有什么比在用户意识到问题存在之前就掌握问题(并能够解释解决问题的计划)更能让他们放心的了。

    有了这些缓解模式,您可能会发现可以安全地缩短ajax查询时间,而不会影响用户体验。使用有用的日志记录,您可以确保您所做的任何调整实际上都在工作(或者不工作,这可能更有用)。

        4
  •  2
  •   Daniel Auger    17 年前

    如果这是不可能的,我想你可以检查一个问题的选择,看看它是否仍然可用。如果它不可用,则在用户单击它后使其消失。这样,您仅在他们实际单击某个对象时才请求,而不是不断轮询数据。

        5
  •  2
  •   tvanfosson    17 年前

        6
  •  1
  •   eglasius    15 年前

    我没有看到这个问题,特别是在您提到您已经将票据标记为正在进行/正在维护,并且具有项目的时间戳/版本之后。

    1. 用户浏览票证并查看可用票证列表,即不包括数据库中正在进行的票证。如果您想让用户也看到正在进行的票证,可以在票证状态中明确指出,并禁用获取该票证的选项。
    2. 用户通过打开票据(取决于用户体验/其呈现给用户的方式)显式或隐式地将票据标记为正在进行中。

    将会发生的是,对于第二个人,更新。。。哪里timestamp=@timestamp将找不到任何要更新的记录,您将报告票证已被获取。

    如果您愿意,可以在上面的基础上进行构建,以便在抓取票证时更新UI。这可以通过在x时间之后对当前的票证页面进行完全刷新(可能会提醒/提示用户),或者甚至通过检索为使用ajax显示的票证页面更改的票证列表来实现。您仍然有前面的步骤,因为此修改只是为了方便用户。