
最近处理一个企业后台时遇到一个问题:用户点击"提交"以后,因为网络有点慢,连续点了两三次按钮,结果数据库里生成了多条完全一样的记录。前端虽然已经做了按钮禁用,但只要请求重试、页面卡顿或者用户换个入口再次提交,还是可能出现重复数据。
后来继续排查发现,单纯依赖前端并不可靠。真正防重复提交,还是要在服务端做限制。
这个项目最后用了业务唯一标识来处理。前端每次发起提交时都会带一个唯一请求号,PHP 接口收到后先判断这个请求号是否已经处理过。如果已经存在,就直接返回上一次结果,不再重新写数据库。数据库层再给关键业务字段增加唯一约束,作为最后一道保险。
对于订单、表单线索、支付回调、佣金记录这类重要业务,我一般不会只写一段"先查询再插入"的逻辑。因为并发情况下,两个请求可能同时查到数据不存在,然后一起执行插入,最后还是会重复。
所以现在做接口时,我会把重复提交当成正常场景提前考虑,而不是等数据出问题以后再人工删除。前端防误点、接口幂等、数据库唯一约束三层一起做,系统会稳定很多。
#PHP开发 #接口开发 #重复提交 #后台系统