0 关注者

类 yii\db\Transaction

继承yii\db\Transaction » yii\base\BaseObject
实现yii\base\Configurable
版本可用2.0
源代码 https://github.com/yiisoft/yii2/blob/master/framework/db/Transaction.php

Transaction 表示数据库事务。

它通常通过调用 yii\db\Connection::beginTransaction() 来创建。

以下代码是使用事务的典型示例(请注意,某些 DBMS 可能不支持事务)

$transaction = $connection->beginTransaction();
try {
    $connection->createCommand($sql1)->execute();
    $connection->createCommand($sql2)->execute();
    //.... other SQL executions
    $transaction->commit();
} catch (\Exception $e) {
    $transaction->rollBack();
    throw $e;
} catch (\Throwable $e) {
    $transaction->rollBack();
    throw $e;
}

注意:在上面的代码中,我们有两个 catch 块以兼容 PHP 5.x 和 PHP 7.x。\Exception 从 PHP 7.0 开始实现 \Throwable 接口,因此如果您应用仅使用 PHP 7.0 及更高版本,则可以跳过 \Exception 部分。

公共属性

隐藏继承的属性

属性 类型 描述 定义于
$db yii\db\Connection 此事务关联的数据库连接。 yii\db\Transaction
$isActive boolean 此事务是否处于活动状态。 yii\db\Transaction
$isolationLevel string 此事务要使用的隔离级别。 yii\db\Transaction
$level integer 事务的当前嵌套级别。 yii\db\Transaction

公共方法

隐藏继承的方法

方法 描述 定义于
__call() 调用不是类方法的命名方法。 yii\base\BaseObject
__construct() 构造函数。 yii\base\BaseObject
__get() 返回对象属性的值。 yii\base\BaseObject
__isset() 检查属性是否已设置,即定义且不为空。 yii\base\BaseObject
__set() 设置对象属性的值。 yii\base\BaseObject
__unset() 将对象属性设置为 null。 yii\base\BaseObject
begin() 开始事务。 yii\db\Transaction
canGetProperty() 返回一个值,指示是否可以读取属性。 yii\base\BaseObject
canSetProperty() 返回一个值,指示是否可以设置属性。 yii\base\BaseObject
className() 返回此类的完全限定名称。 yii\base\BaseObject
commit() 提交事务。 yii\db\Transaction
getIsActive() 返回一个值,指示此事务是否处于活动状态。 yii\db\Transaction
getLevel() yii\db\Transaction
hasMethod() 返回一个值,指示方法是否已定义。 yii\base\BaseObject
hasProperty() 返回一个值,指示属性是否已定义。 yii\base\BaseObject
init() 初始化对象。 yii\base\BaseObject
rollBack() 回滚事务。 yii\db\Transaction
setIsolationLevel() 设置此事务的事务隔离级别。 yii\db\Transaction

常量

隐藏继承的常量

常量 描述 定义于
READ_COMMITTED 'READ COMMITTED' 表示事务隔离级别 READ COMMITTED 的常量。 yii\db\Transaction
READ_UNCOMMITTED 'READ UNCOMMITTED' 表示事务隔离级别 READ UNCOMMITTED 的常量。 yii\db\Transaction
REPEATABLE_READ 'REPEATABLE READ' 表示事务隔离级别 REPEATABLE READ 的常量。 yii\db\Transaction
SERIALIZABLE 'SERIALIZABLE' 表示事务隔离级别 SERIALIZABLE 的常量。 yii\db\Transaction

属性详细信息

隐藏继承的属性

$db 公共属性

此事务关联的数据库连接。

public yii\db\Connection $db null
$isActive 公共属性

此事务是否处于活动状态。只有活动事务才能 commit()rollBack()

public boolean $isActive null
$isolationLevel 公共属性

此事务要使用的隔离级别。可以是 READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE,也可以是包含 DBMS 特定语法的字符串,该字符串将在 SET TRANSACTION ISOLATION LEVEL 后使用。

public string $isolationLevel null
$level 公共属性

事务的当前嵌套级别。

public integer $level null

方法详细信息

隐藏继承的方法

__call() 公共方法

定义在: yii\base\BaseObject::__call()

调用不是类方法的命名方法。

不要直接调用此方法,因为它是一个 PHP 魔术方法,当调用未知方法时会隐式调用。

public mixed __call ( $name, $params )
$name string

方法名

$params 数组

方法参数

返回值 mixed

方法返回值

抛出 yii\base\UnknownMethodException

调用未知方法时

                public function __call($name, $params)
{
    throw new UnknownMethodException('Calling unknown method: ' . get_class($this) . "::$name()");
}

            
__construct() 公共方法

定义在: yii\base\BaseObject::__construct()

构造函数。

默认实现执行两件事

  • 使用给定的配置 $config 初始化对象。
  • 调用 init()

如果此方法在子类中被重写,建议

  • 构造函数的最后一个参数是一个配置数组,如这里的 $config
  • 在构造函数的末尾调用父级实现。
