PHP解决大流量和高峰时间存储引起的库存负数问题。
我们知道,数据库处理SQL是一个处理过程,假设购买商品的过程是这样的:SQL1:查询商品库存
如果(库存编号> 0)
{
创建订单…
SQL2:库存- 1
}
在没有并发,这个过程似乎是那么的完美,假设两个订单和库存只有1,在SQL1相两个人查询到库存量>0,最后是SQL2实施,最后进入1库存,超售,或股票补偿,或其他用户的投诉。
解决这个问题是一个流行的想法。
1、使用额外的单进程处理队列,将订单请求放置在队列中,在逐一处理之后不会出现并发问题,但不会考虑额外的后台进程和延迟问题。
2。数据库乐观锁,首先检查库存,然后立即库存+ 1,然后订单生成,然后查询库存在更新库存之前,看看是否符合预期的库存数量,不一致的是回滚,促使用户缺乏库存。
三.根据更新的结果,我们可以添加一个判断条件更新(哪里)> 0时SQL2增加库存。如果我们返回false,我们将解释股票不足并回滚交易。
4、在文件独占锁的帮助下,在处理订单请求时,用文件夹锁定文件。如果锁故障指示正在处理其他订单,则等待或提示用户忙。
这篇文章是说第四个方案,一般代码如下:
阻塞(等待)模式
< PHP
$ FP = fopen(锁。txt
如果(羊群($ FP,lock_ex))
{
…处理订单
羊群($ FP,lock_un);
}
Fclose($ FP);
>
非阻塞模式
< PHP
$ FP = fopen(锁。txt
如果(羊群($ FP,lock_ex | lock_nb))
{
…处理订单
羊群($ FP,lock_un);
}
其他的
{
系统忙,请稍后再试。
}
Fclose($ FP);
>