gpt4 book ai didi

php - 如果条件为真,安全 MYSQL 插入多行

转载 作者:搜寻专家 更新时间:2023-10-30 20:23:56 25 4
gpt4 key购买 nike

我正在做一个小项目,我的票是有限的,用户可以购买多种数量和不同类型的票。我需要确保只有在要购买的门票不超过每种类型剩余的可用门票时才会插入交易。

这样做是否足够安全?

$selectAvailableTickets = getTicketAvailability(1,2,3) //Assume that this returns rows of event_id, tickets_available

foreach($selectAvailableTickets as $availableEventTicket){
foreach($ticketsToPurchase as $purchase){
if($purchase->event_id == $availableEventTicket->event_id){
if($purchase->ticket_count > $availableEventTicket){
$hasExceedingPurchase = true;
}
}
}
}

if($hasExceedingPurchase) //Cancel transaction, otherwise, insert and proceed

这样的事情是否足以确保只有在购买不超过该特定类型机票的可用机票时才会进行交易?

我在想,如果有多个用户几乎同时进行交易,允许一个用户插入的条件即使返回为真也可能是假的,如果另一个人买票并且没有留给另一个人也进行了一笔交易,只是碰巧进行了一笔比另一笔交易更快的交易。

最佳答案

为了保护您的数据库免受这些选择和插入的信息不匹配的意外故障,您可以请求事务锁定。这些是一个非常有趣的话题,值得一读!对于您的实现,您需要知道的是您可以请求锁定并且仅在所有查询都成功时才执行查询。

DB::transaction(function() {
//get available ticket count
$event = Event::where('event_id', $event_id)->lockForUpdate()->get();
$available_tickets = $event->available;

if($available_tickets < $tickets_to_purchase){
//tickets where already sold, throw exception to rollback transaction
throw new Exception();
return
}

//safely create tickets since we are the only one with the lock
$ticket = new Ticket()
$ticket->amount_of_tickets = $tickets_to_purchase;
$ticket->save();

$event->available = $available_tickets - $tickets_to_purchase;
$event->save;
});

这里我们使用 pessimistic lock ,这个锁意味着在锁被释放之前,除了获得锁的 person/php 实例之外,没有人可以读取此事件可用的门票数量。由于我们在同一笔交易中创建门票并更新可用门票,因此我们可以确定我们是唯一能够购买所述门票的人。

当然,函数内的所有代码都可以扩展以获取所有相关信息(使用适当的锁)。在这里,您还可以使用 for 循环来获取所有票证类型的相关信息。

关于php - 如果条件为真,安全 MYSQL 插入多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48551594/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com