$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 完全相同的求解
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 完全相同的求解
这里已经锁上了。
还有添加之前我查询了一遍 yyy 表 是否存在该用户相关信息。应该下是不会产生两条的才对。
现在有时候会产生两条。
求大神讲讲原理。
我编写的是API接口,我本地测试请求多少次 都不会在 yyy 表产生 两条同样的记录的。
不清楚APP那边是怎么请求的,有时候就会产生 上面我提出的疑问
如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。
如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。xxx 表和 yyy表 都是innodb引擎。
现在需要怎么判断它,限制不能添加同一条信息
如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。xxx 表和 yyy表 都是innodb引擎。
现在需要怎么判断它,限制不能添加同一条信息 首先你需要查下你是不是重复提交了;另外如果你想保证yyy表中的user_id 记录唯一,为什么不加一个唯一索引呢?
如果用的是mysql的innodb引擎,锁包括排它锁和共享锁;insert 默认操作默认都会加排它锁的,所以你这样加锁,没什么意义,很有可能是重复提交了。xxx 表和 yyy表 都是innodb引擎。
现在需要怎么判断它,限制不能添加同一条信息 首先你需要查下你是不是重复提交了;另外如果你想保证yyy表中的user_id 记录唯一,为什么不加一个唯一索引呢?要是加索引是能解决问题的。
上面求助 出现的bug,正常提交是没问题的,就算重复提交7.8次都没问题(有丢丢时间间隔)。
我在想是不是同时请求两次才会发生
如果用的是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();
这个操作,你加的是什么锁呢?