【问题标题】:What is equivalent of the C# lock statement in PHP?什么相当于 PHP 中的 C# lock 语句?
【发布时间】:2011-01-14 10:03:38
【问题描述】:

为了并发和确保数据的完整性,您将如何获得给定对象的互斥锁?您是否需要在数据库或文件中使用锁定,或者 PHP 是否支持类似的东西?

【问题讨论】:

    标签: php concurrency locking mutual-exclusion


    【解决方案1】:

    PHP 不支持多线程,因此对象没有锁定机制。如果你想锁定一个文件,你可以使用flock。由于数据库引擎通常可以处理多个连接,因此无需锁定数据库。

    【讨论】:

    • 我说的不仅仅是“多个连接”,而是您需要确保没有其他人同时修改给定数据的情况。例如,如果您有一个 ATM 应用程序。如果两个人同时提取 50 美元,但账户中只有 50 美元,那么其中一个人应该会收到错误。
    【解决方案2】:

    请记住 PHP 不是多线程的,因此您不太可能需要这样的东西......但是,如果您使用共享内存或任何其他外部资源,则可能需要。在这种情况下使用信号量:

    http://www.php.net/manual/en/function.sem-acquire.php

    http://www.php.net/manual/en/function.sem-get.php

    http://www.php.net/manual/en/function.sem-release.php

    【讨论】:

      【解决方案3】:

      成群结队地寻找文件。

      如果您想在数据库中使用锁,那么您需要为这些数据库使用锁功能。几乎所有数据库都使用某种形式的锁定机制。

      没有对象

      【讨论】:

        【解决方案4】:

        支持信号量

        它有羊群 http://www.php.net/manual/en/function.flock.php

        您可以在 MySQL 中进行表锁定。

        【讨论】:

          【解决方案5】:

          就像其他人回答的那样,由于 PHP 不是多线程的,因此您不需要锁定对象。但是,如果您需要锁定数据库,您可能需要查看transactions。有很多关于使用 PHP 和 MySQL 进行事务的教程(可能也适用于其他 RMDBS)。

          【讨论】:

            【解决方案6】:

            PHP 可以在多线程环境中运行。 即使 Web 服务器没有使用多个线程,也可以同时运行多个进程。

            在这种情况下,并发问题仍然可能发生。

            如果你想要类似锁的东西来解决并发问题,你可以使用信号量: http://www.php.net/manual/en/function.sem-acquire.php

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-03-26
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2011-08-27
              • 2012-04-02
              • 1970-01-01
              相关资源
              最近更新 更多