PHP,MySQL中的数据阻塞

时间:2012-11-18 11:47:12

标签: php mysql concurrency transactions locking

我正在为一家小诊所编写一个队列管理系统。将有多个用户尝试执行相同的操作,因此这些是并发问题。我熟悉ACID保证,也理解交易概念。我知道两个人不能同时更改相同的数据。

但是这是我的问题:我有一个PHP函数isFree($time),可以确定特定医生是否有空。我担心如果两个用户都试图调用相同的函数,它们都可能得到肯定的结果并搞砸了,所以不知怎的,我需要对并发用户进行排队,或者只接受一个用户。

解决这个问题的最简单方法是限制,我的函数可以一次调用一个。我可能需要某种旗帜或阻挡系统,但我对如何操作并不知道。

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

1 个答案:

答案 0 :(得分:1)

你实际上要求锁定。

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

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

  1. 您的会话已结束
  2. 您释放锁定(使用UNLOCK
  3. 所有数据库存储引擎都是如此。 InnoDB支持通过事务进行行级锁定。不是使用SELECT查询,而是将其后缀为FOR UPDATE,以便完全锁定您刚读取的行。

    This希望能够更好地阐明MySQL / innoDB的锁定机制。为了释放锁,请更新行或提交事务。