我的功能简单如下
$q = "SELECT * FROM tbl1 WHERE proc=0";
$r = mysql_query($q);
if (mysql_num_rows($r) > 0) {
while ($row = mysql_fetch_assoc($r)) {
mysql_query('UPDATE SET proc=0 FROM tbl1 id=' . $row['id']);
mysql_query("INSERT INTO tbl2(value,tbl_id) VALUE (1,$row['id'])");
}
}
现在在并发会话中,我将面临一个问题。 “将为tbl2插入两行,但我希望有一行!”
由于技术原因我不能使用限制或WHERE用于SELECT。
现在我想知道如何根据我的情况预防这个问题。
修改 我的问题是“SELECT * FROM tbl1 where proc = 0”;在两个并发会话中将返回相同的内容,例如每个会话将返回10行。但我想防止同时运行两个会话的循环! 我使用创建文件并检查是否退出 或更新数据库中的字段并检查是否允许继续。但是它们都不能阻止在同一个会话上运行。
UPDATE2:这只是一个展示我的想法的示例,而且函数不是我使用的,但通常会显示我的问题和脚本flowdata架构。
答案 0 :(得分:0)
好吧,然后添加一个 break
,然后退出 while
循环..在这里这样做
while($row=mysql_fetch_assoc($r)){
mysql_query('UPDATE SET proc=0 FROM tbl1 id='.$row['id']);
mysql_query("INSERT INTO tbl2(value,tbl_id) VALUE (1,$row['id'])");
break; //<--- Add here
}
免责声明:您使用的是obselete数据库API,即不推荐使用的mysql_*
函数。切换到MySQLi
或PDO
。
答案 1 :(得分:0)
您正在寻找的是Semaphores
基本上逻辑是你在执行任何代码之前获取锁,并在代码完成后释放锁,以便其他会话可以获取信号量。