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

时间:2011-11-17 16:22:41

标签: php mysql pessimistic-locking

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

  1. 网络用户打开一个页面来编辑一个数据集(行)
  2. 网络用户点击“锁定”按钮,以便其他用户能够阅读但不能写入此数据集
  3. 网络用户进行一些修改(需要1到30分钟)
  4. 网络用户点击“保存”或“取消”并删除“锁定”
  5. 这种情况下php / mysql中是否有标准方法?如果网络用户从未点击“保存”/“取消”但关闭了互联网开发者,会发生什么?

3 个答案:

答案 0 :(得分:10)

您需要在表格中实现LOCKDATE和LOCKWHO字段。我已经在PHP / Mysql之外的许多应用程序中完成了它,它总是以同样的方式。

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

另一个因素是考虑当前用户是否是锁定对象的用户。那就是为什么你还需要一个LOCKWHO。这可以是来自数据库的user_id,来自PHP的session_id。但要保持标识用户的东西,ipaddress不是一个好方法。

最后,总是想到一个大规模解锁功能,只需重置所有LOCKDATE和LOCKWHO ......

干杯

答案 1 :(得分:6)

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

示例表结构:

tblLocks

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

使用此方法,您可以找到用户所做的所有锁定,而无需扫描所有表格。例如,当用户注销时,您可以终止所有锁定。

答案 2 :(得分:5)

传统上,这是通过在数据库中记录正确的记录上的布尔locked列来完成的。

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

这种行为的限制在Web应用程序中尤为普遍,但对于使用此方法的任何事情都是如此 - 对于一个,Sage Line 50是一个bug,我经常需要删除机器后的锁定文件/应用程序崩溃。