多年 CURD ,菜鸡全栈。
以前都写百十来人用的内部系统。
最近上了一个稍微有点并发的项目
发现用户注册即使后端验证了手机号是否已存在,还是一个手机注册了 N 条记录哈。
前端加了防抖,后端弄了 DB 事务,似乎没再发生。
经验丰富的小哥们,一般是怎么避免这种情况发生的。
前端所有提交按钮都加防抖? 后端做事务? 还有什么锁之类的,完全没用过。
展开说说?
![]() | 1 baobao1270 2024-07-04 11:42:30 +08:00 via Android csrf 应该可以吧 |
![]() | 2 dapang1221 2024-07-04 11:44:57 +08:00 唯一键 |
![]() | 3 fcten 2024-07-04 11:50:29 +08:00 并发不高靠数据库事务就够了。前端只影响用户体验,不可能依赖前端去保证数据一致性。 并发高再考虑分布式锁,因为数据库难以水平扩展。 |
4 fruitmonster 2024-07-04 11:53:56 +08:00 数据库唯一,给它咔咔报错!实在不行缓存验证、数据库验证 |
![]() | 5 spicy777 2024-07-04 12:30:55 +08:00 via iPhone 接口做幂等 |
6 nullxx 2024-07-04 13:24:52 +08:00 新增前加锁查询是否已存在 就是会慢 |
![]() | 7 swulling 2024-07-04 13:29:25 +08:00 数据库事务难道不是必选么。 回到你这个场景,唯一也可以。 |
![]() | 8 Features 2024-07-04 13:33:47 +08:00 1.锁 2.请求队列化 3.unique key |
![]() | 9 wqhui 2024-07-04 13:35:52 +08:00 查询存不存在+注册入库加锁,多节点的话要用分布式锁 |
10 LuckyLauncher 2024-07-04 13:40:46 +08:00 首先你提交按钮不加加载状态的?要是你接口慢一点用户还觉得没点到,那不就多点几次? |
![]() | 11 dumbass 2024-07-04 13:53:42 +08:00 前端按钮加 loading ,弹窗提交容易多次点击的弹窗关闭之后再把 loading 设置 false |
![]() | 12 potatowish 2024-07-04 13:54:39 +08:00 via iPhone INSERT INTO SELECT ... WHERE NOT EXISTS ... Affected Rows: 成功 1 失败 0 |
13 Yukineko 2024-07-04 14:01:57 +08:00 数据库 unique key 都没有的吗.. |
![]() | 14 Vegetable 2024-07-04 14:03:38 +08:00 手机号唯一索引这么朴素的方案,是因为什么排除的呢 |
![]() | 15 nxforce 2024-07-04 14:41:29 +08:00 不用多想,就是菜。。。 |
![]() | 16 tlerbao OP @joyhub2140 我不是自己认识到了吗?能说点有营养的吗? |