ThinkPHP 强制开启事务

程斌 2016-10-25 AM 2076℃ 0条

窘境:
一个方法要操作多个表,开不开事务?如果打开事务,调用方法的地方也打开了事务,怎么办?

解决方法:
加上一个判断,必须在方法外围加上事务开启,如果调用方法外围没有开启事务,抛出异常。

ThinkPHP 3.2.3 框架修改:
\ThinkPHP\Library\Think\Db\Driver.class.php

transTimes //事务指令数
***!!!该处源代码中,是 protected,需改成 public***

    /**
     * 启动事务
     * @access public
     * @return void
     */
    public function startTrans() {
        $this->initConnect(true);
        if ( !$this->_linkID ) return false;
        //数据rollback 支持
        if ($this->transTimes == 0) {
            $this->_linkID->beginTransaction();
        }
        $this->transTimes++;
        return ;
    }

**新增 NeedToOpenTrans 方法:**
*\ThinkPHP\Library\Think\Model.class.php*

    public function NeedToOpenTrans()
    {
        if( $this->db->transTimes() == 0 ) {
            throw new \Exception('外围事务未开启,不能使用此方法',5001);
        }
    }

**实际使用:**
    function create_order()
    {
        //调用该方法,必须开启事务
        M()->NeedToOpenTrans();
        
        $order_model = D('Order');
        $order_water_model = D('Order_water');
        //操作 order 表
        $order_model->add($data);
        //操作 order_water 表
        $order_water_model->add($data_water);
    }
标签: thinkphp, mysql, 事务

非特殊说明,本博所有文章均为博主原创。

上一篇 PHP 可变类名
下一篇 oauth2.0授权

评论啦~