我正在为一家小诊所写一个队列管理系统。会有多个用户尝试做相同的事情,所以这是一个并发问题。我熟悉ACID保证,也了解事务的概念。我知道两个人不能同时更改相同的数据。
但这是我的问题:我有一个PHP
函数isFree($time)
,它可以确定特定的医生在那个时间是否有空。我担心如果两个用户尝试调用相同的函数,他们可能都会得到积极的结果并搞砸事情,所以我需要以某种方式将并发用户排入队列,或者只接受一个。
解决这个问题的最简单的方法是限制,这样我的函数可以一次调用一个。我可能需要某种标志或阻塞系统,但我不知道该怎么做。
或者从另一方面来说,如果只限制那些可能重叠的函数调用,速度会更快。例如,同时调用星期一和星期二的isFree($time)
函数不会产生任何问题。
发布于 2012-11-18 20:06:24
你实际上是在要求一个锁。
我猜您的队列系统是在数据库的MySQL上运行的。如果是这样,您可以LOCK
您正在使用的表(或在一些数据库引擎上,您正在使用的特定行!)。它的结构是LOCK TABLES yourTableName READ
。
这将有效地防止其他任何人读取表中的任何内容,直到:
使用UNLOCK
)释放锁结束您的会话is
所有数据库存储引擎都是如此。InnoDB支持通过事务进行行级锁定。不使用SELECT
查询,而是给它加上FOR UPDATE
后缀,以获得对刚刚读取的行的完整锁定。
This有望进一步阐明MySQL/innoDB的锁定机制。为了释放锁,要么更新行,要么提交事务。
https://stackoverflow.com/questions/13439814
复制相似问题