School PHP

mysqli begin_transaction - транзакции

Начнём с самого простого, в php с 5.5 ввели новые функции, одна из которых begin_transaction для mysqli. Интересно, сколько людей пользуются данной функцией, когда она ещё не задокументирована даже на php.net. Ну что же, мы обгоним официальную документацию и напишем об этом в нашем блоге, а новые ученики на втором уровне смогут вовсю насладиться транзакциями в своих проектах.

Особенность её есть в том, что можно не переживать по поводу включения и отключения транзакций, функция всё делает сама. Транзакции - это такая операция, когда необходимо выполнить несколько запросов подряд и быть уверенным, что все операции были успешно выполнены. Примером может послужить: добавить денег пользователю и внести в лог информацию о том, что деньги были добавлены таким-то путём. Если стандартно вызвать подряд функции:

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;

Комментарии на странице(0):

Напишите свой комментарий:
Имя:
E-mail:
на него отправится ответ
Skype Станислава:
напишите мой скайп
(есть вверху страницы)
Введите комментарий:

* Комментарий при отправке отправляется на пре-модерацию. Вынужденная защита от спама, чтобы сайт был чистым.

Войти | Регистрация