insert幂等

insert幂等

使用token 建立分布式锁    当用户点击多次注册的时候  没有拿到锁的用户会等待获取锁啊  最后还会插入多次注册的用户啊。

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
Java架构师讲师团 2020-02-23 20:50:24

boolean isLock = lock.acquire(30, TimeUnit.SECONDS);

这里是互斥的,只有一个线程可以得到锁,其他的线程的isLock是等于false的。在这里可以加个日志,把isLock 打印出来就方便观察了。

这里如果使用其他的锁,在这里等待,是会有你说的这个问题的。


  • hehehei #1
    这里好像有点问题,InterProcessMutex创建的锁一直没释放,所以才没有重复插入的问题。正常情况锁用完应该要释放吧,释放之后重复线程就用可能会再次插入成功。 所以acquire(30, TimeUnit.SECONDS)会阻塞30秒,时间设置成0秒,非阻塞比较好吧。 我觉得比较好的做法在判断token是否存在的时候应该把token删了,而且判断删除token的操作在加锁后面,这样才能保证不重复插入。
    2020-04-17 05:04:02
  • 建议看看csrf吧,csrf如果能够防住,这些幂等就都解决了
    2020-04-17 07:44:10
  • @hehehei 我同意你的看法。课程中老师给出的应该是一个示例。 token在校验后没有存在的价值,肯定是要删除的,程序中要加锁的就是判断token存在和删除token这两步,我考虑是不是应该这样: 1. 获取token锁 2. 判断token是否存在,如果不存在的话,解锁走人 3. 删除token,执行任务 4. 解锁 如果考虑加锁有代价,可以在流程前再加一个token存在性的判断。
    2020-04-17 14:12:03
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师