检查您是否在 LOCK TABLES 查询中收到任何 MySQL 错误:
$q = 'LOCK TABLES table1 WRITE';
$r = mysql_query($q) or die(mysql_error());
但是,如果这就是你所做的一切,你也可以简单地写:
UPDATE `table1 SET `is_delete` = 1 WHERE `is_delete` = 0 LIMIT 1
这根本不需要任何锁。当然,这只有在您的第一个查询中的数据没有以任何方式处理时才有效,并且如果您正在更新哪一行并不重要,只要它是其中is_delete
设置为 0 的行。这是您发布的代码也做了什么,但对我来说,您想将此代码用于什么并不是很明显:)
更一般地说,如果您为 MySQL 表使用默认的 InnoDB 存储引擎,您可能需要查看 SELECT ... FOR UPDATE:
http ://dev.mysql.com/doc/refman/5.0/en/innodb-锁定-reads.html
你可以写:
$q = 'select id from table1 where is_delete = 0 limit 1 for update';
$res = mysql_fetch_assoc(mysql_query($q));
if($res) {
$q = 'UPDATE table1 SET is_delete = 1 WHERE id = '".$res['id']."'';
mysql_query($q);
}
另见:http ://www.mysqlperformanceblog.com/2006/08/06/select-lock-in-share-mode-and-for-update/