我们有一个表,因为不能加唯一的主键,在操作该表的时候,偶尔会同时新增两条相同的记录,只是自增的ID不同。无论是前台提交还是后台程序的新增,都出现过这种情况,不知各位牛大侠们有遇到过否?前台提交,因为是人工操作,可能会涉及到鼠标触发两次的情况,但后台程序运行的新增应该不关两次提交的事吧,所以郁闷中~注:每次新增前都有记录是否存在的判断。
在线等答案!

解决方案 »

  1.   

    可能的原因:1、鼠标触发两次
    2、退后刷新解决办法:针对问题1:提交表单后,button按钮变为灰色(disabled 为 true)参考代码:function validate(theform) {
    theform.topicsubmit.value = '正在提交订单, 请稍后……';
    theform.topicsubmit.disabled = true;
    return true;
    }针对问题2的参考代码:
    <?php
    session_start();
    $allow_sep = "3";
    if (isset($_SESSION["post_sep"])) {
        if (time() - $_SESSION["post_sep"] < $allow_sep)  {
            exit("请不要反复刷新");
        } else {
            $_SESSION["post_sep"] = time();
        }
    } else {
        $_SESSION["post_sep"] = time();
    }
    ?>
      

  2.   

    To abest $return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID");
    if (empty($return)) {
        $insertID = DB::add("tb_personal_login",$data,DBName_personal);
    }
      

  3.   

    俺是楼主,兄弟们,这是俺的判断代码$return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID"); //...其它的一些与tb_personal_login无关的数据操作if (empty($return)) { 
        $insertID = DB::add("tb_personal_login",$data,DBName_personal); 
    }
      

  4.   

    为什么不用主键呢?用UUID做主键不是很好么。
      

  5.   

    楼上说的正解,我也想用主键的,但这个表的数据已经是千万级。数据表原来不是我设计的,现在要改用主键,系统的成本已经变得非常昂贵,其实二楼提供的解决方案对前台提交我想应该是有效的。这个问题出现的原因是高并发,数据库被阻时出现的状况。因为用mysql不久,所以请问一个各高人!
      

  6.   

    2 楼的改进下:
    <?php
    session_start();
    $allow_sep = "3";
    if (isset($_SESSION["post_sep"])){
    if (time() - $_SESSION["post_sep"] < $allow_sep){
         exit("您两次操作太快了!");
    }
    else{
         return true;
         $_SESSION["post_sep"] = time();
       }
    }
    else{
      return true;
      $_SESSION["post_sep"] = time();
    }
    ?>
      

  7.   

    此外:$return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID");//...其它的一些与tb_personal_login无关的数据操作  无关的数据操作有没有用到$return这个变量
      

  8.   

    这与是否有主键无关
    这与现有程序无关
    主要表现是因为表单被重复提交了,注意并不特指2楼罗列的原因。ie6时代这个问题比较严重,是内部问题而非外部问题解决的办法是检查是否为重复提交:session_start();
    $form = md5(serialize($_REQUEST)); //构造提交内容的索引
    if($_SESSION['last'] == $form) { //检查是否重复提交
      exit(); //是,则中断处理
    }
    $_SESSION['last'] = $form;//以下为正常时的处理代码
      

  9.   

    To abest 
    $return = DB::getRow("tb_personal_login",array("PL_LoginName" => trim($loginName)),DBName_personal,"PL_SnatchLogID,PL_ID");//...其它的一些与tb_personal_login无关的数据操作
    其它一些数据操作用到了$return中的一些值判断,但没有改变$return里的值。To xuzuning 大哥说得在理,只是这种重复提交的速度是否会快于数据库的判断呢,毕竟新增是在判断数据是否存在之后。
      

  10.   

    估计是在FORM 的 SUBMIT按钮上,和FORM 上做了ONSUBMIT 没RETURN