请问我的事务和锁代码写对了么?关于超卖这种问题,还有更优雅的方式解决么?
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包围起来么?求代码例子