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;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值