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
不过感觉还是分布式锁最好。

你可能感兴趣的:(数据库)