防止并发循环运行

时间:2013-12-25 15:47:13

标签: php mysql

我的功能简单如下

$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架构。

2 个答案:

答案 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_*函数。切换到MySQLiPDO

答案 1 :(得分:0)

您正在寻找的是Semaphores

基本上逻辑是你在执行任何代码之前获取锁,并在代码完成后释放锁,以便其他会话可以获取信号量。