The concurrency control strategy in the PHP flash sale system requires specific code examples
With the rapid development of the Internet and e-commerce, flash sale activities have become a major platform to attract users One of the important means. However, high concurrent access to flash sales activities is a big challenge, because in flash sales activities, the number of products is limited, but there are many users participating in the rush purchase. If the amount of concurrency is too large, the system may easily crash, causing users to be unable to participate in activities smoothly. In this case, how to control concurrency and ensure the stable operation of the system has become a core technology of the PHP flash killing system.
In the PHP flash sale system, common concurrency control strategies can be divided into two types: one is a database-based pessimistic lock, concurrency control strategy; the other is a cache-based optimistic lock, concurrency control strategy.
<?php $db = new PDO('mysql:host=localhost;dbname=test', 'root', ''); // 开始事务 $db->beginTransaction(); try { $stmt = $db->prepare('SELECT * FROM goods WHERE id = 1 FOR UPDATE'); $stmt->execute(); $result = $stmt->fetch(PDO::FETCH_ASSOC); if ($result['stock'] > 0) { $stmt = $db->prepare('UPDATE goods SET stock = stock - 1 WHERE id = 1'); $stmt->execute(); // 提交事务 $db->commit(); echo '秒杀成功!'; } else { echo '商品已售罄!'; } } catch (Exception $e) { // 回滚事务 $db->rollBack(); echo '秒杀失败!'; } ?>
In the above code, the SELECT...FOR UPDATE
statement is used to lock and query product inventory. If the inventory is greater than 0, perform the inventory reduction operation and submit the transaction. Otherwise, the transaction is rolled back, indicating that the flash sale failed.
<?php $redis = new Redis(); $redis->connect('localhost', 6379); $stock = $redis->get('goods_stock'); if ($stock > 0) { $redis->multi(); $redis->decr('goods_stock'); $result = $redis->exec(); if ($result) { echo '秒杀成功!'; } else { echo '秒杀失败!'; } } else { echo '商品已售罄!'; } ?>
In the above code, first connect to the Redis server and obtain product inventory information. If the inventory is greater than 0, use a Redis transaction to reduce the inventory quantity and determine the execution result of the transaction. If the transaction is successfully executed, it means that the flash sale is successful, otherwise it means that the flash sale fails.
To sum up, database-based pessimistic locking and cache-based optimistic locking are common concurrency control strategies in PHP flash killing systems. Choosing the appropriate strategy based on the actual situation can effectively improve the concurrent processing capability and stability of the system and ensure the user experience of participating in flash sale activities.
The above is the detailed content of Concurrency control strategy in PHP flash kill system. For more information, please follow other related articles on the PHP Chinese website!