如何确保从 asp.net 控制器操作方法向每个并发请求返回唯一记录

How to make sure that a unique record is returned to each concurrent request from a asp.net controller action method

在我们的一个 ASP.Net 应用程序中,我们必须将客户投诉分配给支持主管。客户投诉记录在数据库 table 中。我们使用 entity framework 代码优先方法。

当支持主管登录系统时,系统会向他提供客户投诉(视图)以及分配给他的投诉之一。一旦他完成了投诉手续并提交了信息,他就会得到下一个投诉分配给他,他将一直持续到今天结束。

这里的挑战是有 N 个支持主管同时工作并且同时触发相同的操作方法 (AssignCustomerComplaint)。现在我们将如何确保每个客户主管都会收到未分配的独特投诉。

注意:我在数据库中已经有一个字段 table 来说明投诉是否分配给支持主管(存储支持主管的用户 ID)。因此,在业务逻辑中,我正在检查投诉是否已分配,如果没有,则我将使用当前用户更新 userid 字段,然后使用模型返回视图。但在某些情况下,由于并发请求,相同的投诉会返回给不同的支持主管(最新请求再次更新 userid 字段)。很明显该记录没有应用锁。

我可以锁定控制器操作方法,直到我们将特定的投诉分配给支持主管,但我想检查是否有更好的方法可以在不影响性能的情况下执行此操作。

我会处理不同步的分配,因为这是唯一会出现并发问题的部分。如果同时记录了两个投诉,而您只需检索要分配的下一个代表,则有可能将两者都分配给同一个代表,而不是两个不同的代表。

但是,如果您只是简单地保存投诉,然后安排一个后台进程返回并将未分配的投诉按顺序分配给代表,那么您可以有效地消除等式中的并发问题。