Особенность её есть в том, что можно не переживать по поводу включения и отключения транзакций, функция всё делает сама. Транзакции - это такая операция, когда необходимо выполнить несколько запросов подряд и быть уверенным, что все операции были успешно выполнены. Примером может послужить: добавить денег пользователю и внести в лог информацию о том, что деньги были добавлены таким-то путём. Если стандартно вызвать подряд функции:
q("UPDATE `users` SET `money` = `money` + 100 WHERE `id` = 1");
q("INSERT INTO `logs` SET `user_id` = 1, `money` = 100, `comments` = 'бонусы за переход по ссылке'");
А теперь представим, что у нас синтаксическая ошибка на второй функции, или сервер отрубился, то деньги начислятся, а откуда они пришли - нет. Вот тут и используют транзакции, когда невозможно выполнить одну операцию без второй и в случае ошибки ни одна из операций не будет выполнена. А делается очень просто:
DB::_()->begin_transaction();
q("UPDATE `users` SET `money` = `money` + 100 WHERE `id` = 1");
q("INSERT INTO `logs` SET `user_id` = 1, `money` = 100, `comments` = 'бонусы за переход по ссылке'");
DB::_()->commit();
Для тех, кто не знаком с синтаксисом Creative FW (разработанный в данном курсе) представлю данный код в простом понимании:
$mysqli = new mysqli(...);
try {
$mysqli->begin_transaction();
$mysqli->query("UPDATE `users` SET `money` = `money` + 100 WHERE `id` = 1");
$mysqli->query("INSERT INTO `logs` SET `user_id` = 1, `money` = 100, `comments` = 'бонусы за переход по ссылке'");
$mysqli->commit();
} catch (Exception $e) {
$mysqli->rollback();
}
Стоит обратить внимание вот на что, в случае exit или die (любой остановки скрипта) все запросы внутри последней незавершенной транзакции (началом транзакции есть begin_transaction, завершением - commit или rollback, будут автоматически считаться незавершенными, это значит, что в БД ничего не будет добавлено в случае:
DB::_()->begin_transaction();
q("UPDATE `users` SET `money` = `money` + 100 WHERE `id` = 1");
exit;
Комментарии о School-PHP (0):