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

Практически вы соберете множество SQL-запросов в группу, и вы будете выполнять их все вместе как часть транзакции.

Свойства транзакций

Транзакции имеют следующие четыре стандартных свойства, обычно называемые аббревиатурой ACID

Atomicity − это гарантирует, что все операции в рабочем блоке будут успешно завершены; в противном случае транзакция прерывается в момент сбоя, а предыдущие операции возвращаются в прежнее состояние.

Consistency − это гарантирует, что база данных будет правильно изменять состояния при успешной транзакции.

Isolation − Это позволяет транзакциям работать независимо друг от друга и прозрачно друг к другу.

Durability − это гарантирует, что результат или эффект совершенной транзакции сохраняется в случае сбоя системы.

В MySQL транзакции начинаются с инструкции BEGIN WORK и заканчиваются либо операцией COMMIT, либо ROLLBACK . Команды SQL между инструкциями начала и окончания составляют основную часть транзакции.

COMMIT и ROLLBACK

Эти два ключевых слова Commit and Rollback используются в основном для транзакций MySQL.

  • Когда успешная транзакция завершена, команда COMMIT должна быть выпущена так, чтобы изменения во всех задействованных таблицах вступили в силу.
  • Если произошел сбой, должна быть выдана команда ROLLBACK, чтобы вернуть каждую таблицу, указанную в транзакции, в ее предыдущее состояние.

Вы можете контролировать поведение транзакции, задав переменную сеанса AUTOCOMMIT . Если для параметра AUTOCOMMIT установлено значение 1 (по умолчанию), то каждый оператор SQL (в рамках транзакции или нет) считается полной транзакцией и совершается по умолчанию при завершении.

Если для AUTOCOMMIT установлено значение 0, выдавая команду SET AUTOCOMMIT = 0 , последующая серия операторов действует как транзакция, и никакие действия не выполняются до тех пор, пока не будет выдан явный отчет COMMIT.

Вы можете выполнить эти SQL-команды в PHP с помощью функцииmysql_query () .

Общий пример транзакции

Эта последовательность событий не зависит от используемого языка программирования. Логический путь может быть создан на любом языке, который вы используете для создания своего приложения.

Вы можете выполнить эти SQL-команды в PHP с помощью функцииmysql_query () .

  • Начните транзакцию, выпустив команду SQL BEGIN WORK .
  • Выполните одну или несколько команд SQL, таких как SELECT, INSERT, UPDATE или DELETE.
  • Проверьте, нет ли ошибки, и все зависит от вашего требования.
  • Если есть какая-либо ошибка, выполните команду ROLLBACK, иначе выполните команду COMMIT.

Типы таблиц транзакций в MySQL

Вы не можете использовать транзакции напрямую, но за некоторыми исключениями вы можете. Однако они небезопасны и гарантированы. Если вы планируете использовать транзакции в своем MySQL-программировании, вам необходимо создать свои таблицы особым образом. Существует множество типов таблиц, которые поддерживают транзакции, но самым популярным является InnoDB .

Для поддержки таблиц InnoDB требуется компиляция при компиляции MySQL из источника. Если ваша версия MySQL не поддерживает InnoDB, попросите своего поставщика услуг Интернета создать версию MySQL с поддержкой типов таблиц InnoDB или загрузить и установить бинарное распределение MySQL-Max для Windows или Linux / UNIX и работать со типом таблицы в среды разработки.

Если ваша установка MySQL поддерживает таблицы InnoDB, просто добавьте определение TYPE = InnoDB в инструкцию создания таблицы.

Например, следующий код создает таблицу InnoDB, называемую tcount_tbl

root@host# mysql -u root -p password;
Enter password:*******

mysql> use TUTORIALS;
Database changed

mysql> create table tcount_tbl
   -> (
   -> tutorial_author varchar(40) NOT NULL,
   -> tutorial_count  INT
   -> ) TYPE = InnoDB;
Query OK, 0 rows affected (0.05 sec)