在开发过程中,业务逻辑相插入一条数据,但是在有些情况下,会导致数据重复插入多条数据,例如:1,用户重复点击提交按钮导致多个请求插入多条数据(业务只希望插入一条数据)。2,用户提交后,重复刷新浏览器导致同一个提交请求发生多次,插入多条数据。3,用户在浏览器中回退的时候,到提交页面,会重逢提交数据等,很多种情况可能导致插入多条数据问题。那么如何解决呢?
如何解决用户重复提交等情况导致重复插入的问题?
前端控制:前端可以在用户第一次提交之后,将提交按钮置灰,让用户不能重复点击提交,这样可以通过前端排除用户在一个页面多次提交导致多个提交请求,但是前端的控制并不能做到最终的防止多次提交的问题,因为其他场景,如用接口工具调用后端的提交接口,这样也会导致重复提交的问题。
后端控制:前端控制并不可以完全避免后端的重复插入问题,所以要想最终避免重复插入问题,后端必需也要做控制。
-
数据中存在唯一性约束字段或者组合唯一性约束字段
如果插入的参数中有在表中的业务唯一性字段(如用户名或者身份证号等),可以在创建表的时候,在这些字段中加唯一性约束,这样当有多个插入请求的时候,只有一个请求会成功,这样就可以利用数据库的约束性,从根本上解决冲入插入的问题,当然,如果这些业务字段中没有也为唯一性字段,可以看看有没有组合唯一性约束字段(即在插入的字段中有两个或者两个以上的字段组合在一起在表中是唯一的,这样可以在数据库中添加组合唯一性索引)。 -
结合第三方工具利用全局唯一性字段
常用的是第三方缓冲工具如redis等缓冲工具,这里用第三方而没有用容器中的session,因为session在负载的时候,也行不能保证同一个用户的请求,落在同一个容器中,这样session验证就会失效,这是使用第三的原因,所有实例都从第三方获取验证信息,这样就可以避免上述的session问题。
如何避免为代码如下
1,利用全局唯一性(如token)字段,这个字段可以唯一性确定是同一个人,去redis中查询存不存在。
2,如果存在,说明改用户已经完成一次提交,提示用户不能重复提交,文案可以根据自己的业务场景去描述。如果不存在,在redis中set一个值,key可以是这个唯一性字段,或者接口名称+唯一性字段。根据业务需求也可以给当前key设置一个失效时间,时间可以是这个接口的平均响应时间,然后进行数据库操作,插入数据。
3,如果插入成功,用户不能插入新的数据,如果插入不成功再将上面的key删除,不过如果不是数据问题,一般都会成功插入数据库。
通过上述两种方式,基本可以解决重复插入的问题,如果有好的方案,请赐教,😄
网友评论