盲盒转盘优化-调试

This commit is contained in:
2025-10-24 14:58:35 +08:00
parent 46d12d99b1
commit 8315eeae2d

View File

@@ -576,10 +576,24 @@ class BlindBoxTurntableGiftDrawWorld extends Model
// 批量更新 // 批量更新
foreach ($inventoryUpdates as $giftId => $count) { foreach ($inventoryUpdates as $giftId => $count) {
// 使用 FOR UPDATE 锁定记录
$giftBagDetail = Db::name("vs_gift_bag_detail")
->where('id', $giftId)
->lock(true) // 添加悲观锁
->find();
if (!$giftBagDetail) {
throw new \Exception("礼物详情不存在ID: " . $giftId);
}
// 检查库存是否足够
if ($giftBagDetail['remaining_number'] < $count) {
throw new \Exception("礼物库存不足ID: " . $giftId);
}
// 执行更新
$ret = db::name("vs_gift_bag_detail")->where('id',$giftId) $ret = db::name("vs_gift_bag_detail")->where('id',$giftId)
->setDec('remaining_number', $count); ->setDec('remaining_number', $count);
if (!$ret) { if (!$ret) {
Log::record('巡乐会更新礼物剩余数量: ' . $room_id."【数据】".var_export($precomputedResults, true),"info"); $this->redis->setex('blind_box_draw_world_errors_' . date('Y-m-d-H-i-s'), 86400 * 7, "更新礼物剩余数量失败 礼物ID".$giftId.' 数量:'.$count.' 预处理结果:'.json_encode($precomputedResults));
throw new \Exception('更新礼物剩余数量失败'); throw new \Exception('更新礼物剩余数量失败');
} }
} }
@@ -1042,7 +1056,7 @@ class BlindBoxTurntableGiftDrawWorld extends Model
* @param int $gift_bag_id 礼物包ID * @param int $gift_bag_id 礼物包ID
*/ */
private function reset_gift_pool($gift_bag_id,$remaining_available_gifts=[]) { private function reset_gift_pool($gift_bag_id,$remaining_available_gifts=[]) {
$bag_detail = db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->select(); // $bag_detail = db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->select();
db::name("vs_gift_bag")->where('id',$gift_bag_id)->setInc('periods'); //更新期数 db::name("vs_gift_bag")->where('id',$gift_bag_id)->setInc('periods'); //更新期数
db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->update(['remaining_number'=>db::raw('quantity')]);//重置奖池 db::name("vs_gift_bag_detail")->where('gift_bag_id',$gift_bag_id)->update(['remaining_number'=>db::raw('quantity')]);//重置奖池
//防止并发上把如果件数小于0则加上 //防止并发上把如果件数小于0则加上