单用户功能中的并发设计问题

在php这种多进程环境中,有这样一种需求。
网站设计了一个签到功能,只要签到就送给用户现金,一个用户只能参与一次。
具体的流程是当用户点击签到按钮的时候检查签到表里面是否有签到记录,如没有则往签到表里面插入一条记录,并做出赠送操作。

function send_to(){
   if(!$dao->find()){      //并发线程出问题
       $dao->insert();
       $dao->send_money();
   }
}

这里在并发环境下,就会遇到多个线程检查签到表里 都没有签到记录,所以会出现多个加入记录,多个赠送动作。
解决办法有以下几种:
1.严格的事务
2.锁表
3.设计签到表时用数据库的唯一性约束

4. 前端加验证码
5. 前端加隐藏字段(token机制)
方法1:三种之中代价最高的。
方法2:这种多线程情况主要是针对一个用户使用中出现的,锁表会影响到其他用户,代价也太高
方法3:三者中最好的设计,不过有些需求 比如说用户签到2次才会赠送,这个时候就不能设计为唯一约束

方法4,5:都是通过前端避免单用户发生并发行为(但这种机制都依赖session由于php的session一样存在并发问题,所以,并不是严格意义上好的解决办法,验证码的用户体验也不好)
ps:虽说这种行为出现的概率很低,但是确实系统实现中不可避免的一个问题。不知道大家都是怎么解决的。

你可能感兴趣的:(PHP)