并发问题---逻辑混乱

我们总有这样赢体验,在线下调试都正常, 怎么上线了。总有这样,或那样的bug。究其原因是环境不同,线上环境比线下环境复杂。 而很多公司往往不重视测试环节或者测试环节时间太少。 导致很多问题在线下环节发现不了。一上线就出了这样或那样的问题。

 Bug这个东西从概率来说 ,分三种。 一种是100%出现的,一种是非100%出现的,但还是比较容易出现,还有一种是低概率的。 100%复现的bug,对于程序员来说比较好解决。 剩下两种出现的bug,对没有经验的程序员来说是一个坎。 根据我个人检验, 剩余两个bug出现的原因很大的可能是没有处理好并发。低概率的bug,一般要高并发才有机会出现。 推荐一个工具http_load.  这个工具可以模拟高并发。

什么是并发? 现在的操作系统大多都是多任务操作系统。多任务的意思,在宏观上看就是多个进程同时运行。 从微观上看,每个进程运行一定的时间片,然后就让出CPU.   这里有一个关键,进程将随机的让出CPU.

PHP是一门解析的性的语言。 服务器接受到http的url后,发现是PHP文件就调用PHP解析器,去解析PHP文件。 关键点: PHP解析的过程会被CPU随机打乱,

我们想一下O2O购物中一个经典案例。 购买商品。

1.   前端发送POST/GET请求到后端。

2.   后端从数据库读取商品数量,当前商品数量大于1,客户可以进入支付。

3.   支付完成,当前商品数量减1,写入数据库。

一个购买就完成了。

并发来了:

A用户发起请求,执行到第2步的时候,被中断。

B用户又发起请求,他运气好,直接购买成功,执行完了3步骤

C. 这个时候A用户回来执行第3步骤。 如果商品还有剩余没有问题,关键是如果在A,B抢购的时候只有一个商品呢?B已经购买完成了,A还可以买什么?

 

如何解决这个问题呢? 其实这个问题很好解决。步骤  1.加一个锁。 当A用户操作商品所在的表时候,B就不能再操作这个表了。2.  使用事务机制。

 

     做一个总结: 并发问题的根本原因是,共享的资源被访问的时候,顺便被随机更改。 这里的共享资源不限于数据库,比如memcached, redis,文件.也是共享资源。

解决方法:

1.     使用锁。 锁的本质含义是我访问这个资源,别的进程只有我使用完了以后才可以用。

2.     使用原子性操作。    Redis的INCR,DECR 据说是原子性的。这个时候就不需要在加锁了。这个可以安全使用。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值