Исполнение транзакций


Короткая нотация

Yii::$app->db->transaction(function($db) {
    $db->createCommand($sql1)->execute();
    $db->createCommand($sql2)->execute();
    // ... executing other SQL statements ...
});

Длинная нотация

$db = Yii::$app->db;
$transaction = $db->beginTransaction();

try {
    $db->createCommand($sql1)->execute();
    $db->createCommand($sql2)->execute();
    // ... executing other SQL statements ...

    $transaction->commit();

} catch(\Exception $e) {

    $transaction->rollBack();

    throw $e;
}

Указание уровня изоляции

//yii\db\Transaction::READ_UNCOMMITTED - низший уровень, "Грязное" чтение
//yii\db\Transaction::READ_COMMITTED - предотвращает "Грязное" чтение.
//yii\db\Transaction::REPEATABLE_READ - предотвращает "Грязное" чтение и не повторяющееся чтение.
//yii\db\Transaction::SERIALIZABLE - высший уровень, предотвращает все вышеуказанные проблемы.

$isolationLevel = \yii\db\Transaction::REPEATABLE_READ;

Yii::$app->db->transaction(function ($db) {
    ...
}, $isolationLevel);

Вложенные транзакции

Yii::$app->db->transaction(function ($db) {
    // outer transaction

    $db->transaction(function ($db) {
        // inner transaction
    });
});

В длинной нотации

$db = Yii::$app->db;
$outerTransaction = $db->beginTransaction();
try {
    $db->createCommand($sql1)->execute();

    $innerTransaction = $db->beginTransaction();
    try {
        $db->createCommand($sql2)->execute();
        $innerTransaction->commit();
    } catch (\Exception $e) {
        $innerTransaction->rollBack();
    }

    $outerTransaction->commit();
} catch (\Exception $e) {
    $outerTransaction->rollBack();
}