0

我有一个 ASP.Net Web 应用程序,可以将客户呼叫到一个站点。五名员工同时运行此应用程序,当他们看到客户走进来时,他们单击 ButtonGetCustomer 来呼叫客户并来到他们的站点。

这是我的问题。我从 SQL 获取数据并将其存储在数据表中。有时,当两个或多个职员同时点击时,他们会呼叫同一个客户。

关于如何防止这种情况发生的任何想法?

4

2 回答 2

1

我遇到了类似的问题,成千上万的人点击同一个按钮试图申请有限数量的位置。这是一个类似的解决方案:

  1. 当他们单击您的按钮时,运行存储过程以将该用户标记为已查看。
  2. 您的 SPROC 将首先检查用户是否标记为已查看,如果是,则退出(我使用 RAISEERROR 并返回一条消息并在代码中捕获 SQL 异常,以便您可以告诉他们已经调用了哪个用户)。
  3. 如果用户还没有被看到,你的 SPROC 做的下一件事就是将他们标记为已看到。

所以点击按钮的人要么成功并看到了客户,要么收到一条消息说客户已经被看到了。

于 2013-09-27T16:32:56.837 回答
0

您遇到的问题是并发问题。尝试将数据表的读取包装在锁定语句中(有几个),您计划返回到调用线程的记录应该被标记,以便它们不会被其他线程拾取,尝试这样的事情

private Object _syncObject = new Object();
private DataTable yourDataReadMethod() {
   lock(_syncObject)
   {
   // Read records to return to calling thread.

   // Flag records read so they are not given to other threads. You might need expiration date in case the records are not completed in a timely manner.
   }
}

此外,如果您在通话后更新记录,您应该将数据库上次更新日期与客户端表单中保留的日期进行比较;如果它们不同,则引发异常,因为这意味着其他人已经更新了记录。希望这会有所帮助。

于 2013-09-27T17:02:42.620 回答