Транзакции

Транзакции — серия SQL-запросов, которые должны выполниться. Если в одном из запросов происходит ошибка, отменяется вся транзакция, т.е. база данных приобретает вид до начала выполнения транзакции.

Транзакции полезны при совершении оплаты. Например, надо перевести 10 000 руб с одного пользователя другому. Код списания может выполниться, а в коде зачисления может случиться ошибка, и тогда пользователь просто потеряет 10 000 руб. В случае транзакции, при ошибки все операции отменятся.

Например, в этом коде будет ошибка:

// запрос выполнится
Yii::$app->db->createCommand()->update('user', ['balance' => 5000], 'id=14')->execute();

// здесь будет ошибка
Yii::$app->db->createCommand()->update('user', ['balance' => 10000], 'idx=24')->execute();

Во втором запросе передано поле «idx», которого нет в базе данных, из-за чего будет ошибка. При этом первый запрос выполнится и у пользователя обновятся данные баланса.

Чтобы такого не происходило, можно использовать транзакции, которые реализуются через метод Yii::$app->db->transaction().

Yii::$app->db->transaction(function($db) {
    Yii::$app->db->createCommand()->update('user', ['balance' => 5000], 'id=14')->execute();
    Yii::$app->db->createCommand()->update('user', ['balance' => 10000], 'id=24')->execute();
});

В примере выше выполняться все запросы. Если в одном из запросов будет ошибка, то данные вернутся в исходное значение.