具体描述:
客户发了两个请求,根据showAdvice判断是否执行插入或更新操作。第一个showAdvice是true就不执行后面的数据库操作 ,第二个可以执行。两个请求依次而发,应该只执行一次插入操作,但是经常出现执行两次插入操作,而且插入的数据一模一样,在程序中已经做了唯一性校验,但是还是插入了两条同样的记录。求大侠指点请求 数据库操作

解决方案 »

  1.   

    是并发吧?showAdvice是保存在表中?如果是,取值时先 FOR UPDATE,再判断
      

  2.   

    showAdvice不是表的字段 只是个标示符  不是并发  第一个请求 只是为了获取建议而已,第二个请求是为了保存数据 
      

  3.   

    获取每个请求,及对应的值:i.ebelter.com
    获取每个请求,及对应的值:42.121.113.13
    获取每个请求,及对应的值:42.121.113.13
    获取每个请求,及对应的值:close
    showAdvice=true
    showResult=true
    count:35
    获取userId的用户信息:sql检验sql的执行次数:SELECT USER_NAME,SEX,AGE,HEIGHT,WEIGHT,PROFESSION,REGION,SERIALNUMBER,DISEASEHISTORY FROM `belter_userinfo` t WHERE t.`USER_ID`='1754188' 
    获取每个请求,及对应的值:i.ebelter.com
    获取每个请求,及对应的值:42.121.119.90
    获取每个请求,及对应的值:42.121.119.90
    获取每个请求,及对应的值:close
    showAdvice=false
    showResult=false
    count:36
    获取userId的用户信息:sql检验sql的执行次数:SELECT USER_NAME,SEX,AGE,HEIGHT,WEIGHT,PROFESSION,REGION,SERIALNUMBER,DISEASEHISTORY FROM `belter_userinfo` t WHERE t.`USER_ID`='1754188' 
    search_sql:select ID from belter_weight where USER_ID='1754188' and TEST_DATE='2013-03-14 15:12:41' limit 1
    res:0
    insert+search_sql:insert into belter_weight (USER_ID, WEIGHT, HEIGHT,SHAREID,TEST_DATE) values('1754188', 71.500000, 170.000000, '0','2013-03-14 15:12:41')
    此时记录res:1
    search_sql:select ID from belter_weight where USER_ID='1754188' and TEST_DATE='2013-03-14 15:12:41' limit 1
    res:0
    insert+search_sql:insert into belter_weight (USER_ID, WEIGHT, HEIGHT,SHAREID,TEST_DATE) values('1754188', 71.500000, 170.000000, '0','2013-03-14 15:12:41')
    此时记录res:1
    SELECT USER_NAME,SEX,AGE,HEIGHT FROM belter_userinfo WHERE USER_ID='1754188'
    sex: 0weight: 71.5height: 170.0score:87.0
    这是后台的运行日志
      

  4.   

    CREATE PROCEDURE InsertColor
    (
    productCode VARCHAR,
    productColor VARCHAR
    )
    BEGIN
    DECLARE con INT;
    SELECT COUNT(1) INTO con FROM  yt_pro_productcolor WHERE proCode=productCode;
    IF con>0 THEN
    UPDATE yt_pro_productcolor SET proColor=productColor WHERE proCode=productCode;
    ELSE
    BEGIN
    DECLARE productid VARCHAR(20);
    SELECT id INTO @productid FROM yt_pro_productinfo WHERE proCode=productCode;
    INSERT INTO yt_pro_productcolor(proId,proCode,proColor)VALUES(productid,productCode,productColor);
    END;
    END IF;
    END
    存储过程不能创建,求高手解决:
      

  5.   

    估计是并发的问题  但是其他的两个接口没有出现这个问题  如果是并发问题的话 ,应该是整个系统的接口 都会出现上述bug
      

  6.   

    应该是并发,一般
    取值->锁表->判断、处理->写回修改的值->UNLOCK 表
      

  7.   

    或者说是 第一次请求没有执行完 第二次请求发过来后 修改了showadvice 使他也能进入 执行插入语句?
      

  8.   

    showAdvice是1个变量 ?建议还是在表中保存其值。
    通过锁表->替换值->UNLOAK 表来实现值的变化
      

  9.   

    这个问题我已经解决了  不关并发的事情  而是变量的问题 以前showadvice 作为成员变量 导致第二个请求发出的时候 又初始化了一遍   才导致执行了两次insert操作  不过还是要谢谢跟你的讨论