Вопрос касается ajax, mysql, выбора и обновления, транзакций и блокировок и т. Д., И извините, если я так долго рассказывал историю вопроса, но для понимания своих потребностей я думаю, что это необходимо. Это длинный вопрос, но необходимость проста, поэтому я был бы очень признателен, если бы вы прочитали вопрос и помогли мне.
Технологии, которые я использую / хочу использовать в своем проекте:
ajax, php, mysql, транзакция и блокировки
Фоновая история:
Итак, вот проблема, которая сильно беспокоит меня в моем проекте, что должно быть довольно распространенным явлением, но я не могу найти единого решения онлайн для моей ситуации.
Мой проект очень похож на интернет-магазин, и когда разные покупатели приходят, чтобы купить товар, я всегда хочу, чтобы они получили правильный инвентарь для этого товара. Если есть другие клиенты, которые просматривают этот товар и, возможно, захотят проверить его, тогда клиенты пришли посмотреть этот продукт позже, чем эти клиенты не могут выбрать желаемое количество и продолжить оформление заказа до тех пор, пока не придут первые клиенты просмотр этого товара или завершение проверки. Так что это мешает магазину перепродать.
Что я в настоящее время знаю и сделал:
Теперь я знаю, что должен использовать транзакцию sql или заблокировать таблицу, если клиент приходит посмотреть продукт, используя SELECT … FOR UPDATE или просто блокировку и т. Д. Я думаю, что я прекрасно знаю, как выполнить шаги при написании SQL последовательно в терминале или в phpmyadmin.
Однако в моей ситуации я использую ajax-вызов, чтобы получить страницу продукта для клиента (для этого я имею в виду, что я использую ajax для получения данных из php-файла, в котором есть предложение SELECT), и после этого я использую другой AJAX вызов, чтобы отправить данные извлечения на другой php, чтобы обновить таблицу под нажатием кнопки, которая используется для продолжения проверки:
Например, в моем get-order-detail.js (псевдокод, но очень похоже на реальный код, который я пишу в своем проекте):
$.ajax({
method: "post",
url: "get-order-details.php",
success: function(backData){
$("#ordersTable").html(backData);
$("#check-out-button").on("click", function(){
var quantity_selected = $("#check-out-qty-input").val();
var sendData = "qty=" + quantity_selected;
$.ajax({
method: "post",
url: "check-out.php",
data: sendData,
success: function(backData){
alert(backData + "is deducted.")
}
});
});
});
И в get-order-details.php (псевдокод, исключить try-catch):
$pdo->beginTransaction();
$sql = "SELECT quantity_left FROM orders WHERE orderId = 1 FOR UPDATE"$stmt = $pdo->prepare($sql);
$stmt->execute();
if ($row = $stmt->fetch()){
$quantity_left = $row["quantity_left"]
echo "You can still take " . $quantity_left;
echo "I want to take <input id='check-out-qty-input'>";
echo "<button id='check-out-button'>checkout</button>";
$pdo->commit();
И в check-out.php (псевдокод, исключить try-catch):
$qty = $_POST["qty"];
$pdo->beginTransaction();
$sql = "UPDATE orders SET quantity_left=quantity_left-$qty WHERE orderId = 1"$stmt = $pdo->prepare($sql);
$stmt->execute();
echo $qty;
$pdo->commit();
Какой у меня вопрос:
Итак, как вы видите, это два ajax-вызова к двум php-файлам (один для выбора, чтобы отобразить информацию о количестве и наличии кнопки извлечения, а второй — для обновления количества, если покупатель заказал некоторые продукты), и они не работают как Я хотел. Так можно ли разделить транзакцию на эти два php-файла? Если да, то как я могу это сделать, и если это невозможно, как лучше сказать, объединить эти два php в один php и просто использовать один ajax-вызов для выполнения этих двух действий?
Что я ожидаю увидеть на фронтенде:
Когда клиент просматривает товар, на странице не будет отображаться какая-либо информация или будет задерживаться отображение информации о количестве этого продукта после того, как ранее пришедший клиент завершил свое действие с этим продуктом. Также было бы лучше, если бы количество можно было обновлять в режиме реального времени (я знаю, может быть, для этого нам нужно использовать магистраль, но если простой ajax не может этого достичь, то хорошо бы придерживаться этого).
Большое спасибо за решение моей проблемы!
Задача ещё не решена.
Других решений пока нет …