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

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包围起来么?求代码例子

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

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