【问题标题】:Data Blocking in PHP, MySQLPHP、MySQL 中的数据阻塞
【发布时间】:2012-11-18 11:47:11
【问题描述】:

我正在为一家小型诊所编写队列管理系统。会有多个用户尝试做同样的事情,所以这是一个并发问题。我熟悉 ACID 保证,也了解交易的概念。我知道两个人不能同时更改相同的数据。

但这是我的问题:我有一个PHP 函数isFree($time),它确定特定医生在那段时间是否有空。恐怕如果两个用户都尝试调用同一个函数,他们都可能会得到肯定的结果并把事情搞砸,所以我需要以某种方式将并发用户排队,或者只接受一个。

解决此问题的最简单方法是限制我的函数一次只能调用一个。我可能需要某种标志或阻止系统,但我不知道该怎么做。

或者另一方面,只限制那些可能重叠的函数调用会更快。例如周一和周二同时调用isFree($time)函数不会有任何问题。

【问题讨论】:

    标签: php mysql concurrency transactions locking


    【解决方案1】:

    您实际上是在要求锁定。

    我猜你的队列系统运行在 MySQL 数据库上。如果是这样,您可以LOCK 您正在使用的表(或在某些数据库引擎上,您正在使用的特定行!)。结构是LOCK TABLES yourTableName READ

    这将有效地防止其他任何人阅读表格中的任何内容,直到:

    1. 您的会话已结束
    2. 你释放了锁(使用UNLOCK

    这适用于所有数据库存储引擎。 InnoDB 通过事务支持行级锁定。不要使用SELECT 查询,而是在它后面加上FOR UPDATE 以完全锁定您刚刚读取的行。

    This 有望进一步阐明 MySQL/innoDB 的锁定机制。为了释放锁,要么更新行,要么提交事务。

    【讨论】:

      猜你喜欢
      • 2011-07-14
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      • 2012-03-10
      • 2020-05-30
      • 1970-01-01
      • 2021-06-03
      • 2017-10-30
      相关资源
      最近更新 更多