软件开发,create 操作,新增一行业务数据到数据库中,用户如果重复点击提交按钮就会导致数据库重复,各位大佬们有哪些解决方案呢?前后端、数据库、架构设计之类方案都可以分享一下
1
qping 2022-06-24 13:31:13 +08:00
百度:防止表单重复提交
|
2
seanzxx 2022-06-24 13:32:44 +08:00
数据库不是有主键和唯一键吗?
|
3
rabbbit 2022-06-24 13:40:32 +08:00
单独有个校验接口,用户输入时前端(节流 300s 一次)调这个接口校验值是否重复,重复则提醒用户。
后端提交时再校验一次。 |
4
aitaii 2022-06-24 13:43:55 +08:00
数据库兜底,前端,网关可以做校验,幂等操作
|
5
66beta 2022-06-24 13:44:36 +08:00
各做各的,后端是最后的防线
|
6
aitaii 2022-06-24 13:45:29 +08:00
|
7
rabbbit 2022-06-24 13:46:28 +08:00
问个问题,假如两个人分别在两地修改同一个条数据,后端分布式是如何解决这种数据可能不一致的问题的?
是只有一个数据库吗?还是多个数据库只有一个写,其他的读? |
8
wolfie 2022-06-24 13:46:49 +08:00
最简单前端 disable 控件。
后端弄就麻烦了。 |
9
hidemyself 2022-06-24 13:47:29 +08:00
@rabbbit 版本号
|
10
sanmaozhao 2022-06-24 13:48:00 +08:00
如果后端本身是允许两条完全一样的数据存在的话,比如用户正常操作两次,只是录入的数据相同
那这个事情就和后端没有关系了 前端提交按钮在结果没返回前进入 busy 状态就行 |
11
kyuuseiryuu 2022-06-24 13:55:54 +08:00 via iPhone 1
本质上还是怎么区分两条一模一样的数据是
“确实想造两条一样的数据”这个需求来的,还是“不小心重复请求”这个异常 一般创建接口就是创建。 为了用户不误操作就前端坐处理,创建成功后做好提示,展示成功页面。 后段不放心就做请求限制,重复请求拦截的时间限制不应该大于用户正常填写完表单的时间。 |
12
BugCry 2022-06-24 14:31:34 +08:00 via Android
关键词:幂等性、nonce 、timestamp
|
13
duanxianze 2022-06-24 15:52:12 +08:00
本质上还是先看你的需求,如果只是发微博这种,其实靠前端限制就行,后端设置个请求频次限制,如果是银行交易,那就复杂了,没搞过,不多说了
|
15
cvbnt 2022-06-24 19:23:46 +08:00 via Android
redis 做幂等性提交,大致是 6 楼的过程,在删除的过程中为了保证事务,推荐用 lua 脚本删除,比如
if redis.call("get",KEYS[1])==ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end 如果 redis 环境是集群,可能需要对键值做额外设置 |
16
nigulasida 2022-06-24 23:02:04 +08:00
pg 可以 insert-up
|
17
EscYezi 2022-06-25 02:02:17 +08:00 via iPhone
前端点击后加 loading ,后端每次请求开始加个单个用户级别 redis 锁,请求结束释放(或者结束一秒后过期)。一次请求期间如果同一个用户再次发起请求直接返回操作频繁,基本上可以避免重复提交。也可以做成用户&接口粒度的。
|
18
sunnysab 2022-06-25 08:41:07 +08:00
@nigulasida insert-up 是 insert update 吗?
|