sqlserver轉換數據類型,yii mysql 查詢 類型轉換_Yii2.0 API改造(返回數據庫對應字段數據類型)

 2023-10-05 阅读 25 评论 0

摘要: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 extendsT

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__);

}

}

}

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://hbdhgg.com/4/113767.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 匯編語言學習筆記 Inc. 保留所有权利。

底部版权信息