public function cash(): Response
{
$param = postMore([
['member_id',1],
['phone',1],
['money',30],
['back_card',1],
['create_time',time()]
]);
Db::startTrans();
try {
$this->member($param);
$this->model->save($this->datatable,$param);
Db::commit();
} catch (Throwable $e) {
Db::rollback();
$this->error($e->getMessage(),$e->getCode());
}
return $this->success();
}
/**
* 判斷用戶余額是否足夠
* 修改用戶余額和提現(xiàn)中金額
* @throws MyBusinessException
*/
public function member($param)
{
$member = $this->model->findOne('back_member',['id' => $param['member_id']],'balance,txz_profit');
if ($member['balance'] < $param['money']) {
$this->error('用戶余額不足',30001);
}
$member_data = [
'balance' => bcsub($member['balance'],$param['money'], 2),//余額
'txz_profit' => bcadd($param['money'], $member['txz_profit'], 2),//提現(xiàn)中金額
];
$this->model->upd('back_member',['id' => $param['member_id']],$member_data);
}
用戶提現(xiàn)時,修改用戶余額和提現(xiàn)中金額,然后增加一條提現(xiàn)記錄。目前問題在于高并發(fā)多進程的情況下,提現(xiàn)記錄增加了,但是修改用戶余額的時候,數(shù)據(jù)可能并不是最新的。
目前測試改為單進程是沒有這么問題。然后想問一下大佬有沒有辦法讓這個請求始終在同一個進程中
目前解決辦法是改為單進程,或者使用
$lockFile = '/cash_member_lock'; // 鎖文件路徑
$fp = fopen($lockFile, 'w');
if (flock($fp, LOCK_EX)) { // 獲取獨占鎖
$param = postMore([
['member_id',1],
['phone',1],
['money',30],
['back_card',1],
['create_time',time()]
]);
Db::startTrans();
try {
$this->member($param);
$this->model->save($this->datatable,$param);
Db::commit();
} catch (Throwable $e) {
Db::rollback();
$this->error($e->getMessage(),$e->getCode());
}
flock($fp, LOCK_UN); // 釋放鎖
fclose($fp);
} else {
$this->error('找不到鎖');
}
文件鎖來控制始終在同一個經(jīng)常中,