0

在普通的 PHP 5.3 下,我有一些代码使用 MySQL 首先删除一些旧记录,记录日志,执行一些小操作,然后添加新的替换记录。

删除命令如下所示:

DELETE FROM `rtable` WHERE `UserName`='%s';

添加命令如下所示:

INSERT INTO `table` (`UserName`,`Attribute`,`op`,`Value`) VALUES ('%s','%s','%s','%s');

奇怪的是,插入命令在正常运行时似乎没有执行,但是如果我启用调试器并一次单步执行一行,它似乎可以工作。同样,如果我在删除命令之后插入一个两秒的睡眠命令。它似乎工作。因此,我假设插入命令在删除命令之前运行,因此删除命令也在擦除新记录。

如何让 PHP 在继续插入命令之前等待删除操作完成?

4

2 回答 2

1

我不完全确定 PHP 如何处理进程以及如何运行连续查询,但如果您想确保将删除封装在事务中,您可以使用 PDO 执行此操作,如下所示:

$dbh->beginTransaction();
$sth = $dbh->exec("DELETE FROM `rtable` WHERE `UserName`='%s'");
$dbh->commit();
// You could also pop a transaction around the inserts 
// in case another page tries to do the same
$sth = $dbh->exec("INSERT INTO `table` 
    (`UserName`,`Attribute`,`op`,`Value`) 
    VALUES ('%s','%s','%s','%s')");

顺便说一句:我冒昧地将单引号更正为您的查询中的反引号。

于 2012-09-27T09:40:41.623 回答
1

这听起来真的很奇怪。你碰巧有一个复制的数据库集群吗?此外,您是否检查 mysql_query 或任何命令的返回值并打印错误消息(当然不建议将其用于生产脚本)?

于 2012-09-27T09:39:57.813 回答