国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

問(wèn)大佬們一個(gè)問(wèn)題,多進(jìn)程下,數(shù)據(jù)庫(kù)數(shù)據(jù)出現(xiàn)混亂

 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)時(shí),修改用戶余額和提現(xiàn)中金額,然后增加一條提現(xiàn)記錄。目前問(wèn)題在于高并發(fā)多進(jìn)程的情況下,提現(xiàn)記錄增加了,但是修改用戶余額的時(shí)候,數(shù)據(jù)可能并不是最新的。
目前測(cè)試改為單進(jìn)程是沒(méi)有這么問(wèn)題。然后想問(wèn)一下大佬有沒(méi)有辦法讓這個(gè)請(qǐng)求始終在同一個(gè)進(jìn)程中

1013 2 2
2個(gè)回答

夢(mèng)想世界

目前解決辦法是改為單進(jìn)程,或者使用

$lockFile = '/cash_member_lock'; // 鎖文件路徑
        $fp = fopen($lockFile, 'w');
        if (flock($fp, LOCK_EX)) { // 獲取獨(dú)占鎖
            $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('找不到鎖');
        }

文件鎖來(lái)控制始終在同一個(gè)經(jīng)常中,

  • 暫無(wú)評(píng)論
six

因?yàn)槟阕x取和寫(xiě)入是兩步操作,不是原子操作,所以會(huì)有并發(fā)問(wèn)題。用一個(gè)SQL就行了,一個(gè)SQL它是原子操作。
SQL類(lèi)似update member set balance = balance - $value where member_id = x and balance >= $value。
返回影響的行數(shù)為1代表成功,為0代表余額不足,這樣不會(huì)有問(wèn)題。

或者更改數(shù)據(jù)庫(kù)事務(wù)隔離級(jí)別為序列化,這樣即使你分成兩步,數(shù)據(jù)庫(kù)事務(wù)也是串行,不會(huì)有并發(fā)問(wèn)題。

年代過(guò)于久遠(yuǎn),無(wú)法發(fā)表回答
??