public void __construct ( $config [] )
$config 数组

用于初始化对象属性的键值对

                public function __construct($config = [])
{
    if (!empty($config)) {
        Yii::configure($this, $config);
    }
    $this->init();
}

            
__get() 公共方法

定义在: yii\base\BaseObject::__get()

返回对象属性的值。

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 $value = $object->property; 时会隐式调用。

另请参见 __set()

public mixed __get ( $name )
$name string

属性名

返回值 mixed

属性值

抛出 yii\base\UnknownPropertyException

如果属性未定义

抛出 yii\base\InvalidCallException

如果属性是只写

                public function __get($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter();
    } elseif (method_exists($this, 'set' . $name)) {
        throw new InvalidCallException('Getting write-only property: ' . get_class($this) . '::' . $name);
    }
    throw new UnknownPropertyException('Getting unknown property: ' . get_class($this) . '::' . $name);
}

            
__isset() 公共方法

定义在: yii\base\BaseObject::__isset()

检查属性是否已设置,即定义且不为空。

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 isset($object->property) 时会隐式调用。

注意,如果属性未定义,将返回 false。

另请参见 https://php.ac.cn/manual/en/function.isset.php

public boolean __isset ( $name )
$name string

属性名或事件名

返回值 boolean

命名的属性是否设置(不为空)。

                public function __isset($name)
{
    $getter = 'get' . $name;
    if (method_exists($this, $getter)) {
        return $this->$getter() !== null;
    }
    return false;
}

            
__set() 公共方法

定义在: yii\base\BaseObject::__set()

设置对象属性的值。

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 $object->property = $value; 时会隐式调用。

另请参见 __get()

public void __set ( $name, $value )
$name string

属性名或事件名

$value mixed

属性值

抛出 yii\base\UnknownPropertyException

如果属性未定义

抛出 yii\base\InvalidCallException

如果属性是只读

                public function __set($name, $value)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter($value);
    } elseif (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Setting read-only property: ' . get_class($this) . '::' . $name);
    } else {
        throw new UnknownPropertyException('Setting unknown property: ' . get_class($this) . '::' . $name);
    }
}

            
__unset() 公共方法

定义在: yii\base\BaseObject::__unset()

将对象属性设置为 null。

不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 unset($object->property) 时会隐式调用。

注意,如果属性未定义,此方法将不执行任何操作。如果属性是只读,它将抛出异常。

另请参见 https://php.ac.cn/manual/en/function.unset.php

public void __unset ( $name )
$name string

属性名

抛出 yii\base\InvalidCallException

如果属性是只读。

                public function __unset($name)
{
    $setter = 'set' . $name;
    if (method_exists($this, $setter)) {
        $this->$setter(null);
    } elseif (method_exists($this, 'get' . $name)) {
        throw new InvalidCallException('Unsetting read-only property: ' . get_class($this) . '::' . $name);
    }
}

            
begin() 公共方法

开始事务。

public void begin ( $isolationLevel null )
$isolationLevel string|null

此事务要使用的 隔离级别。可以是 READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE,但也可以是包含 DBMS 特定语法的字符串,在 SET TRANSACTION ISOLATION LEVEL 后使用。如果未指定(null),则不会显式设置隔离级别,将使用 DBMS 默认值。

注意: 此设置不适用于 PostgreSQL,在事务开始之前设置隔离级别无效。在这种情况下,您必须在事务开始后调用 setIsolationLevel()

注意: 某些 DBMS 仅允许为整个连接设置隔离级别,因此后续事务可能会获得相同的隔离级别,即使您没有指定任何级别。使用此功能时,您可能需要为所有事务显式设置隔离级别,以避免冲突的设置。在撰写本文时,受影响的 DBMS 是 MSSQL 和 SQLite。

从 2.0.16 版本开始,当开始嵌套事务并且底层 DBMS 不支持保存点时,此方法会抛出异常。

抛出 yii\base\InvalidConfigException

如果 $dbnull

抛出 yii\base\NotSupportedException

如果 DBMS 不支持嵌套事务

抛出 yii\db\Exception

如果 DB 连接失败

                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__);
        // make sure the transaction wasn't autocommitted
        if ($this->db->pdo->inTransaction()) {
            $schema->createSavepoint('LEVEL' . $this->_level);
        }
    } else {
        Yii::info('Transaction not started: nested transaction not supported', __METHOD__);
        throw new NotSupportedException('Transaction not started: nested transaction not supported.');
    }
    $this->_level++;
}

            
canGetProperty() 公共方法

定义在: yii\base\BaseObject::canGetProperty()

返回一个值,指示是否可以读取属性。

如果属性可读,则

  • 类具有与指定名称关联的 getter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);

另请参见 canSetProperty()

