【问题标题】:How to implement pessimistic locking in a php/mysql web application?如何在 php/mysql Web 应用程序中实现悲观锁定?
【发布时间】:2011-11-17 16:22:41
【问题描述】:

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

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

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

【问题讨论】:

    标签: php mysql pessimistic-locking


    【解决方案1】:

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

    当 TTL 已过时,锁定将终止,因此您可以使用 NOW 和 LOCKDATE 减去日期,以查看对象是否已锁定超过 30 分钟或 1 小时(如您所愿)。

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

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

    干杯

    【讨论】:

    • 另请注意,乐观也是一种很好的工作方式,您可以使用简单的 LASTUPDATE 列实现乐观锁定,并将其与隐藏字段中的最后一个 LASTUPDATE 值进行比较。如果数据发生了变化,你强制用户接受他必须重新开始编辑,或者你可以尝试看看你是否想要做一个 MERGE 页面来显示新旧内容供用户比较。
    • 我正在考虑与上面提到的 LOCKDATE 和 LOCKWHO 非常相似的东西。你有没有想过在用户进行编辑时使用 jQuery/Ajax 请求来更新 LOCKDATE 字段(从编辑视图)?
    • 我不会实现 jquery 锁更新器,因为如果出于任何原因,您的用户最终忘记了他的浏览器打开并且有人需要编辑对象,它永远不会超时。为您的锁定日期提供合理的 TTL 确实是首选方法。
    • 需要自编码实现web应用中的悲观锁,现有框架中没有一些简单的函数调用?
    • 我相信您可以找到一个具有此功能的框架,无论是本机还是通过插件,但考虑到这是在 2013 年编写的,您可能需要查看是否需要锁定。今天的一般应用程序行为是使用 ReST 模式,它们对于悲观锁定并不是很好,在某种程度上可能是乐观的,但不是悲观的。
    【解决方案2】:

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

    示例表结构:

    tblLocks

    • TableName(锁定表的名称)
    • RowID(锁定表行的主键)
    • Lo​​ckDateTime(行被锁定时)
    • Lo​​ckUser(锁定行的人)

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-11-08
        • 2013-02-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-14
        • 1970-01-01
        • 2010-09-12
        相关资源
        最近更新 更多