在使用ajax的情况下,跨不同的php文件执行mysql事务的正确方法是什么?或者不可能?

在使用ajax的情况下,跨不同的php文件执行mysql事务的正确方法是什么?或者不可能?,php,mysql,ajax,transactions,table-lock,Php,Mysql,Ajax,Transactions,Table Lock,问题是关于ajax、mysql、选择和更新、事务和锁等,如果我把背景故事讲得太长,那么很抱歉,但为了理解我的需求,我认为这是必要的。这是一个很长的问题,但需求很简单,因此如果您通读这个问题并帮助我解决问题,我将不胜感激 我在项目中使用/希望使用的技术: ajax、php、mysql、事务和锁 背景故事: 因此,在我的项目中,有一个问题困扰着我,这个问题应该很常见,但我似乎无法在网上找到适合我的情况的无缝解决方案 我的项目很像一个网上商店,当不同的客户来购买一件商品时,我总是希望他们能得到适合这个

问题是关于ajax、mysql、选择和更新、事务和锁等,如果我把背景故事讲得太长,那么很抱歉,但为了理解我的需求,我认为这是必要的。这是一个很长的问题,但需求很简单,因此如果您通读这个问题并帮助我解决问题,我将不胜感激

我在项目中使用/希望使用的技术:

ajax、php、mysql、事务和锁

背景故事:

因此,在我的项目中,有一个问题困扰着我,这个问题应该很常见,但我似乎无法在网上找到适合我的情况的无缝解决方案

我的项目很像一个网上商店,当不同的客户来购买一件商品时,我总是希望他们能得到适合这个产品的库存。如果有其他客户正在查看此项目,并且可能会继续退房,则在第一批客户完成查看此项目或退房之前,这些客户查看此产品的时间晚于这些客户无法继续选择他们想要的数量并继续退房。这样可以防止商店过度销售

我目前知道和做过的事情:

现在,我知道我应该使用sql事务,如果客户来查看产品,我应该使用SELECT…FOR UPDATE或lock等来锁定表。我想我完全知道在terminal或phpmyadmin中串联编写sql时如何执行这些步骤

但是,在我的情况下,我使用ajax调用为客户获取产品页面(我的意思是使用ajax从包含SELECT子句的php文件中获取数据),在这之后,我使用另一个ajax调用将签出数据发送到另一个php,以便在按下一个按钮的情况下更新表,该按钮用于继续签出:

例如,在我的get order detail.js(伪代码,但非常像我在项目中编写的真实代码)中:

在get order details.php(伪代码,消除try-catch)中:

我的问题是:

如您所见,这是对两个php文件的两个ajax调用(一个用于选择以显示剩余数量信息并提供一个签出按钮,另一个用于在客户签出某些产品时更新剩余数量),但它们并没有按我所希望的那样工作。那么,是否可以将一个事务拆分为这两个php文件?如果是这样的话,我该怎么做呢?如果不可能的话,还有什么更合适的方式可以说将这两个php组合成一个php,然后只使用一个ajax调用来执行这两个操作

我希望在前端看到的内容:

当客户查看商品时,页面将不显示任何信息,或在前一位客户完成其对该产品的操作后延迟显示该产品的数量信息。如果数量可以实时更新也会更好(我知道我们可能需要使用主干网,但是如果简单的ajax无法实现,那么保持这种方式也很好)


非常感谢你解决了我的问题

我认为你想得太多了。您可以每分钟简单地轮询服务器以更新数量,或者,如果您只是在结帐时进行检查,则为用户提供诸如在有更多库存时收到通知、简单地用可用的库存结帐或通知他们由于缺货而延迟交货等选项。顺便说一句,你不需要一个选择事务。你可以研究,但我不认为让用户等待是一个好主意。其他用户可能不购买,或将页面打开数小时,等等。每个用户都应该独立于其他IMO用户进行处理。感谢您的及时回复@inarilo!是的,我想我可能也太复杂了。让我看看
    $.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.")
                    }
                });
            });
    });
$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();
$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();