mysql高并发场景下重复插入如何保证唯一性

mysql高并发场景下重复插入如何保证唯一性

有家公司的题:

1.用户通过手机号进行注册,手机号仅允许注册一次,
需求如下:
        - 账户的注销采用软删除进行
        - 注销的数据对于应用来说是不存在的,应用不允许对其有任何修改
        - 注销的账户后允许再次注册

软删除也就逻辑删除,大概就是下面这个亚子。

image-20210521095310448

这种题其实就是问的高并发场景下重复插入。

在高并发的时候,用户的两个请求同时进来,select的时候发现没有这条数据或者说没有发现状态为使用中的数据,就会重复插入了。

我一开始的想法是将phone设为唯一索引,但是这样注销后就不能再注册了。

想过用for update,但是要是查询时数据都不存在,没法加锁。

百度了下解决重复插入,有这些方法:插入时用replace into(则先删除此行数据,然后插入新的数据。 2. 否则,直接插入新数据。),或者ignore(当出现主键或唯一索引重复之后,插入会失败,但不会报错,会忽略此次插入),都不符合题意。

找到一个讨论此题的连接:https://www.zhihu.com/question/39952269

但在数据库层面我是想不出太好的想法了,能想到的最优解是在业务层面。

使用分布式锁,将phone作为key,并设置一个较短的存活时间。这样第二条请求进来时查询就可以查得到了。

另外发现有一篇文章在数据库层面讲的很详细,可以参考:
https://blog.csdn.net/runhua/article/details/100058042
不过感觉还是分布式锁最好。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值