我有这样的代码
保留.php
$r=mysql_query("select count(*) from ticket");
$rec=mysql_fetch_array($r);
if ($rec[0]==0)
{
insert into ticket values .....
}
我只有一张票。 两个用户请求 reserve.php。
“a”用户请求 reserve.php 且可用票为 0 。但在插入之前,“b”用户的可用票还为 0。所以两个用户订票。
表是 Innodb。 如何防止这种情况?事务,锁表还是什么?
最佳答案
在这些情况下,我通常只使用 UPDATE 语句并检查更新影响了多少记录 (mysql_affected_rows)。
UPDATE tickets SET ticket_count=ticket_count-1 WHERE ticket_id=123 AND ticket_count>0
如果其他人先递减计数器,则不会发生更新,您也不会给用户一张票。应启用自动提交,以便更新是一个独立的“事务”。
或者,您可以将 SELECT 更改为 SELECT ... FOR UPDATE http://dev.mysql.com/doc/refman/5.0/en/innodb-locking-reads.html
关于php - innodb中的并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6449321/