数据重复添加&锁
2017-02-24 本文已影响0人
yeqingwen
需求:
H5小游戏使用微信公众号进行网页授权登录,同一个用户的openid只允许有一条记录
问题描述
- 查询数据库是此openid否存在
- 不存在则去微信获取用户信息
- 如果获取成功,则直接新建一个用户
按照这个样的流程,当同一个用户并发的请求时,由于从查询到新建,中间间隔了去微信服务器查询的时间,导致新建的那个时刻,数据库有可能已经创建了一条数据。
解决方案
- 查询数据库是此openid否存在
- 如果不存在,则直接新建一个用户, 并使用memcache加锁, memcache加锁的代码如下
$memcacke_key = 'new_user_oid_'.$openid;
if(!$user_info=User::model()->find('openid=:t_o', array(':t_o', array(':t_o'=>$openid))) {
if(!Yii::app()->memcache->get($memcacke_key)) {
Yii::app()->memcache->set($memcacke_key, 1, 60);
$user_info = new User;
...
$user_info->save(); //保存进数据库
}
}
- 不存在则去微信获取用户信息, 并更新用户的数据(昵称、头像等)