Есть след. код: Код (PHP): //Отмена автоматического подтверждения выполнения SQL запросов в базе данных (отключение режима фиксации). mysqli_autocommit($db, FALSE); ... //Разные запросы. ... //Подтверждение выполнения транзакции. mysqli_commit($db); //Включение автоматического подтверждения выполнения SQL запросов в базе данных. mysqli_autocommit($db, TRUE); ... //Разные запросы. ... Правильная ли работа с транзакциями?
Да, rollback не указал. Он подключается к каждому запросу в транзакции и выводится, если запрос обработан неправильно. Тип таблиц InnoDB. А в общем схема правильная?
В виде запросов их посылать не правильно нонче. Посылать их надобно в виде функций специальных, в доках прописанных. Равно как и функциями надлежит выставлять кодировку.
Когда тебе нужна гарантия, что твой запрос будет выполнен без ошибок и сбоев - используй транзакцию. Когда нужно выполнить либо несколько связных запросов одним пакетом, либо ни один из них (если выполнится только половина, а потом сервер упадет из-за отключки электричества, сломается логика данных, например), используй транзакцию. Ну и грамотно надо пользоваться коммитами и роллбеками. Нужно тебе 10 запросов выполнить пачкой - начни транзакцию. Если ошибок нет, подтверждай, и тогда изменения запечатлятся в БД. Если какой-то сбой - роллбек. И типа ничего и не было.
eldor там где гонка есть, например списание денег, могут быстро запустить страницу которая списывает деньги за покупку например 3 раза и без транзакции может списаться больше чем есть на счёте и ты этого не увидишь
Такие проблемы, имхо, надо решать на уровне ПХП. Лишние запросы просто не должны доходить до бд. "Желтый" флаг, что запрос отправлен, должен проставляться где-то в сессии до работы БД. И последующие запросы должны об этот флаг разбиваться. А там, либо он превратится в "зеленый", и юзеру будет сказано, что все ок, либо красный, юзеру будет сказано, что был феил. Доводить гонку до БД - нецелесообразно.
При работе транзакции для нескольких запросов доступ извне ограничивается только для записей, которые затрагивают запросы в транзакции или ко всем таблицам, которые находятся в запросах внутри транзакции?