Java 后台防重复提交一般怎么做的?

2020-06-11 11:33:55 +08:00
 luxinfl

我们现阶段就是加了一个张表,订单号唯一主键。请求过来的时候会校验数据库有没有这条单号数据,这个方法是非事务的。还有没有什么其他好的方法了。

我在想要不要放在 redis 里面。。求大佬指教啊

12306 次点击
所在节点    Java
74 条回复
wysnylc
2020-06-11 12:13:59 +08:00
这就是幂等
gz911122
2020-06-11 12:16:40 +08:00
订单号唯一主键不就天然防重复了...
shenlanAZ
2020-06-11 12:25:49 +08:00
前端:
锁住按钮 等请求返回之后再对按钮解锁。

后端:
差不多也是用锁的思路 无非就是锁的粒度,可以锁业务,也可以锁订单。看业务需求。
beryl
2020-06-11 12:26:39 +08:00
关键词:防重入
luckyrayyy
2020-06-11 12:27:32 +08:00
主键的话你插入不进去啊。
tabris17
2020-06-11 12:27:50 +08:00
每次提交都包含一个业务 ID,重复 ID 的请求丢弃
oneisall8955
2020-06-11 13:14:48 +08:00
摘抄网上的幂等解决办法
1.实现幂等性常见的方式有:悲观锁( for update )、乐观锁、唯一约束
2.几种方式,按照最优排序:乐观锁 > 唯一约束 > 悲观锁
hantsy
2020-06-11 13:20:52 +08:00
cxrf 。。。设置 Http Header,或者 Http Form 。


传统框架大部分自带 Form 重复提交了。
lhx2008
2020-06-11 13:22:52 +08:00
最简单的方法可以依赖数据库的唯一键,复杂一点就是请求带 token+redis 黑名单
hantsy
2020-06-11 13:24:17 +08:00
修正:cxrf --> csrf 或者叫 xsrf
jinzhongyuan
2020-06-11 13:24:43 +08:00
@gz911122 楼主的意思应该是,指定时间内方法参数一样的请求无法进入方法或者 controller
luxinfl
2020-06-11 13:42:07 +08:00
@jinzhongyuan 不是不是,我就是说两笔相同参数同时提交的问题。。有时候会碰到前台没做防重点按钮点了好多次。
luxinfl
2020-06-11 13:46:00 +08:00
@lhx2008 放在 redis 是不是快一点。因为他这个重复提交也就那么一小会,人手动点的。。感觉用不到数据库
gz911122
2020-06-11 13:50:04 +08:00
@luxinfl
那你都加了唯一索引了 点 100 次又何妨
doudouwu
2020-06-11 13:59:30 +08:00
#14 @ gz911122 唯一索引的是订单号,提交的是不包含的订单号,待生成订单号的数据呢
楼主说的场景很可能存在
kanepan19
2020-06-11 14:03:54 +08:00
csrf +1
gz911122
2020-06-11 14:07:25 +08:00
@doudouwu
订单号肯定是预先生成好的...
会有生成器之类的负责,

而且他说了是相同参数.
dayformyjob
2020-06-11 14:08:07 +08:00
threadlocal + 信号量 重入锁,每个线程只能提交一次----单机版情况。
分布式 多机器,就引入中间件--redis 或者 jms 之类的
royan
2020-06-11 14:12:15 +08:00
csrf+1
kiracyan
2020-06-11 14:12:17 +08:00
预先生成 token 然后设置过期时间 提交成功后删除 不存在的不让提交

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/680607

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX