php - innodb中的并发

标签 php mysql concurrency innodb

我有这样的代码

保留.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/

相关文章:

php - 使用 htmlpurifier 进行输入或输出转义/过滤

php - MySQL - PDO - 如果 POSTS 为 NULL,则允许

mysql - 需要调整哪些设置来改进包含大量列和少量联接的 SELECT?

php - 删除具有最后一个时间戳的行?

java - 如何正确使用信号量

php - 可扩展的基于规则的访问模式

php - 从多个表中选择并显示到表中

java - Double check 中不稳定的东西是什么?

java - Java 中的局部对象变量线程安全

php - htaccess 文件 : Force going to https instead of http except for specific pages