关于多次网络请求并发导致数据库数据重复的问题

背景:近日发现后台服务器有个问题,用户存在重复注册的问题,由于使用第三方账户的授权和登录,有的用户会在网络不好的情况下,多次点击登录授权,因此会造成多次访问提交。采用先向服务器发送ajax网络请求,检查是否有重复注册账户,通过返回的值判定,是登录还是注册;由于手机会因为网络或者内存的问题,导致页面卡顿、缓慢,用户多次点击发送请求,因此会发生多次创建账户的问题。
目的:1、清除数据库中重复的数据;2、采用标识符防止多次访问
补充,对于同一个账户情况下,收藏者多次收藏同一个数据问题,需要使用多个条件的分组条件
select * from `r_tab_memberfavorite` group by openid,content_id having count(*)>1;
此时,显示出来的默认是id编号较小的哪一个数据,删除的时候可以直接使用。
【关于多次网络请求并发导致数据库数据重复的问题】解决方法:
1、首先要查询出那些用户重复注册
mysql的语法两种查询方式
[1]、利用表名称先查询全部的表结果作为一个别名,然后利用原表中查询的唯一建和别名的唯一建进行匹配,返回结果,排序显示(也可以不排序),该方法相对比较慢
select * from `r_tab_member` a where ((select count(*) where openid=a.openid)>1) order by desc;
[2]、使用group by 语句+having +聚合函数对结果进行过滤得到重复的关键字的数据分组,然后查询出所有的结果
select * from `r_tab_member` where openid in (select openid from `r_tab_member` group by openid having count(openid)>1;
[3]、删除重复的数据,只保留一条
delete from `r_tab_member` where openid in (select openid from `r_tab_member` group by openid having count(openid>1)) and id not in (select min(id) from `r_tab_member` group by openid having count (openid)>1);
2、可以在客户端进行约束,也可以在服务端进行约束
客户端相对容易,只需要在用户点击授权后对该方法进行标识位的锁定,等到服务器返回结果,方法执行完毕,解锁,方能够进行二次操作。
服务端没有测试,思路:将检查重复的方法和创建用户的方法合二为一,再进行相应的数据库操作线程锁定,保证只有一个线程能成功的创建数据,其他的只能失败。

    推荐阅读