最近在整理关支付安全的内容,其中就是涉及到了一个在支付过程中的条件竞争问题。以下都是基于mysql的与php的架构来描述该问题,大佬勿喷。
0x01. 条件竞争
什么是条件竞争:
竞争条件 发生在多个线程同时访问同一个共享代码、变量、文件等没有进行锁操作或者同步操作的场景中。【Wikipedia-computer_science】
一个简单的购买的业务:
后台代码实现如下:
以上是一个购买商品的流程,看似并没有什么问题。
如果每次请求都是一个单线程的请求是没有什么问题的,但是如果采用多线程的并发请求就会出现问题。
因为每次的购买流程都是需要一定的时间去按照购买的流程执行,如果我们在第一次购买的流程3还没有结束时,就再去执行这一遍流程时,那么在第流程2时查询用户的余额就还是初始的余额,这是因为第一次购买的流程3还没有结束,没有结束也就意味着余额没有扣除,所以金额就是初始的值。
在上面的百年青花瓷购买的案例中,如果我们只有1000块钱,但是我们在多线程的情况下去购买青花瓷的时候就可能购买到10件以上的数目。
0x02. 实际测试
在数据库查看用户数据