6

如何在 php/mysql Web 应用程序中实现悲观锁定?

  1. 网络用户打开一个页面来编辑一个数据集(行)
  2. 网络用户单击“锁定”按钮,因此其他用户可以读取但不能写入此数据集
  3. 网络用户进行一些修改(可能需要 1 到 30 分钟)
  4. 网络用户点击“保存”或“取消”,“锁定”被移除

在这种情况下,php/mysql 中有标准方法吗?如果网络用户从不点击“保存”/“取消”但关闭了互联网浏览器,会发生什么?

4

3 回答 3

10

您需要在表中实现 LOCKDATE 和 LOCKWHO 字段。我已经在 PHP/Mysql 之外的许多应用程序中做到了这一点,而且总是以同样的方式。

当 TTL 过去时,锁定将终止,因此您可以使用 NOW 和 LOCKDATE 对日期进行减法,以查看对象是否已根据需要锁定超过 30 分钟或 1 小时。

另一个因素是要考虑当前用户是否是锁定对象的用户。所以这就是为什么你还需要一个 LOCKWHO。这可以是您数据库中的 user_id,也可以是 PHP 中的 session_id。但是将其保留为可识别用户的内容,ipaddress 不是一个好方法。

最后,总是想到一个简单地重置所有 LOCKDATE 和 LOCKWHO 的批量解锁功能......

干杯

于 2011-11-17T16:45:32.483 回答
7

我会将锁写在一个集中的表中,而不是向所有表中添加字段。

示例表结构:

tbl 锁

  • TableName(锁定表的名称)
  • RowID(锁定表行的主键)
  • LockDateTime(行被锁定时)
  • LockUser(谁锁定了行)

使用这种方法,您可以找到用户创建的所有锁,而无需扫描所有表。例如,您可以在用户注销时杀死所有锁。

于 2013-09-11T15:04:22.180 回答
6

传统上,这是通过数据库中已适当标记的记录上的布尔locked列来完成的。

必须释放锁是这种锁定的功能,并且环境可能会自然地阻止这种情况发生(系统崩溃、用户愚蠢、丢失的网络数据包等)。这就是为什么您需要提供一些手动解锁方法和/或对记录可以锁定多长时间施加时间限制(可能是 cron 作业?)。如果浏览器仍然打开,您可以实施某种 AJAX 轮询以保持记录锁定?无论如何,您最好在修改之前验证记录中的数据是否与获取锁时的数据相同。

这种行为的这种限制在 Web 应用程序中特别普遍,但对于任何使用这种方法的东西都是如此——首先,Sage Line 50 是一个错误,我经常不得不在机器/应用程序崩溃后删除锁定文件。

于 2011-11-17T16:43:41.823 回答