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

use*_*167 6 php mysql pessimistic-locking

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

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

在这种情况下,php/mysql中是否有标准方法?如果网络用户从未点击"保存"/"取消"但关闭了互联网开发者,会发生什么?

Mat*_*lin 10

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

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

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

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

干杯


Ben*_*ier 6

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

示例表结构:

tblLocks

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

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


Dav*_*dom 5

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

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

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