技术饭

ThinkPHP使用数据库读写分离时,开启事务时报错:There is no active transaction

copylian    0 评论    11512 浏览    2017.05.22

ThinkPHP使用数据库读写分离时,开启事务时报错:There is no active transaction,刚开始以为是数据表引擎不对造成的,因为 有几张表的引擎是 MyISAM,后来调整过来了,改为 InnoDB,还是报错。应该是TP 底层连数据库时,切换数据库连接时出了点问题。

打开文件 ThinkPHP/Library/Think/Db/Driver.class.php,调整内容如下:


/**
 * 启动事务
 *
 * @access public
 * @return void
 */
public function startTrans() {
    $this->initConnect(true);
    if ( !$this->_linkID ) return false;
    // 数据rollback 支持
    if ($this->transTimes == 0) {
        //$this->_linkID->beginTransaction(); // by 52php.cnblogs.com
        foreach ($this->linkID as $_linkId) {
            $_linkId->beginTransaction();
        }
    }
    $this->transTimes++;
    return ;
}
 
/**
 * 用于非自动提交状态下面的查询提交
 *
 * @access public
 * @return boolean
 */
public function commit() {
    if ($this->transTimes > 0) {
        //$result = $this->_linkID->commit(); // by 52php.cnblogs.com
        foreach ($this->linkID as $_linkId) {
            $result $_linkId->commit();
        }
 
        $this->transTimes = 0;
        if(!$result){
            $this->error();
            return false;
        }
    }
    return true;
}
 
/**
 * 事务回滚
 *
 * @access public
 * @return boolean
 */
public function rollback() {
    if ($this->transTimes > 0) {
        //$result = $this->_linkID->rollback(); // by 52php.cnblogs.com
        foreach ($this->linkID as $_linkId) {
            $result $_linkId->rollback();
        }
 
        $this->transTimes = 0;
        if(!$result){
            $this->error();
            return false;
        }
    }
    return true;
}


飓风呀
感谢你的支持,我会继续努力!
扫码打赏,感谢您的支持!

文明上网理性发言!

  • 还没有评论,沙发等你来抢