mysql 事物小測試

        $goodsModel = M('mall.Goods');
        $usermodel = M('user.User');
        $shopModel = M('mall.Shop');
        
        try {
            //事物不能跨庫 有一個model使用事物則必須都使用事物 同庫下一個事物即可 中途修改的值立即生效 出現異常則rollback
            $goodsModel->beginTransaction();
            $usermodel->beginTransaction();
            $goodsModel->updateById(['StockCount'=>500], 80);
            $shopModel->updateById(['GoodsCount'=>10], 100274);
            $usermodel->updateById(['Money' => 7], 3);
            
            echo $goodsModel->fetchById(80)['StockCount'];//500
            
            throw new \Exception('interupt', 211);
            
            $goodsModel->commit();
            $usermodel->commit();
            die('modify success!');
        } catch (Exception $e) {
            $goodsModel->rollback();
            $usermodel->rollback();
            echo $e->getMessage();
        }

如果goodsModel 和userModel 使用的PDO對象是同一個 則屬於同一事物
反之爲2個事務 ,這也是爲什麼在mysql控制檯測試時 事物可跨庫的問題

PDO多事務程序處理:
    protected $transactionCounter = 0;
    function beginTransaction() {
        if(!$this->transactionCounter++)
            return parent::beginTransaction();
        return $this->transactionCounter >= 0;

    }

    function commit() {
        if(!--$this->transactionCounter)
            return parent::commit();
        return $this->transactionCounter >= 0;
    }

    function rollback() {
        if($this->transactionCounter >= 0) {
            $this->transactionCounter = 0;
            return parent::rollback();
        }
        $this->transactionCounter = 0;
        return false;
    }


發佈了101 篇原創文章 · 獲贊 11 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章