我正在为一家小诊所编写一个队列管理系统。将有多个用户尝试执行相同的操作,因此这些是并发问题。我熟悉ACID保证,也理解交易概念。我知道两个人不能同时更改相同的数据。
但是这是我的问题:我有一个PHP
函数isFree($time)
,可以确定特定医生是否有空。我担心如果两个用户都试图调用相同的函数,它们都可能得到肯定的结果并搞砸了,所以不知怎的,我需要对并发用户进行排队,或者只接受一个用户。
解决这个问题的最简单方法是限制,我的函数可以一次调用一个。我可能需要某种旗帜或阻挡系统,但我对如何操作并不知道。
或者另一方面,仅限制那些可能重叠的函数调用会更快。例如,同时在周一和周二调用isFree($time)
函数不会导致任何问题。
答案 0 :(得分:1)
你实际上要求锁定。
我猜你的队列系统在MySQL上运行数据库。如果是这样,你可以LOCK
你正在使用的表(或者在某些数据库引擎上,你正在使用的特定行!)。结构为LOCK TABLES yourTableName READ
。
这将有效地阻止其他人阅读表中的任何内容,直到:
UNLOCK
)所有数据库存储引擎都是如此。 InnoDB支持通过事务进行行级锁定。不是使用SELECT
查询,而是将其后缀为FOR UPDATE
,以便完全锁定您刚读取的行。
This希望能够更好地阐明MySQL / innoDB的锁定机制。为了释放锁,请更新行或提交事务。