TinkPHP6使用事务锁防止抽奖超出

7小时前   阅读:36   类型:后端   分类:TP6    标签: PHP TP6

在做抽奖项目的时候,有时需要限定奖品的数量,如果单独通过查询数据库统计奖品的数量,并发的时候会出现超出的问题,我们可以使用ThinkPHP6的事务锁来防止超出,Db::startTrans() 和 Db::commit() 以及 Db::rollback(),一个是开启事务锁,一个是提交事务,另一个是回滚事务,以下是个例子。

<?php
declare (strict_types = 1);
namespace app\api\controller;
use think\facade\Db;
use app\Request;
use think\facade\View;
class Luck{
	public function add(Request $request){
    $data=$request->param();
    $data['created_at'] = time();
    // 获取奖品数量限制
    $prize_limits = [
      'PHP' => 2,
      'JAVA' => 10,
      'Python' => 6
    ];
    $awards = $data['awards'];
     // 开始事务,锁定相关数据
    Db::startTrans();
    try {
      // 锁定奖品数量表,避免并发冲突
      $macCount = Db::name('choujiang')->where(['awards' => $awards])->lock(true)->count();
      // 检查奖品数量是否超出
      if (isset($prize_limits[$awards]) && $macCount >= $prize_limits[$awards]) {
        Db::rollback(); // 回滚事务
        return returnJson('5001', "$awards 抽奖已经超出");
      }
      // 锁定奖品数量表,避免个数超出
      $macCount = Db::name('choujiang')->where(array('shareStatus'=>0))->lock(true)->count();

      // 检查奖品数量是否超出
      if ($macCount >= 18) {
        Db::rollback(); // 回滚事务
        return returnJson('5001', "抽奖已经结束!");
      }
      $res = Db::name('choujiang')->insert($data);
      if($res){
        Db::commit(); // 提交事务
        return returnJson('200','抽奖成功');
      }else{
        Db::rollback(); // 回滚事务
        return returnJson('500','网络异常,抽奖失败');
      }
    }catch (\Exception $exception){
      // dd($exception);
      Db::rollback(); // 回滚事务
      return returnJson('500','1网络异常,抽奖失败');
    }
	}
}
【腾讯云】AI 驱动 · 智领未来,4核4G3M云服务器低至 79元/年

‘简忆博客’微信公众号 扫码关注‘简忆博客’微信公众号,获取最新文章动态
转载:请说明文章出处“来源简忆博客”。http://www.tpxhm.com/adetail/1160.html

×
觉得文章有用就打赏一下文章作者
微信扫一扫打赏 微信扫一扫打赏
支付宝扫一扫打赏 支付宝扫一扫打赏

文章评论(0)

登录
简忆博客壁纸一
简忆博客壁纸二
简忆博客壁纸三
简忆博客壁纸四
简忆博客壁纸五
简忆博客壁纸六
简忆博客壁纸七
简忆博客壁纸八
头像

简忆博客
勤于学习,乐于分享

置顶推荐

打赏本站

如果你觉得本站很棒,可以通过扫码支付打赏哦!
微信扫码:你说多少就多少~
微信扫码
支付宝扫码:你说多少就多少~
支付宝扫码
×