·您的位置: 首页 » 纯粹博客 » 技术探讨 » MySQL 读写时差导致的重复处理问题

MySQL 读写时差导致的重复处理问题

作者:faisun 发布日期:2006-05-22

现需对表 table 中 status=0  的列进行处理。 run.php 中程序如下:

 <?
    include("global.php");
    $query=$db->query("select * from table where status=0 limit 20");
    while($result=$db->fetch_array($query)){
        $db->query("update table set status=1 where id=$result[id]");
        // 处理 $result,这个过程需要费时约 1 秒
        // 所以,下面采用 sleep() 代替

        sleep(1);
    }
?>

run.php 由 ajax 不断刷新,直到把全部的数据处理完为止。

为了加快速度,我开了两个 ajax 的窗口。运行前有 1000 条符合条件的数据需要处理。理论上,两个窗口一共刷新 50 次,就可以全部处理完。

然而,两个窗口一共刷新的次数远不止 50 次,数据处理的次数也远不止 1000 条。
也就是说,很多数据被重复处理了。

为什么会这样呢。处理数据前,我不是把 status 先改为 1 了吗?

于是我把 table 复制为 table1 ,并把 status=0 的数据删到只剩 10 条。
编写以下程序:

<?
    include("global.php");
    $query=$db->query("select * from table1 where status=0");
    while($result=$db->fetch_array($query)){
        $db->query("update table set status=1");
        print_r($result);
    }
?>

程序中,取出第一条数据的时候,就已经把 所有的 status 改为 1 了。 print_r() 的结果,还是 10 条数据。也是就说,数据在 mysql_query() 的时候,就已经定下来了。即使后来数据有所更改,但并不影响本次查询的结果。

所以在第一个程序中,由于处理过程较久,开两个或以上处理的窗口时,MySQL 返回的结果很多是一样的,造成了数据的重复处理。

解决的方法是,采用两次循环,把数据库更新和费时较久的后期数据处理分开,减少数据库的读写时差:

<?
    include("global.php");
    $query=$db->query("select * from table where status=0 limit 20");
    $where = '0';
    $result_arr = array();
    while($result=$db->fetch_array($query)){
        $result_arr[] = $result;
        $where .= " or id=$result[id]";
    }
    if($where) $db->query("update table set status=1 where $where");

    foreach($result_arr as $result){
        // 处理 $result,这个过程需要费时约 1 秒
        // 所以,下面采用 sleep() 代替

        sleep(1);
    }
?>

-= 文章分类 =-
文 章 搜 索
关键词:
类型:
范围:
最新发表
纯粹空间 softpure.com
Copyright © 2006-2008 暖阳制作 版权所有
QQ: 15242663 (拒绝闲聊)  Email: faisun@sina.com
 纯粹空间 - 韩国酷站|酷站欣赏|教程大全|资源下载|免费博客|美女壁纸|设计素材|技术论坛   Valid XHTML 1.0 Transitional
百度搜索 谷歌搜索 Alexa搜索 | 粤ICP备19116064号-1