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

| Автор: / School-PHPSchool-PHP.com | Количество просмотров: 14109
Начнём с самого простого, в 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;

Комментарии о School-PHP (0):


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

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

Персональный блог Ускова Станислава: School-PHP.com

В основном в данном блоке идут посадочные страницы с целью привлечения аудитории из Google и Yandex. Под каждый поисковый запрос создаётся отдельная страница, в итоге мы получаем много статей на разные темы, при этом полезны только для того, кто был заинтересован именно этим запросом. Для остальных же всё же советую сосредоточиться на прохождении общей программы курса!
Главная БАЗОВЫЙ КУРС ПЕРВЫЙ УРОВЕНЬ программирования ВТОРОЙ УРОВЕНЬ верстки ВТОРОЙ УРОВЕНЬ программирования Начать обучение Запуск проекта Мелкие трюки Делимся практикой трудоустройства Проверь свои знания Задачи по PHP MySQL Блог Отзывы