阻止用户在同一行上工作

时间:2008-10-27 02:30:16

标签: asp.net sql-server vb.net ajax concurrency

我的工作中的Web应用程序与票证工作系统类似。一些用户输入新问题。其他工人选择并解决问题。所有数据都在MS SQL Server 2005中维护。

致力于解决问题的用户转到他们可以查看未解决问题的页面。因为多达20个人可以同时查看此页面,我必须解决的一个潜在问题是,如果有人选择了其他人在页面加载后选择的问题,会发生什么。

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

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

必须有更好的方法,但我似乎无法找到一个。有没有人有这种情况的经验或有建议让多个用户选择相同的记录来维护?我真的不想完全禁用AJAX部分,因为我觉得单独的消息会让应用程序难以使用。

谢谢,

6 个答案:

答案 0 :(得分:4)

将锁定时间戳字段放在数据库中的行上。如果到期时间早于特定时间,则写入存储过程,该过程返回true或false。将您的网络应用上的会话设置为在一两分钟的同一时间到期。当用户选择一行时,他们会点击存储过程,这有助于应用决定是否允许用户修改它。

希望有道理......

答案 1 :(得分:3)

我做过类似的事情,一旦用户打开一张票(行),它就会将该票分配给该用户并在该记录上设置一个值,比如和该特定用户的FK,所以如果有其他人试图打开该票(它会让他们知道它已被分配给其他人。

答案 2 :(得分:3)

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

首先,无论您的ajax更新时间框架如何,都需要选择案例的选择后通知。即使每秒检查也不意味着两个人不能在他们认为同一时间点击同一个案例。在这种情况下,需要通知其中一个用户他们的选择无效,即使它在选择时看起来有效。该通知不需要详细说明;即使在失望的情况下,保持轻松,有用的语气也可以改善用户的感知。如果您确定已经选择该记录的用户,那么这不仅有助于您的用户在未来进行协调,而且还会将您的计划注意力转移到蜿蜒多汁案例的用户身上。 (实际上,管理层可能喜欢给您的用户偶尔发生冲突,因为这会激励他们更快地选择案例)

其次,对如何显示案例进行一些小调整可以减少选择冲突。添加随机元素以显示顺序和/或过滤掉显示的每个其他案例将有助于您的用户自然地选择不同的案例。人类模式识别和任务选择并不是真正随机的,因此对表示的微小改变可以等同于选择行为的重大变化。减少碰撞几率可以使您的碰撞通知保持罕见(从而减少对用户的挫败感)。如果您的用户可以分成可以帮助确定有用的案例排序/过滤的分类,那就更好了。

好的,随着时间的推移,第三件事就是如果您记录碰撞发生的时间(有关碰撞的有用元数据和参与时间)。有了坚实的碰撞数据,您可以找到有效的和无效的。随着时间的推移,您可以根据实际使用情况磨练应用程序,并尽早发现潜在问题。在他们意识到问题存在之前,没有什么能比让用户更好地解决问题(并且能够解释你的解决方案)。

通过这些缓解模式,您可能会发现可以安全地减少ajax查询时间范围,而不会影响用户体验。通过有用的日志记录,您可以确保您实施的任何调整实际上都在工作(或者不是 - 这可能更有用)。

答案 3 :(得分:2)

您是否尝试过增加刷新之间的时间。我希望每30秒一次就足够了。 40个请求/分钟比1200 /分钟少得多。您的用户可能甚至没有注意到差异。

如果他们这样做,那么如何在页面上提供刷新按钮,以便用户可以在选择项目之前手动刷新列表,以避免在选择时出现恼人的消息。

答案 4 :(得分:2)

如果可能的话,限制系统,使他们只是从工作队列中获得下一个打开的问题,而不是让他们从所有未解决的问题中选择。

如果无法做到这一点,我想您可以检查问题的选择,看它是否仍然可用。如果它不可用,则在用户点击它之后使其消失。这样,您只需要在实际点击某些内容时请求,而不是持续轮询数据。

答案 5 :(得分:1)

我很想看到这个问题,特别是在你提到你已经标记了正在进行/正在维护的门票并且有该项目的时间戳/版本之后。

不够以下:

  1. 用户浏览故障单并查看可用故障单列表,即不包括正在进行中的数据库中的故障单。如果您希望用户也看到正在进行的故障单,您可以在故障单状态中清楚地指出它并禁用该选项。
  2. 用户可以通过打开故障单显式或隐式地标记故障单(取决于用户体验/呈现给用户的方式)。
  3. 用户明确将票证移至其他状态,即已完成,无效,等待反馈等。
  4. 在1处检索项目时,您包含时间戳/版本。当2发生时,您使用乐观并发方法来确保如果2个人尝试更新同时获取票证,则只有第一个成功。

    对于第二个人来说,更新......其中... timestamp = @timestamp将找不到任何要更新的记录,您将报告该故障单已经被拍摄。

    如果您愿意,可以在上面的内容之上构建,以便在抓取故障单时更新UI。这可以通过在x时间之后完全刷新当前票证页面(可能提醒/提示用户),或者甚至通过检索用ajax显示的票证页面改变的票证列表。您仍然可以使用前面的步骤,因为这种修改只是为用户提供了便利。