SELECT然后立即DELETE mysql记录

时间:2012-02-04 01:51:05

标签: php mysql select transactions sql-delete

我有一个运行SELECT查询的PHP脚本,然后立即删除该记录。有多台机器正在ping同一个php文件并从同一个表中获取数据。每台远程计算机都在cron作业上运行。

我的问题是,有时它无法快速删除,因为有些机器在同一时间ping。

我的问题是,我如何从数据库中选择一条记录,并在下一台机器抓取它之前将其删除。现在我只是添加了一个短暂的延迟,但效果并不好。我尝试过使用交易,但我认为这不适用于此。

以下是我的脚本的示例片段:

<?php

$query = "SELECT * FROM `queue` LIMIT 1";
$result = mysql_query($query) or die(mysql_error());

while($row = mysql_fetch_array($result)){
    $email = $row['email'];
    $campaign_id = $row['campaign'];
}

$queryx = "DELETE FROM `queue` WHERE `email` = '".$email."'";
$resultx = mysql_query($queryx) or die(mysql_error());

?>

真的很感激帮助。

5 个答案:

答案 0 :(得分:6)

好吧我会使用表锁 read more here

锁定是安全的,适用于一个客户端会话。 表锁仅保护其他会话不适当的读取或写入。

答案 1 :(得分:4)

您应该使用子查询,如下所示......

<?php

$queryx = "DELETE FROM `queue` WHERE `email` IN (SELECT email FROM `queue` LIMIT 1)";
$resultx = mysql_query($queryx) or die(mysql_error());

?>

*注意:始终只选择您想要的字段...尽量避免选择* ...这会降低性能

答案 2 :(得分:4)

如果你正在使用MariaDB 10:

DELETE FROM `queue` LIMIT 1 RETURNING *

Documentation

答案 3 :(得分:1)

运行更新查询,在您执行选择之前更改密钥。通过这个新密钥进行选择,只有在同一个会话中才知道 如果表是innoDB,则记录被锁定,当它被释放时,其他选择将无法找到记录。

答案 4 :(得分:-3)

将删除查询放在while循环中,只是因为你想要从你的选择中增加限制。

<?php
$query = mysql_query("SELECT * FROM `queue` LIMIT 1") or die(mysql_error());

while($row = mysql_fetch_array($query)){
    mysql_query("DELETE FROM `queue` WHERE `email` = '" . $row['email'] . "' LIMIT 1") or die(mysql_error());
}
?>

上面的代码与运行代码相同:

mysql_query("DELETE FROM `queue` LIMIT 1") or die(mysql_error());

小心使用删除查询,如果电子邮件字段为空,则会删除所有包含空白电子邮件的行。将LIMIT 1添加到删除查询中,以避免删除多行。

要添加随机延迟,您可以在脚本顶部添加sleep

例如:

<?php
$seconds = mt_rand(1,10);
sleep($seconds);
?>