我们有一个要求,即管理员必须登录到站点并以表格格式查看用户记录的列表。当他单击某些记录时,他会获得用户详细信息并致电用户以解决他的问题。现在,两个经理可能登录并单击同一记录并同时呼叫同一用户。我们要避免这种情况。
条件1:两个管理员同时登录记录可用于两种颜色,例如绿色。管理员1单击记录并开始编辑/呼叫用户。在这种情况下,应该有某种锁定,以便如果管理员2尝试打开相同的记录,他将弹出消息“进行中”。
条件2:经理1登录并看到绿色记录。然后,Manager 2登录并看到相同的灰色记录。现在,他应该无法单击该记录。
Manager1:从记录中选择状态ver_no,其中record_id =? (ver_no现在为零)
单击记录以查看详细信息和
更新记录集状态=“进行中”,ver_no = 1,其中record_id =?和ver_no = 0(ver_no现在为1-成功)
现在,经理2在一段时间后登录,经理1尚未关闭记录,表明状态仍在进行中,或者他直接关闭了浏览器
Manager2:从记录中选择状态ver_no,其中record_id =? (ver_no现在是1)
单击记录以查看详细信息和
Manager2:更新记录集状态=“进行中”,ver_no = 1,其中record_id =?和ver_no = 1(ver_no现在为1-成功)
最佳答案
这是乐观锁定情况的一个好案例。这仅适用于后端服务器代码。您不能在前端使用Java脚本锁定用户。
让我简单地解释一下如何执行此操作:
将版本号列和状态标志添加到数据库表。可能在记录表上。
管理器1单击记录,首先从数据库中选择记录,增加版本号并更新表示现在已选择记录的标志。
管理员2单击记录,(如果在同一管理员2上单击,则将选择与管理员1选择的记录相同的记录)。但是,当Manager 2尝试更新记录时,版本号将不匹配,并且更新将返回且没有更新的行。使用它来更新您的用户界面,说记录正在进行中。
对话将如下所示:
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选择自己时,状态将为“进行中”。如果没有,您可以处理该记录。