php insert into 多条,PHP如何避免高并发下insert into 重复入库

de647c02a396977619bd098b86c54b45.png

数据库:id   user_id   add_time

逻辑分析:用户每天进行分享或签到,得到积分,数据库通过以上字段进行记录,同一时间不可插入多条,一天只能有一条记录,插入前判断是否当天已插入过

问题点:用户连点、并发请求等会导致同时插入多条记录,导致积分异常

解决方案:使用文件锁,经过以下调整后,golang 30条并发测试只能插入一条。期间也想过用其他方法,比如add_time和user_id作为联合唯一索引。这样也能解决当下的问题,但有一个弊端就是批量插入数据的时候会有问题

$fileName = __DIR__ . "/temp/" . $user_id . "-" . date("Y-m-d") . ".txt";

$fp = fopen($fileName, "w+");

// 创建临时文件

if (!is_dir("temp")) {

@mkdir("temp", 0777);

}

// 当天的文件

if (!file_exists($fileName)) {

@file_put_contents($fileName, "");

}

// 使用非阻塞的文件排他锁,防止高并发插入多条数据

if (!flock($fp, LOCK_EX | LOCK_NB)) { //flock() 函数锁定或释放文件。

return false;

}

$sql = "INSERT INTO log ....";

$GLOBALS["db"]->query($sql);

flock($fp,LOCK_UN);//释放锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值