Mysql Laravel悲观锁无法正常工作
我正在开发一个用于娱乐目的的小型购物网站,但我打算在将来将相同的代码应用于一个可能的真正的商店网站。 所以我有这些“吃角子老虎机”是要买的,比如一个预订的吃角子老虎机,用来保留有号码的座位。 所以人们会买吃角子老虎机并保留座位,但我面临着一个比赛条件问题,即使我使用lockForUpdate方法,我也可以买比我的平衡更多的吃角子老虎机。 当用户单击“购买”时,我的一段代码: 我将记录插槽数量,因为我将显示重定向后用户在视图上成功购买的插槽数量。Mysql Laravel悲观锁无法正常工作,mysql,laravel,eloquent,Mysql,Laravel,Eloquent,我正在开发一个用于娱乐目的的小型购物网站,但我打算在将来将相同的代码应用于一个可能的真正的商店网站。 所以我有这些“吃角子老虎机”是要买的,比如一个预订的吃角子老虎机,用来保留有号码的座位。 所以人们会买吃角子老虎机并保留座位,但我面临着一个比赛条件问题,即使我使用lockForUpdate方法,我也可以买比我的平衡更多的吃角子老虎机。 当用户单击“购买”时,我的一段代码: 我将记录插槽数量,因为我将显示重定向后用户在视图上成功购买的插槽数量。 如果我截取请求并编辑它,比如说,4个请求,每个请求
如果我截取请求并编辑它,比如说,4个请求,每个请求购买5个不同的插槽,我可以设法购买超过我的余额,我的余额变成负值。我在哪里搞砸了?嗯,在$wallet上的lockForUpdate()呼叫后,你能尝试刷新$wallet吗?如果它有效,那么我将在回答中提供一个解释。您能确保钱包余额在
$wallet->update()
之后发生变化吗?我会在循环外取一次钱包,并确保余额得到更新。我会试试并更新你guys@andretzermias尝试在提交前再次检查余额是否已更改。仍然可以花比我更多的钱have@Shadow尝试检查钱包是否已成功更新,但仍然存在相同的问题。似乎lockForUpdate不起作用,因为请求同时出现
foreach ($tSlots as $mSlot) {
DB::beginTransaction();
$slot = Slots::where('id', $mSlot)->lockForUpdate()->first();
$wallet = $user::getWallet();
$wallet->lockForUpdate();
if (($slot->user_id === null) && ($wallet->balance >= $slot->price)) {
$wallet->balance -= $slot->price;
$slot->user_id = $user->id;
if ($wallet->update() && $slot->update()) {
$counter++;
DB::commit();
} else {
DB::rollBack();
}
} else {
DB::rollBack();
}
}