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 Станислава:
напишите мой скайп
(есть вверху страницы)
Введите комментарий:

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

Главная БАЗОВЫЙ КУРС ПЕРВЫЙ УРОВЕНЬ программирования ВТОРОЙ УРОВЕНЬ верстки ВТОРОЙ УРОВЕНЬ программирования Начать обучение Запуск проекта Мелкие трюки Проверь свои знания Задачи по PHP MySQL Блог Отзывы