我们要求管理员登录到站点并以表格格式查看用户记录列表。当他点击某条记录时,他会得到用户的详细信息并致电用户解决他的问题。现在两位经理可能会登录并点击同一记录并同时呼叫同一用户。我们想避免这种情况。
条件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 - 成功)
现在经理两次登录一段时间后经理1没有关闭记录意味着状态仍在进行中或他直接关闭了浏览器 Manager2:从记录中选择状态,ver_no,其中record_id =? (ver_no现在是1) 点击记录查看详细信息 Manager2:更新记录集状态='进行中',ver_no = 1其中record_id =?和ver_no = 1(ver_no现在是1 - 成功)
答案 0 :(得分:2)
这是乐观锁定方案的一个很好的例子。这只适用于后端服务器代码。您无法使用前端的java脚本锁定用户。
让我用简单的语言解释如何做到这一点:
将版本号列和状态标志添加到数据库表。可能在记录表上。
管理员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选择自己时,状态将已经进行中。如果没有,你可以使用该记录。
答案 1 :(得分:1)
您只需在数据库中保留一个标志即可。单击该按钮时,它将被设置为false,并且当操作完成时将其设置为true。因此,其他用户的访问受到限制。