Loading

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

  测试前提,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保持一致,测试成功!!

 

posted @ 2017-03-19 20:41  小博。  阅读(1684)  评论(0编辑  收藏  举报