1.公司要实现一个业务逻辑:一天一个手机号码phone只能提交一次订单。
目前这个业务逻辑不涉及高并发等场景,大概也就是十几秒钟一次订单;
2.在编写了简单的表单验证之后,使用laravel5.4
3.在本地经过简单的表单测试后一切正常上线;
4.问题出现在数据库会在某种情况下出现数据重复录入,但前台js已经做好了重复提交等功能,而且就算是重复提交了,这时候第二次请求应该会被return;
5.经尝试不管laravel做任何去重,在同时两个页面提交的情况下,都有可能重复
解决方法:
可以从数据库的设计方面进行调整
根据业务逻辑,可以将多字段建立联合唯一 索引 ,避免重复
ALTER TABLE `yuns` ADD UNIQUE(`aid`, `code`, `phone`);
aid:活动id,code:商品编码,phone:手机号
如果添加联合唯一索引,需要将之前重复数据删除,
首先获取重复数据
SELECT *, COUNT(*) FROM yuns GROUP BY aid, phone, code HAVING COUNT(*) > 1;
获取成功后可通过laravel将重复数据删除。
之后在添加重复数据时会报错:

最好获取mysql异常,是程序正常运行
use Illuminate\Database\QueryException;
try {
\DB::table('yuns')->insert($yuns);
} catch (QueryException $e) {
echo "插入错误: " ;
}