[英]SELECT then immediately DELETE mysql record
我有一个运行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());
?>
真的很感激帮助。
您应该使用子查询如下...
<?php
$queryx = "DELETE FROM `queue` WHERE `email` IN (SELECT email FROM `queue` LIMIT 1)";
$resultx = mysql_query($queryx) or die(mysql_error());
?>
*注意:始终只选择您想要的字段...尽量避免选择* ...这会降低性能
运行更新查询,在您执行选择之前更改密钥。 通过这个新密钥进行选择,只在同一个会话中知道。
如果表是innoDB,则记录被锁定,当它被释放时,其他选择将找不到记录。
将删除查询放在while循环中,只是因为你想要增加select的限制。
<?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
添加到删除查询中以避免删除多行。
要添加随机延迟,您可以在脚本顶部添加一个睡眠 ,
例如:
<?php
$seconds = mt_rand(1,10);
sleep($seconds);
?>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.