public boolean canGetProperty ( $name, $checkVars true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

返回值 boolean

属性是否可读

                public function canGetProperty($name, $checkVars = true)
{
    return method_exists($this, 'get' . $name) || $checkVars && property_exists($this, $name);
}

            
canSetProperty() 公共方法

定义在: yii\base\BaseObject::canSetProperty()

返回一个值,指示是否可以设置属性。

如果属性可写,则

  • 类具有与指定名称关联的 setter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);

另请参见 canGetProperty()

public boolean canSetProperty ( $name, $checkVars true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

返回值 boolean

属性是否可写

                public function canSetProperty($name, $checkVars = true)
{
    return method_exists($this, 'set' . $name) || $checkVars && property_exists($this, $name);
}

            
className() 公共静态方法
从 2.0.14 版本开始已弃用。在 PHP >=5.5 上,请使用 ::class 代替。

定义于: yii\base\BaseObject::className()

返回此类的完全限定名称。

public static string className ( )
返回值 string

此类的完全限定名称。

                public static function className()
{
    return get_called_class();
}

            
commit() 公共方法

提交事务。

public void commit ( )
抛出 yii\db\Exception

如果事务未处于活动状态

                public function commit()
{
    if (!$this->getIsActive()) {
        throw new Exception('Failed to commit transaction: transaction was inactive.');
    }
    $this->_level--;
    if ($this->_level === 0) {
        Yii::debug('Commit transaction', __METHOD__);
        // make sure the transaction wasn't autocommitted
        if ($this->db->pdo->inTransaction()) {
            $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__);
        // make sure the transaction wasn't autocommitted
        if ($this->db->pdo->inTransaction()) {
            $schema->releaseSavepoint('LEVEL' . $this->_level);
        }
    } else {
        Yii::info('Transaction not committed: nested transaction not supported', __METHOD__);
    }
}

            
getIsActive() 公共方法

返回一个值,指示此事务是否处于活动状态。

public boolean getIsActive ( )
返回值 boolean

此事务是否处于活动状态。只有活动事务才能 commit()rollBack()

                public function getIsActive()
{
    return $this->_level > 0 && $this->db && $this->db->isActive;
}

            
getLevel() 公共方法 (自版本 2.0.8 起可用)

public integer getLevel ( )
返回值 integer

事务的当前嵌套级别。

                public function getLevel()
{
    return $this->_level;
}

            
hasMethod() 公共方法

定义于: yii\base\BaseObject::hasMethod()

返回一个值,指示方法是否已定义。

默认实现调用 php 函数 method_exists()。当您实现 php 魔术方法 __call() 时,您可以重写此方法。

public boolean hasMethod ( $name )
$name string

方法名

返回值 boolean

该方法是否已定义

                public function hasMethod($name)
{
    return method_exists($this, $name);
}

            
hasProperty() 公共方法

定义于: yii\base\BaseObject::hasProperty()

返回一个值,指示属性是否已定义。

如果属性已定义,则

  • 该类具有与指定名称关联的 getter 或 setter 方法(在这种情况下,属性名称不区分大小写);
  • 类具有与指定名称相同的成员变量(当 $checkVars 为 true 时);

另请参见

public boolean hasProperty ( $name, $checkVars true )
$name string

属性名

$checkVars boolean

是否将成员变量视为属性

返回值 boolean

该属性是否已定义

                public function hasProperty($name, $checkVars = true)
{
    return $this->canGetProperty($name, $checkVars) || $this->canSetProperty($name, false);
}

            
init() 公共方法

定义于: yii\base\BaseObject::init()

初始化对象。

此方法在构造函数结束时调用,在对象使用给定配置初始化之后调用。

public void init ( )

                public function init()
{
}

            
rollBack() 公共方法

回滚事务。

public void rollBack ( )

                public function rollBack()
{
    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__);
        // make sure the transaction wasn't autocommitted
        if ($this->db->pdo->inTransaction()) {
            $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__);
        // make sure the transaction wasn't autocommitted
        if ($this->db->pdo->inTransaction()) {
            $schema->rollBackSavepoint('LEVEL' . $this->_level);
        }
    } else {
        Yii::info('Transaction not rolled back: nested transaction not supported', __METHOD__);
    }
}

            
setIsolationLevel() 公共方法

设置此事务的事务隔离级别。

此方法可用于在事务处于活动状态时设置隔离级别。但是,并非所有 DBMS 都支持此功能,因此您可能希望在调用 begin() 时直接指定隔离级别。

另请参见 https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels.

public void setIsolationLevel ( $level )
$level string

此事务要使用的隔离级别。可以是 READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE,也可以是包含 DBMS 特定语法的字符串,该字符串将在 SET TRANSACTION ISOLATION LEVEL 后使用。

抛出 yii\db\Exception

如果事务未处于活动状态

                public function setIsolationLevel($level)
{
    if (!$this->getIsActive()) {
        throw new Exception('Failed to set isolation level: transaction was inactive.');
    }
    Yii::debug('Setting transaction isolation level to ' . $level, __METHOD__);
    $this->db->getSchema()->setTransactionIsolationLevel($level);
}