1

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

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

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

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

4

1 回答 1

1

您实际上是在要求锁定。

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

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

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

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

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

于 2012-11-18T12:06:23.780 回答