类 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 |
属性详细信息
此事务要使用的隔离级别。可以是 READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE,也可以是包含 DBMS 特定语法的字符串,该字符串将在 SET TRANSACTION ISOLATION LEVEL
后使用。
方法详细信息
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()");
}
定义在: 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();
}
定义在: 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);
}
定义在: yii\base\BaseObject::__isset()
检查属性是否已设置,即定义且不为空。
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 isset($object->property)
时会隐式调用。
注意,如果属性未定义,将返回 false。
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;
}
定义在: 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);
}
}
定义在: yii\base\BaseObject::__unset()
将对象属性设置为 null。
不要直接调用此方法,因为它是一个 PHP 魔术方法,在执行 unset($object->property)
时会隐式调用。
注意,如果属性未定义,此方法将不执行任何操作。如果属性是只读,它将抛出异常。
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);
}
}
开始事务。
public void begin ( $isolationLevel = null ) | ||
$isolationLevel | string|null |
此事务要使用的 隔离级别。可以是 READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE,但也可以是包含 DBMS 特定语法的字符串,在
从 2.0.16 版本开始,当开始嵌套事务并且底层 DBMS 不支持保存点时,此方法会抛出异常。 |
抛出 | yii\base\InvalidConfigException |
如果 $db 为 |
---|---|---|
抛出 | 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++;
}
定义在: 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);
}
定义在: 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);
}
::class
代替。
定义于: yii\base\BaseObject::className()
返回此类的完全限定名称。
public static string className ( ) | ||
返回值 | string |
此类的完全限定名称。 |
---|
public static function className()
{
return get_called_class();
}
提交事务。
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__);
}
}
返回一个值,指示此事务是否处于活动状态。
public boolean getIsActive ( ) | ||
返回值 | boolean |
此事务是否处于活动状态。只有活动事务才能 commit() 或 rollBack()。 |
---|
public function getIsActive()
{
return $this->_level > 0 && $this->db && $this->db->isActive;
}
public integer getLevel ( ) | ||
返回值 | integer |
事务的当前嵌套级别。 |
---|
public function getLevel()
{
return $this->_level;
}
定义于: 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);
}
定义于: 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);
}
public void init ( ) |
public function init()
{
}
回滚事务。
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__);
}
}
设置此事务的事务隔离级别。
此方法可用于在事务处于活动状态时设置隔离级别。但是,并非所有 DBMS 都支持此功能,因此您可能希望在调用 begin() 时直接指定隔离级别。
另请参见 https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levels.
public void setIsolationLevel ( $level ) | ||
$level | string |
此事务要使用的隔离级别。可以是 READ_UNCOMMITTED、READ_COMMITTED、REPEATABLE_READ 和 SERIALIZABLE,也可以是包含 DBMS 特定语法的字符串,该字符串将在 |
抛出 | 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);
}
注册 或 登录 以发表评论。