zoukankan      html  css  js  c++  java
  • 解决并发所带来的数据不一致性

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

  • 相关阅读:
    Thread
    投资
    DBLink
    sql
    列转行
    DataTable,DataView,DataRowView,DefaultView与DataSet
    Vue.js 基础学习之组件
    Vue.js 基础学习计算属性computed
    v-model的修饰符和使用
    Vue.js 基础学习 v-on 指令
  • 原文地址:https://www.cnblogs.com/smallbo/p/6582142.html
Copyright © 2011-2022 走看看