美文网首页
数据重复添加&锁

数据重复添加&锁

作者: yeqingwen | 来源:发表于2017-02-24 17:27 被阅读0次

需求:

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();    //保存进数据库
  }
}
  • 不存在则去微信获取用户信息, 并更新用户的数据(昵称、头像等)

相关文章

  • 数据重复添加&锁

    需求: H5小游戏使用微信公众号进行网页授权登录,同一个用户的openid只允许有一条记录 问题描述 查询数据库是...

  • mysql添加唯一索引的时候有重复数据

    场景 1.创建表,并插入数据,还原问题现场 2.查看添加数据 3.直接添加唯一索引 4.分组查看重复数据重复次数 ...

  • iOS collectionview的headerView的正确

    问题: collectionview 的header会重复添加。 collectionview 的header数据...

  • mongodb查找重复数据 allowDiskUse属性

    mongodb查找重复数据过大时需要添加 allowDiskUse属性

  • 基于Redis的SET和TTL机制实现分布式锁

    基于SETNX的锁,类似《Redis setNX 实现分布式锁(重复数据插入可用其来实现排他锁)》,在SETNX的...

  • java_行级锁

    悲观锁(行级锁):事务必须排队执行 数据按住了 不允许并发(行级锁:select后面添加for update) 乐...

  • Mysql基本操作(数据库操作)

    数据库操作(DDL) 不要重复创建数据库,如果重复创建,可以在语句中添加IF NOT EXISTS,但是会出现wa...

  • mysql 中的悲观锁和乐观锁

    悲观锁 mysql 数据库自带了锁机制,从某种意义来说“悲观锁”才能称之为锁,“乐观锁”是人为添加的概念。在我们的...

  • 共享锁 & 排它锁 & 意向锁

    共享锁:共享锁是读锁,是在执行读取操作的时候创建的。如果事务 T 对 数据 A 添加了共享锁,那么其他事务只能再对...

  • 分布式锁

    数据库实现分布式锁1.1 利用主键唯一规则:​ 数据库的唯一主键,不能重复。利用主键唯一规则,在争抢锁的时候...

网友评论

      本文标题:数据重复添加&锁

      本文链接:https://www.haomeiwen.com/subject/jklobttx.html