zoukankan      html  css  js  c++  java
  • ThinkPHP v3.2.3 数据库读写分离,开启事务时报错:There is no active transaction

    如题:ThinkPHP v3.2.3 数据库读写分离,开启事务时报错:

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

    问题解决!

  • 相关阅读:
    简单使用SQLite 的增删改查
    androidd 程序默认安装位置和数据存储位置(公用和私用)
    git用法demo
    jQuery动态赋值给选择器
    无法访问虚拟机web服务
    日志-demo
    vitualbox + centos出现问题整理
    安全基础术语
    vs2010+qt4.8.6
    redis高并发
  • 原文地址:https://www.cnblogs.com/52php/p/6089110.html
Copyright © 2011-2022 走看看