Это довольно широкий вопрос, поэтому я постараюсь охватить все, что смогу.
Сначала вы можете игнорировать mysqli api (специфичные для api функции транзакций - это просто оболочки)и перейдите прямо к руководству MySQL .Здесь важно то, что отключение автоматической фиксации и запуск транзакции - это одно и то же.Также один запрос (включая модификации триггерами) всегда является транзакцией.
Ответ на ваш вопрос 1 и 2 «вероятно, нет».Это очень сильно зависит от того, что ваш существующий код предполагает относительно подключения к базе данных, и от того, как структурировано ваше приложение.
Из того, что вы упомянули в вопросе, ответ будет таким: будет лучше, если вы будете размещать транзакции только в тех местах, где они нужны.
Для вопроса 3: он не будет фиксироваться автоматически,Однако вы можете сделать это, используя register_shutdown_function , хотя я не рекомендую это делать.
Существуют операторы ( неявные коммиты ), которые будут фиксироватьтранзакция автоматически.К ним относятся все операторы DDL (CREATE, ALTER ...), а также TRUCNATE, LOCK TABLES и другие.В основном это означает, что эти операторы не могут использоваться в транзакциях.
MySQL откатывает транзакции, когда соединение разрывается.
Я бы рекомендовал добавлять транзакции только в тот код, который нуждается в них (для безопасности вы можете сделать это для всего кода, который выполняет более одного запроса записи в БД).
Классический подход:
START TRANSACTION
query
other things
another query
some other stuff
3-rd query
...
COMMIT
Главное здесь - убедиться, что вы делаете коммит, только если ошибок не было.
Оставьте откат до завершения соединения (или register_shutdown_function
, если вы используете постоянные соединения), потому что убедиться, что каждый скрипт имеет корректно работающую логику отката, сложно:)
Это гарантирует, что ничего не будет совершено, если произойдут плохие вещи (исключения, фатальные ошибки, ограничения времени / памяти, перебои в подаче электроэнергии, метеоры ...).
Также возможно иметь транзакции в функции / методеуровень (вложенный и подобный стеку), но это выходит за рамки этого вопроса.