gpt4 book ai didi

php - PHP/MySQL 中的竞争条件问题

转载 作者:行者123 更新时间:2023-11-29 01:38:55 24 4
gpt4 key购买 nike

我写了一个 bash 脚本,试图向我的网站发送一些 POST 请求。在我网站上的 POST 请求处理程序中,我有如下逻辑:

$std = new \stdClass();
$std->ok = false;
$order = getOrderById(id); // table: orders
$user_id = user_id;
if (!empty($order)) {
if (!orderIsntPerformedByUser($user_id, $order->id)) { // table: performed_orders
updateUserData($user_id, ['user_balance', 'user_balance+1']); // table: users
performOrderByUserId($order->id, $user_id); // table: performed_orders
}
}
echo json_encode((array)$std);
return;

bash 脚本:

for i in {1..5}
do
curl 'http://example.com/handlePostRequest' --form-data="id=1" &
done

它在后台发送 5 个帖子请求,我的网站立即响应。所有请求同时执行,少数请求从服务器收到“真实”响应。

我觉得我需要使用事务机制来避免这种情况?或者如何在用户请求之间做一些延迟以避免它?修复它的最佳方法是什么?我尝试对类似的网站执行此操作,但在请求之间出现延迟。

非常感谢,抱歉我的英语不好。

最佳答案

我将扩展我的评论。你在你的服务器上做错了。您正在使用 PHP 来验证订单是否在数据库中,但 PHP 脚本不是数据权威 - MySQL 是。 MySQL 的工作是处理数据。您的要求是插入到表中,如果该记录存​​在 order_id - 更新 current_balance

这是通过在 order_id 上放置一个 unique key 来实现的。那么您的查询如下所示:

INSERT INTO orders (order_id, current_balance) VALUES (1, 13.37) ON DUPLICATE KEY UPDATE current_balance = current_balance + 333.333

这种方法的好处:

  • 数据库负责处理数据(这是它的工作)
  • 不会出现并发问题
  • 保持数据完整性
  • 您需要处理的代码更少

关于php - PHP/MySQL 中的竞争条件问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31533743/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com