php实现开奖功能,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,并且修改本条参与记录

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值