yii mysql 查询 类型转换_Yii2.0 API改造(返回数据库对应字段数据类型)

本文档介绍了一个Yii2.0框架中扩展的事务类TransactionExt,详细阐述了如何开始、提交和回滚事务。在开始外部事务时,会设置隔离级别,并在不支持嵌套事务的数据库系统中使用保存点来实现类似功能。
摘要由CSDN通过智能技术生成

namespace common\ext;useYii;useyii\base\InvalidConfigException;useyii\base\NotSupportedException;useyii\db\Connection;use yii\db\Exception;useyii\db\Transaction;/**

* 事务拓展类

*

* Class TransactionExt

* @package common\ext*/

class TransactionExt extendsTransaction

{/**

* @var int the nesting level of the transaction. 0 means the outermost level.*/

private $_level = 0;/**

* Returns a value indicating whether this transaction is active.

* @return bool whether this transaction is active. Only an active transaction

* can [[commit()]] or [[rollBack()]].*/

public functiongetIsActive()

{return $this->_level > 0 && $this->db && $this->db->isActive;

}/**

* 覆写开始事务method

*

* @param string|null $isolationLevel The [isolation level][] to use for this transaction.

* This can be one of [[READ_UNCOMMITTED]], [[READ_COMMITTED]], [[REPEATABLE_READ]] and [[SERIALIZABLE]] but

* also a string containing DBMS specific syntax to be used after `SET TRANSACTION ISOLATION LEVEL`.

* If not specified (`null`) the isolation level will not be set explicitly and the DBMS default will be used.

*

* > Note: This setting does not work for PostgreSQL, where setting the isolation level before the transaction

* has no effect. You have to call [[setIsolationLevel()]] in this case after the transaction has started.

*

* > Note: Some DBMS allow setting of the isolation level only for the whole connection so subsequent transactions

* may get the same isolation level even if you did not specify any. When using this feature

* you may need to set the isolation level for all transactions explicitly to avoid conflicting settings.

* At the time of this writing affected DBMS are MSSQL and SQLite.

*

* [isolation level]: http://en.wikipedia.org/wiki/Isolation_%28database_systems%29#Isolation_levels

*

* Starting from version 2.0.16, this method throws exception when beginning nested transaction and underlying DBMS

* does not support savepoints.

* @throws InvalidConfigException if [[db]] is `null`

* @throws NotSupportedException if the DBMS does not support nested transactions

* @throws Exception if DB connection fails*/

public function begin($isolationLevel = null)

{if ($this->db === null) {throw new InvalidConfigException('Transaction::db must be set.');

}$this->db->open();if ($this->_level === 0) {if ($isolationLevel !== null) {$this->db->getSchema()->setTransactionIsolationLevel($isolationLevel);

}

Yii::debug('Begin transaction' . ($isolationLevel ? ' with isolation level ' . $isolationLevel : ''), __METHOD__);$this->db->trigger(Connection::EVENT_BEGIN_TRANSACTION);$this->db->pdo->beginTransaction();$this->_level = 1;return;

}$schema = $this->db->getSchema();if ($schema->supportsSavepoint()) {

Yii::debug('Set savepoint ' . $this->_level, __METHOD__);//Notice: solute error: SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active

$this->db->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);$schema->createSavepoint('LEVEL' . $this->_level);$this->db->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);

}else{

Yii::info('Transaction not started: nested transaction not supported', __METHOD__);throw new NotSupportedException('Transaction not started: nested transaction not supported.');

}$this->_level++;

}/**

* 覆写提交事务method

*

* Commits a transaction.

* @throws \Exception*/

public functioncommit()

{if (!$this->getIsActive()) {throw new Exception('Failed to commit transaction: transaction was inactive.');

}$this->_level--;if ($this->_level === 0) {

Yii::debug('Commit transaction', __METHOD__);$this->db->pdo->commit();$this->db->trigger(Connection::EVENT_COMMIT_TRANSACTION);return;

}$schema = $this->db->getSchema();if ($schema->supportsSavepoint()) {

Yii::debug('Release savepoint ' . $this->_level, __METHOD__);$this->db->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);$schema->releaseSavepoint('LEVEL' . $this->_level);$this->db->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);

}else{

Yii::info('Transaction not committed: nested transaction not supported', __METHOD__);

}

}/**

* 覆写回滚事务method

*

* Rolls back a transaction.*/

public functionrollBack()

{if (!$this->getIsActive()) {//do nothing if transaction is not active: this could be the transaction is committed

// but the event handler to "commitTransaction" throw an exception

return;

}$this->_level--;if ($this->_level === 0) {

Yii::debug('Roll back transaction', __METHOD__);$this->db->pdo->rollBack();$this->db->trigger(Connection::EVENT_ROLLBACK_TRANSACTION);return;

}$schema = $this->db->getSchema();if ($schema->supportsSavepoint()) {

Yii::debug('Roll back to savepoint ' . $this->_level, __METHOD__);$this->db->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);$schema->rollBackSavepoint('LEVEL' . $this->_level);$this->db->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);

}else{

Yii::info('Transaction not rolled back: nested transaction not supported', __METHOD__);

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值