php开奖实现方案,请大佬提提建议

我在写一个开奖的时候,碰到一个问题,由于我要先修改用户中奖金额,然后记录日志,并修改该条记录,如果其中某条执行失败,加入队列继续执行,用批量入库显然不太合适,代码如下,麻烦各位大佬,说说优化方案,欢迎讨论:

foreach ($result as $key => $value) {
            $userObj->beginTransaction();
            //计算中奖金币
            $lotterySum = ($value['sum'] == MIN_BET_MONEY ? 1 : $value['sum']/MIN_BET_MONEY)*$value['odds'];
            //将中奖金币写入数据库,修改用户余额
            $sql = 'UPDATE `ct_user` SET `gold` = gold+'.$lotterySum.'  WHERE `id` = '.$value['user_id'];
            $res = $userObj->updateData($sql,[]);
            if (!$res) {
                //如果用户金额修改失败,加入redis队列
                //将用户中奖信息加入数据库
                file_put_contents("tm.txt", json_encode($result).PHP_EOL, FILE_APPEND);
                $userObj->rollBack();
                continue;
            }
            //将中奖数据写入数据库日志
            $data = [
                ':user_id' => $value['user_id'],
                ':classify'=> MONEY_FLOW_LOTTERY,
                ':number'  => $lotterySum,
                ':before_num' => $value['gold'],
                ':after_num'  => $value['gold']+$lotterySum,
                ':explain'    => '恭喜您,第:'.$issue.':'.$code.',中奖'.$lotterySum.'金币',
                ':data'          => json_encode($value),
                ':create_time'=> time(),
            ];
            $sql = 'INSERT INTO `lottery`.`ct_user_funds_log` (`user_id`, `classify`, `number`, `before_num`, `after_num`, `explain`, `data`, `create_time`) VALUES (:user_id, :classify, :number, :before_num, :after_num, :explain, :data, :create_time)';
            $obj->addData($sql,$data);
            $sql = 'UPDATE `ct_cathectic` SET `state`=1';
            $res = $object->updateData($sql,[]);
            if(!$res){
                //如果操作失败,事务回滚,并加入redis
                //将用户中奖信息加入数据库
                file_put_contents("tm.txt", json_encode($result).PHP_EOL, FILE_APPEND);
                $userObj->rollBack();
                continue;
            }
            $userObj->commit();
            continue;
        }```

//解决办法1
foreach ($result as $key => $value) {

        $userObj->beginTransaction();
        //计算中奖金币
        $lotterySum = ($value['sum'] == MIN_BET_MONEY ? 1 : $value['sum']/MIN_BET_MONEY)*$value['odds'];
        //将中奖金币写入数据库,修改用户余额
        $sql = 'UPDATE `ct_user` SET `gold` = gold+'.$lotterySum.'  WHERE `id` = '.$value['user_id'];
        $res = $userObj->updateData($sql,[]);
        if (!$res) {
            //如果用户金额修改失败,加入redis队列
            //将用户中奖信息加入数据库
            file_put_contents("tm.txt", json_encode($result).PHP_EOL, FILE_APPEND);
            $userObj->rollBack();
            continue;
        }
        //将中奖数据写入redis队列
        $data = [
            ':user_id' => $value['user_id'],
            ':classify'=> MONEY_FLOW_LOTTERY,
            ':number'  => $lotterySum,
            ':before_num' => $value['gold'],
            ':after_num'  => $value['gold']+$lotterySum,
            ':explain'    => '恭喜您,第:'.$issue.':'.$code.',中奖'.$lotterySum.'金币',
            ':data'          => json_encode($value),
            ':create_time'=> time(),
        ];
        $sql = 'UPDATE `ct_cathectic` SET `state`=1';
        $res = $object->updateData($sql,[]);
        if(!$res){
            //如果操作失败,事务回滚,并加入redis
            //将用户中奖信息加入数据库
            file_put_contents("tm.txt", json_encode($result).PHP_EOL, FILE_APPEND);
            $userObj->rollBack();
            continue;
        }
        $userObj->commit();
        continue;
    }```

//解决方法2
    private function special($collection_id, $code, $issue)
    {
        $sql = 'SELECT cathectic.id,cathectic.sum,cathectic.user_id,user.gold,cathectic.odds FROM ct_cathectic cathectic LEFT JOIN ct_user user ON cathectic.user_id=user.id WHERE cathectic.type='.BET_TYPE_SPECIAL.' AND cathectic.collection_id='.$collection_id.' AND cathectic.content='.$code;
        $object = new cathectic();
        $result = $object->getData($sql, []);
        if(empty($result)){
            return '-1';
        }
        foreach ($result as $key => $value) {
            //计算中奖金币
            $lotterySum = ($value['sum'] == MIN_BET_MONEY ? 1 : $value['sum']/MIN_BET_MONEY)*$value['odds'];
            //以下调整为写入redis
            //将中奖数据写入数据库日志
            $data = [
                ':user_id' => $value['user_id'],
                ':classify'=> MONEY_FLOW_LOTTERY,
                ':number'  => $lotterySum,
                ':before_num' => $value['gold'],
                ':after_num'  => $value['gold']+$lotterySum,
                ':explain'    => '恭喜您,第:'.$issue.':'.$code.',中奖'.$lotterySum.'金币',
                ':data'          => json_encode($value),
                ':create_time'=> time(),
            ];
            //将中奖金币,中奖用户ID写入redis,并且修改本条参与记录
        }
    }
阅读 1.7k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题