电商商城如何避免重复订单
由于用户提交订单后,用户同时又可以再下相同的一单,这类不算为重复提交。规避的是一份订单重复提交两次。
思路1:
创建订单服务保证其幂等性。后端添加订单号服务,在用户订单页面返回给页面唯一的订单号,在提交订单时传向后端订单号,
同时数据库中订单表的订单号字段设置为唯一索引,若已提交,则抛出异常,从而避免的同一订单提交两次。
思路1改进:
订单号放在订单页面,如果用户恶意篡改,也会发生重复提交。
这时,我们可以将生成的订单后同时放在redis一份,当请求进来时,校验订单号是否存在于redis,存在则提交,不存在则为不做处理。(redis分布式锁)
错误思路:
提交前,查询当前订单是否存在过。但是如何区分出是否是同一个订单呢?倘若其他业务,我们可以区分出是否为同一个业务,
先查询再根据查询结果来判断是否重复,这样还会有一个问题:查询和后续的插入操作不是原子性的,在数据库发生脏读的情况下,
即使查询出未有提交,在并发的情况下,也会重复提交。
即使使用唯一订单号,也需要在订单表中设置自增主键。当使用订单号做主键时,由于订单号是不规则的,当数据量大时会产生页分裂,从而产生性能问题
Don’t hurry say have no choice, perhaps, next intersection will meet hope.