$userid = 1;
        if ($_POST['id'] == $userid) {
            $objxxx = new xxxModel();
            $mixxxx = $objxxx->where(['id'=>$userid])->lock(true)->find();
            
            $objyyy = new yyyModel();
            $mixyyy = $objyyy->where(['user_id'=>$userid])->find();
            if (empty($mixyyy)) {
                $addyyy = [
                    'user_id' => $userid,
                    'create_time' => time()
                ];
                $objyyy->add($addyyy);
            }                
        }有时候会突然产生两条 yyy表记录 create_time跟user_id 完全相同的求解

解决方案 »

  1.   

     $mixxxx = $objxxx->where(['id'=>$userid])->lock(true)->find();
      

  2.   

     $mixxxx = $objxxx->where(['id'=>$userid])->lock(true)->find();
    这里已经锁上了。 
    还有添加之前我查询了一遍 yyy 表 是否存在该用户相关信息。应该下是不会产生两条的才对。
    现在有时候会产生两条。
    求大神讲讲原理。
      

  3.   


    我编写的是API接口,我本地测试请求多少次 都不会在 yyy 表产生 两条同样的记录的。
    不清楚APP那边是怎么请求的,有时候就会产生 上面我提出的疑问
      

  4.   

    直接把 $_REQUEST 写日志,你就知道 app 调用了几次了。
      

  5.   

    你这样的写法没什么用,mysql 的插入锁是自动的,和你程序没啥关系,只有更新记录才有锁表的说法。所谓插入两条记录,要么运行重复了,肯定是运行过程重复了。
      

  6.   


    如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。
      

  7.   


    如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。xxx 表和 yyy表 都是innodb引擎。 
    现在需要怎么判断它,限制不能添加同一条信息 
      

  8.   


    如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。xxx 表和 yyy表 都是innodb引擎。 
    现在需要怎么判断它,限制不能添加同一条信息 首先你需要查下你是不是重复提交了;另外如果你想保证yyy表中的user_id 记录唯一,为什么不加一个唯一索引呢?
      

  9.   


    如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。xxx 表和 yyy表 都是innodb引擎。 
    现在需要怎么判断它,限制不能添加同一条信息 首先你需要查下你是不是重复提交了;另外如果你想保证yyy表中的user_id 记录唯一,为什么不加一个唯一索引呢?要是加索引是能解决问题的。
    上面求助 出现的bug,正常提交是没问题的,就算重复提交7.8次都没问题(有丢丢时间间隔)。
    我在想是不是同时请求两次才会发生
      

  10.   


    如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。xxx 表和 yyy表 都是innodb引擎。 
    现在需要怎么判断它,限制不能添加同一条信息 首先你需要查下你是不是重复提交了;另外如果你想保证yyy表中的user_id 记录唯一,为什么不加一个唯一索引呢?要是加索引是能解决问题的。
    上面求助 出现的bug,正常提交是没问题的,就算重复提交7.8次都没问题(有丢丢时间间隔)。
    我在想是不是同时请求两次才会发生我觉得如果同时(同一秒)提交两次,你这个表应该是会产生两条相同的记录的。我不太理解为神马你会觉得锁xxx表,yyy表不可能产生相同的记录呢。
    $objxxx = new xxxModel();
    $mixxxx = $objxxx->where(['id'=>$userid])->lock(true)->find();
    这个操作,你加的是什么锁呢?
      

  11.   

    可以在插入成功前后写log,看看是否请求了两次。