问题是关于 ajax、mysql、选择和更新、事务和锁等,很抱歉,如果我把背景故事讲了这么长时间,但为了理解我的需求,我认为这是必要的。这是一个很长的问题,但需求很简单,所以如果您通读这个问题并帮助我,我将不胜感激。
我在项目中使用/希望使用的技术:
ajax、php、mysql、事务和锁
背景故事:
所以这是在我的项目中困扰我很多的问题,这应该很常见,但我似乎无法在网上找到适合我情况的无缝解决方案。
我的项目很像一个网上商店,当不同的客户来购买一件商品时,我总是希望他们为该产品获得合适的库存。如果有其他顾客正在查看该商品并且可能会先结账,则该顾客来查看该商品的时间晚于这些顾客无法继续选择所需数量并继续结账,直到先到顾客完成查看此项目或完成结帐。这样可以防止商店超卖。
我目前知道并做过的事情:
现在,我知道我应该使用 sql 事务,或者如果客户通过使用 SELECT...FOR UPDATE 或只是锁定等来查看产品,我应该锁定表。我想我完全知道如何在编写在终端或 phpmyadmin 中串联 SQL。
但是,在我的情况下,我使用 ajax 调用来获取客户的产品页面(我的意思是我使用 ajax 从包含 SELECT 子句的 php 文件中获取数据),然后我使用另一个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();
我的问题是:
如您所见,这是对两个 php 文件的两个 ajax 调用(一个用于 SELECT 以显示 quantity_left 信息并提供结帐按钮,另一个用于在客户签出某些产品时更新 quantity_left),它们不能作为我曾经希望。那么是否可以将事务拆分为这两个 php 文件?如果是这样,我该怎么做?如果不可能,将这两个 php 组合成一个 php 并只使用一个 ajax 调用来执行这两个操作的更合适的方法是什么?
我希望在前端看到的内容:
客户在查看商品时,在先到客户完成对该商品的操作后,页面将不显示任何信息或延迟显示该商品的数量信息。如果数量可以实时更新也会更好(我知道也许我们必须为此使用主干,但如果简单的 ajax 无法实现,那么保持这种方式就可以了)。
非常感谢您解决了我的问题!