讨论数量:
先保证代码没 BUG 的情况下,你要会正确地使用数据库的事务。
- 前端页面上应该防止用户重复提交表单。
- 可以利用数据库的这种“主键唯一约束”特性,在插入数据的时候带上主键。
详细如下:生成一哥全局唯一的订单号。在用户进入创建订单的页面时,前端页面先调用这个生成订单号的方法得到一个订单号,在用户提交订单的时候,在创建订单的请求中带着这个订单号。这个订单号也是我们订单表的主键,这样,无论是用户手抖,还是各种情况导致的重试,这些重复请求中带的都是同一个订单号。订单服务在订单表中插入数据的时候,执行的这些重复 INSERT 语句中的主键,也都是同一个订单号。数据库的唯一约束就可以保证,只有一次 INSERT 语句是执行成功的。 如果是新增的同时(新增成功了)又手抖点了一下这时候变成更新了,那你同样只返回订单创建成功了就行了。
为了业务的正确性:
首先, 前端需要控制 不能 让用户连续点击 提交 按钮.
其次, 你的接口做成 幂等
的.
- 如果 这个业务正巧可以利用数据库唯一索引特性的话, 可以直接建一个唯一索引.
- 或者就如 Ali 所说的一样.
- 或者如果都用不上的话, 毕竟你的问题是防止网速过慢重复提交数据, 那么你就在你的业务代码里做检查. 提交过了就不允许提交.
推荐文章: