记录锁定
本文关键字:记录锁定 | 更新日期: 2023-09-27 18:13:57
我正在开发一个应用程序,其中许多员工可能登录到系统来解决客户投诉。如果一个员工点击"开始"按钮投诉,记录应该被冻结。冻结的意思是它不应该出现在其他员工的屏幕上(当屏幕在他们的机器上使用Ajax更新时)。此外,它不应该只在一定时间内出现。如果员工在几分钟内没有回应投诉,它应该再次出现在投诉队列中。
如何管理此时间段?我有一个方法,其中一个用户点击"开始",我可以在缓存对象中存储该项目,它只有效,直到它的到期。然后,当其他员工的屏幕刷新时,我只显示那些没有参加并且没有出现在缓存中的项目。如果它出现在缓存中,则意味着它正在被某人参加。我的方向对吗?或者有没有更好的方法?
你可以做的一件事是在数据库中有一个'lock'列,并将该列设置为DateTime列。
当用户单击"开始"时,请注意该列中的时间。
在检索要显示的记录时,过滤掉锁列中非空值的记录,或者锁列中的值至少是x分钟前的记录(可以使用GetDate()函数的数学方法计算)。
最简单的方法是创建一个名为'RecordStatus'或类似的列,您可以将其设置为一个特殊的值,以表明它仍在创建或修改。
这会迫使您修改所有的查询,以明确地排除具有该状态的记录,但从长远来看,它比任何类型的数据库或应用程序级逻辑锁工作得更好,更可靠。
我们已经在两种情况下独立地解决了这个问题,在"记录锁定"DB记录上使用了一些变体。在一个系统中,当记录作为新条目进入"队列"时,就会创建锁定记录;在另一种情况下,锁定记录是在用户从队列中取出记录时创建的。
无论您如何切片,当用户的软件副本打开队列记录进行工作时,锁定记录应该在DB中,并将一些关于您的用户的唯一标识信息写入其中。它对于被锁定的记录应该是唯一的,也可能是锁级别(意味着相同级别的两个锁不能存在于同一记录上),并且为了进行更改,将打开记录的用户标识为"拥有"该记录。只要用户在其软件中打开了该记录,该锁定记录就应该持续存在。
"打破"锁的能力可以通过简单地将锁重新分配给另一个用户来实现,再加上由原锁定用户的软件定期轮询锁定对象;在任何时候,如果用户不再是所有者,则锁已被"打破",用户可以选择重新获得锁(打破其他用户的新锁)或继续前进。
现在,如果用户的软件崩溃了,他们仍然拥有记录上的锁。也可能发生删除锁的操作失败的情况(这可能发生在实际数据在另一个DB中并且无法强制执行通用事务的情况下)。在这种情况下,您将需要某种机制来删除"孤立"锁,或者强制用户删除它们。如果被锁定的项目是时间敏感的,您将需要设计多个冗余级别的锁移除(可能是一个定时作业,每分钟一次,将打破任何超过X分钟的锁,或者因为该用户不再登录而已知为"孤儿"的锁)。