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 は、DBトランザクションを表します。

通常、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;
}

注記: 上記のコードでは、PHP 5.x と PHP 7.x との互換性のために2つのcatchブロックがあります。\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() プロパティが設定されているかどうか(つまり、定義されていてnullではないか)を確認します。 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 property

このトランザクションが関連付けられているデータベース接続。

public yii\db\Connection $db null
$isActive public プロパティ

このトランザクションがアクティブかどうかを示します。アクティブなトランザクションのみが、commit()またはrollBack()を実行できます。

public boolean $isActive null
$isolationLevel public プロパティ

このトランザクションで使用するトランザクション分離レベルです。READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE のいずれか、または`SET TRANSACTION ISOLATION LEVEL`の後に使用するDBMS固有の構文を含む文字列を指定できます。

public string $isolationLevel null
$level public プロパティ

トランザクションの現在のネストレベル。

public integer $level null

メソッドの詳細

継承されたメソッドを非表示

__call() public メソッド

定義場所: 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() public メソッド

定義場所: yii\base\BaseObject::__construct()

コンストラクタ。

デフォルトの実装では、次の2つのことを行います。

  • 指定された設定`$config`を使用してオブジェクトを初期化します。
  • init()を呼び出します。

このメソッドを子クラスでオーバーライドする場合は、

  • コンストラクタの最後の引数を`$config`のように設定配列にすることをお勧めします。
  • コンストラクタの最後に親の実装を呼び出してください。
public void __construct ( $config = [] )
$config 配列

オブジェクトのプロパティを初期化するために使用される名前と値のペア

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

            
__get() public メソッド

定義場所: yii\base\BaseObject::__get()

オブジェクトプロパティの値を返します。

`$value = $object->property;`を実行した際に暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

__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() public メソッド

定義場所: yii\base\BaseObject::__isset()

プロパティが設定されているかどうか(つまり、定義されていてnullではないか)を確認します。

`isset($object->property)`を実行した際に暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

プロパティが定義されていない場合は、falseが返されることに注意してください。

https://www.php.net/manual/en/function.isset.phpも参照してください。

public boolean __isset ( $name )
$name string

プロパティ名またはイベント名

戻り値 boolean

指定されたプロパティが設定されているかどうか(nullではないか)。

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

            
__set() public メソッド

定義場所: yii\base\BaseObject::__set()

オブジェクトプロパティの値を設定します。

`$object->property = $value;`を実行した際に暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

__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() public メソッド

定義場所: yii\base\BaseObject::__unset()

オブジェクトプロパティをnullに設定します。

`unset($object->property)`を実行した際に暗黙的に呼び出されるPHPのマジックメソッドであるため、直接呼び出さないでください。

プロパティが定義されていない場合は、このメソッドは何もしません。プロパティが読み取り専用の場合は、例外をスローします。

https://www.php.net/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メソッド

トランザクションを開始します。

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

このトランザクションに使用する分離レベルです。READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLEのいずれか、または`SET TRANSACTION ISOLATION LEVEL`の後に使用されるDBMS固有の構文を含む文字列を指定できます。指定しない場合(`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() publicメソッド

定義場所: yii\base\BaseObject::canGetProperty()

プロパティを読み取ることができるかどうかを示す値を返します。

プロパティは、以下の場合に読み取り可能です。

  • クラスに、指定された名前と関連付けられたゲッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
  • クラスに、指定された名前のメンバ変数がある場合($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() publicメソッド

定義場所: yii\base\BaseObject::canSetProperty()

プロパティを設定できるかどうかを示す値を返します。

プロパティは、以下の場合に書き込み可能です。

  • クラスに、指定された名前と関連付けられたセッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
  • クラスに、指定された名前のメンバ変数がある場合($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() public staticメソッド
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メソッド

トランザクションをコミットします。

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メソッド

このトランザクションがアクティブかどうかを示す値を返します。

public boolean getIsActive ( )
戻り値 boolean

このトランザクションがアクティブかどうかを示します。アクティブなトランザクションのみが、commit()またはrollBack()を実行できます。

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

            
getLevel() publicメソッド (バージョン2.0.8から利用可能)

public integer getLevel ( )
戻り値 integer

トランザクションの現在のネストレベル。

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

            
hasMethod() publicメソッド

定義場所: 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() publicメソッド

定義場所: yii\base\BaseObject::hasProperty()

プロパティが定義されているかどうかを示す値を返します。

プロパティは、以下の場合に定義されています。

  • クラスに、指定された名前と関連付けられたゲッターまたはセッターメソッドがある場合(この場合、プロパティ名はケースインセンシティブです)。
  • クラスに、指定された名前のメンバ変数がある場合($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() publicメソッド

定義場所: yii\base\BaseObject::init()

オブジェクトを初期化します。

このメソッドは、オブジェクトが指定された設定で初期化された後、コンストラクタの最後に呼び出されます。

public void init ( )

                public function init()
{
}

            
rollBack() publicメソッド

トランザクションをロールバックします。

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() publicメソッド

このトランザクションのトランザクション分離レベルを設定します。

このメソッドは、トランザクションが既にアクティブな状態で分離レベルを設定するために使用できます。ただし、これはすべてのDBMSでサポートされているわけではないため、begin()を呼び出す際に直接分離レベルを指定する方が良い場合があります。

https://en.wikipedia.org/wiki/Isolation_(database_systems)#Isolation_levelsも参照してください。

public void setIsolationLevel ( $level )
$level string

このトランザクションで使用するトランザクション分離レベルです。READ_UNCOMMITTEDREAD_COMMITTEDREPEATABLE_READSERIALIZABLE のいずれか、または`SET TRANSACTION ISOLATION LEVEL`の後に使用する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);
}