How to deal with high concurrency in php

(*-*)浩
Release: 2023-02-23 22:46:01
Original
2627 people have browsed it

Data security under high concurrency

We know that when multiple threads write to the same file, "thread safety" problems will occur (multiple threads run the same segment at the same time The code is thread-safe if the result of each run is the same as that of a single-thread run, and the results are the same as expected).

How to deal with high concurrency in php

If it is a MySQL database, you can use its own lock mechanism to solve the problem. However, in large-scale concurrency scenarios, MySQL is not recommended. In flash sales and rush sales scenarios, the most critical issue is "over-issuance". If this aspect is not controlled carefully, it will lead to the problem that the actual orders generated are more than the pre-sale products.

Reason for over-posting:(Recommended learning:PHP programming from entry to proficiency)

Assume that in a certain rush-buying scenario, we only have 100 products, at the last moment, we have consumed 99 products, leaving only the last one. At this time, the system sent multiple concurrent requests. The product balances read in these requests were all 1, and then all passed the balance judgment, eventually leading to over-issuance.

It is worth noting: Remember to set the inventory field number field to unsigned. When the inventory is 0, because the unsigned field cannot be a negative number, false will be returned

Optimization plan

Optimization 1: Use MySQL transactions to lock the rows of operations BEGIN ; SELECT ... FOR UPDATE ; COMMIT ; ROLLBACK

fetch_assoc(); if($row['number']>0){ //生成订单 $order_sn=build_order_no(); $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; $order_rs=mysqli_query($conn,$sql); //库存减少 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'"; $store_rs=mysqli_query($conn,$sql); if($store_rs){ echo '库存减少成功'; insertLog('库存减少成功'); mysqli_query($conn,"COMMIT");//事务提交即解锁 }else{ echo '库存减少失败'; insertLog('库存减少失败'); } }else{ echo '库存不够'; insertLog('库存不够'); mysqli_query($conn,"ROLLBACK"); }
Copy after login

Optimization 2: File lock ideas

For applications where the number of daily visits is not high or the number of concurrency is not very large, there is no problem using general file operation methods. But if the concurrency is high, when we read and write files, it is very likely that multiple processes will operate on the next file. If the access to the file is not monopolized accordingly, data loss will easily occur.

fetch_assoc(); if($row['number']>0){//库存是否大于0 //模拟下单操作 $order_sn=build_order_no(); $sql="insert into ih_order(order_sn,user_id,goods_id,sku_id,price) values('$order_sn','$user_id','$goods_id','$sku_id','$price')"; $order_rs = mysqli_query($conn,$sql); //库存减少 $sql="update ih_store set number=number-{$number} where sku_id='$sku_id'"; $store_rs = mysqli_query($conn,$sql); if($store_rs){ echo '库存减少成功'; insertLog('库存减少成功'); flock($fp,LOCK_UN);//释放锁 }else{ echo '库存减少失败'; insertLog('库存减少失败'); } }else{ echo '库存不够'; insertLog('库存不够'); } fclose($fp);
Copy after login

The above is the detailed content of How to deal with high concurrency in php. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
php
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!