请问我的事务和锁代码写对了么?关于超卖这种问题,还有更优雅的方式解决么?

RT,以一个抽奖的代码举例

 
 private function lottery($account) {

        //是否超过今天的10次限额
        Account::decrementTime($account->id);

        //是否超过用户刷卡次数并计数 
        $account->decrement('chance_count');

        //随机抽奖 
        $gift = Gift::Lottery();
        if (!$gift) {
            return false;
        }

        //检查用户今天是否已中此奖品
        if (WinnerLog::IsTaken($gift, $account)) {
            return false;
        }

        //检查奖品有无超过当月限制 
        //更新本周奖品数并最后检查并发 
        $isLast = FALSE;
        DB::transaction(function()use($gift, $account, &$isLast) {
            if (!Gift::isOverTimes($gift)) {
                //添加用户中奖记录
                WinnerLog::NewLog($gift, $account);
                //用户中奖计数
                $account->increment('win_count');
                //奖品计数
                $gift->decrement('total');
            } else {
                $isLast = true;
            }
        });
        if ($isLast) {
            return false;
        } else {
            return $gift->grade;
        }
    }

请问sharedLock()应该怎么写?要用DB::transaction包围起来么?求代码例子

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!