1

该函数具有下一个结构:

$q = 'LOCK TABLES table1 WRITE;';
mysql_query($q);    
$q = 'select id from table1 where is_delete = 0 limit 1;';
$res = mysql_fetch_assoc(mysql_query($q));
if($res) {
$q = 'UPDATE table1 SET is_delete = 1 WHERE id = '".$res['id']."'';
mysql_query($q);
}
$q = 'UNLOCK TABLES;';
mysql_query($q);

我锁定了所有表,但查询并行运行。如何解决这个问题?

4

1 回答 1

0

检查您是否在 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/

于 2012-04-16T19:34:20.113 回答