我有一个运行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());
?>
真的很感激帮助。
答案 0 :(得分:6)
锁定是安全的,适用于一个客户端会话。 表锁仅保护其他会话不适当的读取或写入。
答案 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)
答案 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);
?>