解决并发所带来的数据不一致性

  测试前提,linux服务器 ,因为windows服务器下 nginx + php是fashcgi方式,默认是单进程单线程的,所有的并发请求都要排队处理,所以在windows服务器下测试时没有任何效果的。

  首先上一段代码:

  

  这段代码的逻辑很简单,类似于商品库存一样,stock为库存,count为购买数量,每购买一次 count + 1,生成一个随机的txt文件,因为是模拟,那么这里我们就把txt文件模拟为订单吧,每购买一次,生成一个新的订单。这个程序正常情况下count数会和生成的txt文件的数量是一致的,而且订单数也不会超过库存数,因为这里有判断条件,当count等于stock的时候程序就退出了,也不会有新的订单生成。但是有一种情况会导致出现订单数大于库存数, 那就是 - - - - - - 并发。

  

  接下来先模拟一波非并发的情况。

  1.设置count数为0

  

  2.设置订单数为空

  

   3.用Apache ab测试模拟100次请求。

  

  

  

 

  

   如上图所示,请求执行完后,count数为10个,订单数为10个,订单数是和count数保持一致的。

 

  接下来把log文件夹再次清空,同时把count改为0,测试一下100次请求,10次并发下的结果。

  

  

  

  

  可能压力测试模拟并发的时候会有丢包,或者随机数出现相同的了,但是可以看出在并发条件下,txt文件为15个,count数为10,订单数和count数已经不一致了。

  

  解决方法一: 加文件锁,在多个进程对同一个文件进行独占锁定操作,发生阻塞时记录错误日志,并退出程序

  

  接下来再模拟 100次请求10次并发结果如下

  

  

  

  

  

  如上图所示,最终生成的txt文件和count保持一致,测试成功!!

 

转载于:https://www.cnblogs.com/smallbo/p/6582142.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值