两个有问题的情景:
我希望能够在付款网关中“预订”门票。这意味着门票仍然没有购买,但目前保留给相关用户,这样当第一个用户仍在付款过程中时,没有其他用户可以购买。
我的数据库中有两个表:
1。 Ticket_type_id:包含一种故障单
2. Ticket_purchased:包含所有购买的门票
购买机票时,应该从&stock; stock_remaining'中减少正确的金额。当此人在支付网关时保留。只有在付款成功后,才能在第二个表格中创建所有票证,并从“stock_remaining”中扣除。是最后的。
到目前为止,我想出了以下流程(我的尝试代码):
当用户点击“结帐”时,会启动 PHP会话。 PHP在数据库中开始交易。此交易从门票库存总额中扣除,并为给定用户生成门票,但未提交。
如果以下任何查询失败,整个交易将被回滚,会话已关闭,系统会向用户显示错误消息。但是,如果成功,支付网关将打开。
网关完成后,付款成功,用户从网关返回我使用排球将成功参数发送到正在运行的会话。如果Transaction提交成功,则返回。
session_start();
$response = array();
begin(); // transaction begins
if (isset($_POST['ticketTypeId']) && isset($_POST[‘ticketQuantity’]) && isset($_POST['userId'])){
$ticketTypeId = $_POST['ticketTypeId'];
$ticketQuan = $_POST['ticketQuantity'];
$userId= $_POST['userId'];
$query1 = check if quantity required is available
$query2 = deduct quantity from total remaining
ForLoop(ticket quantity){
$query3 = generate one ticket for user
}
if(!success){
// On SUCCESS
$response["success"] = 1;
echo json_encode($response);
}else{
// On Failed
$response["success"] = 0;
echo json_encode($response);
rollback(); // transaction rolls back
exit;
}
}
if (isset($_POST['Transaction'])){
$transaction = $_POST['Transaction'];
if($transaction == 1){
// On Success
$response["success"] = 1;
echo json_encode($response);
commit(); // transaction is committed
exit;
}else{
// On Failed
$response["success"] = 0;
echo json_encode($response);
rollback(); // transaction rolls back
exit;
}
}
我不知道如何重新连接到会话,因此我不知道这是否有效。
答案 0 :(得分:0)
对于出售1张票的问题情况,2请求它,你可能想要在有人把它放入购物车后锁定1张票或/并且你可以在MySQL上使用交易。
同样的问题发生在信用卡上。当两辆车试图同时拉出最大信用额度时。只有第一个获得服务..希望;)