我写了一个bash脚本,试图发送一些POST请求到我的网站。在网站上我的POST请求处理我有这样一个逻辑:PHP/MySQL竞态条件问题
$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个POST请求和我的网站的响应瞬间。所有请求都在同一时间执行,并且少数请求会从服务器收到“真实”响应。
我认为我需要使用事务机制来避免这种情况?或者如何避免用户请求之间的一些延迟呢?解决它的最好方法是什么?我试图为类似的网站做这个动作,并且在请求之间得到了延迟。
非常感谢你,对我的坏英语感到抱歉。
你受到并发性的打击。您正在检查脚本中的数据有效性 - 这是错误的。数据使用数据库进行验证。你有一大堆误报。这样做的方式是只需插入数据库。 'order_id'作为一个唯一的键,所以如果发生同样的'order_id'插入,你更新记录。 MySQL的语法是'INSERT INTO ... ON DUPLICATE KEY UPDATE'。它解决了你所有的问题。 [这里是链接到MySQL手册](https://dev.mysql.com/doc/refman/5.6/en/insert-on-duplicate.html)关于我提到的语法。 –