如何避免前端并发



我们有一个要求,经理登录到站点并以表格格式查看用户记录列表。当他点击某个记录时,他会得到用户的详细信息,并打电话给用户来解决他的问题。现在,两个管理员可以登录并点击同一条记录,同时调用同一用户。我们希望避免这种情况。

条件1:两个经理在同一时间登录的记录都可以用正常的颜色,比如绿色。经理1点击记录并开始编辑/呼叫用户。在这种情况下,应该有某种锁,这样,如果经理2试图打开同一记录,他会收到弹出消息"正在进行"。

条件2:经理1登录并查看绿色记录。然后Manager 2登录并看到灰色的相同记录。现在他应该无法点击该记录。


管理器1:选择状态,从记录中ver_no,其中record_id=?(ver_no现在为零)点击记录查看详细信息和更新记录集状态="正在进行",ver_no=1,其中record_id=?ver_no=0(ver_no现在为1-成功)

现在经理两次登录一段时间后,经理1还没有关闭记录,这意味着状态仍在进行中,或者他直接关闭了浏览器管理器2:选择状态,从记录中ver_no,其中record_id=?(版本号现在为1)点击记录查看详细信息和管理器2:更新记录集状态="正在进行",ver_no=1,其中record_id=?ver_no=1(ver_no现在是1-成功)

对于乐观锁定场景来说,这是一个很好的例子。这将只在后端服务器代码中起作用。您不能在前端使用java脚本锁定用户。

让我简单地解释一下如何做到这一点:

将版本号列和状态标志添加到数据库表中。可能在记录表上。

Manager 1单击记录,首先从数据库中选择该记录,增加版本号并更新标志,表示该记录现在已被拾取。

经理2点击记录(如果他在同一时间点击,经理2将选择与经理1选择的记录相同的记录)。但是,当Manager 2尝试更新记录时,版本号将不匹配,并且更新将返回而不更新任何行。使用此选项可以更新您的UI,说明记录正在进行中。

对话如下:

Manager1: select status, ver_no from record where record_id=? (ver_no is now zero)
Manager2: select status, ver_no from record where record_id=? (ver_no is now zero)
Manager1: update record set status='In progress', ver_no=1 where record_id=? and ver_no=0 (ver_no is now 1 - Success)
Manager2: update record set status='In progress', ver_no=1 where record_id=? and ver_no=0 (This will fail to update any row)    

以上只是在它们同时攻击同一行的情况下。大多数情况下,当Manager 2选择自己时,状态将已为"正在进行"。如果没有,你可以使用该记录。

您可以简单地在数据库中保留一个标志。当单击该按钮时,它将被设置为false,当操作完成时,将其设置回true。因此,其他用户的访问受到限制。

最新更新