mysql高并发场景下重复插入如何保证唯一性?
发布于 8 年前 作者 PerterPon 7430 次浏览 来自 问答

具体的场景是这样的:我们接了别人的oauth登陆,然后登陆的时候根据cookie去用户中心拿用户,拿到用户之后,去数据库里面查,如果不存在这个用户(新用户),就落一份在我们自己的库里面,用户中心拿到的数据有一个标示用户唯一的一个id,问题来了,之前这张表没有做物理删除,用的是逻辑删除,就是加了一个字段,标识这条记录是否被删除了,所以用户唯一ID在某一列里面也不会是唯一,也就没法加唯一索引,和删除字段也没有做复合唯一索引,因为可以重复删除,在高并发的时候,新用户的两个请求同时进来,select的时候发现没有这条数据,然后就重复插入了,因为所有登陆请求都需要查询数据库,所以这里select的时候也没法锁表,目前代码多进程,多机器,也没法在内存里面做唯一,请教各位这个情况下该如何保证唯一性?

目前我自己有两个解法,一个是新增一张表,增加一列唯一索引,就是那个唯一的用户ID,然后每次插入正式表前先插这张表,如果插成功了,那说明是第一次,如果插失败了,说明已经插入,不过感觉就是有点重。

还有一种办法,就是在每次登陆时候查询,如果发现有两条重复记录,就把其中一条删除,不过这种办法是问题先发生了,然后再去解决,感觉挺奇怪的,现在两种办法都没能很好地解决问题,求救。

回到顶部