Под транзакцией понимают выполнение группы SQL-запросов как единой операции. Иными словами либо выполняются все эти запросы, либо (если на каком-то этапе произошел сбой) отменяются все результаты их работы. Транзакции выполняются независимо друг от друга, т. е. до завершения транзакции блокируется доступ к объектам базы данных, подвергаемым обработке.
Транзакции поддерживаются в MySQL для таблиц типа BDB и InnoDB.
Транзакции не могут быть вложенными, т.к. всякий оператор, начинающий новую транзакцию, завершает предыдущую.
По умолчанию MySQL работает в режиме автоматического завершения транзакций, т. е. после выполнения всякого запроса, модифицирующего данные, результат сразу записывается в базе. Для объединения нескольких операторов в транзакцию можно отключить этот режим, используя системную переменную AUTOCOMMIT:
mysql> SET AUTOCOMMIT=0;
После этого для завершения транзакции (и сохранения изменений) следует использовать оператор COMMIT, а для отмены всех действий — оператор ROLLBACK, например:
mysql> SET AUTOCOMMIT=0;
mysql> INSERT INTO table VALUES (val1, val2);
mysql> SELECT * FROM table;
mysql> ROLLBACK;
mysql> INSERT INTO table VALUES (val3, val4);
mysql> SELECT * FROM table;
mysql>COMMIT;
mysql> SET AUTOCOMMIT=1;
Объединить последовательность запросов в транзакцию можно также с использованием стандартного оператора SET TRANSACTION:
mysql> SET TRANSACTION.
mysql> INSERT INTO table VALUES (value1, value2);
mysql> SELECT * FROM table;
mysql>COMMIT;
Наконец, в MySQL (для таблиц InnoDB) существует еще одна возможность определить транзакцию: операторы SAVEPOINT и ROLLBACK TO SAVEPOINT. Первый из них устанавливает именованную точку начала транзакции; второй позволяет в случае необходимости сделать откат к состоянию, в котором находилась база в момент установки именованной точки. Если выполняется оператор COMMIT или ROLLBACK без указания имени точки возврата, все именованные точки удаляются. Например:
mysql> SAVEPOINT mypoint;
mysql> INSERT INTO table VALUES (value1, value2);
mysql> SELECT * FROM table;
mysql> ROLLBACK TO SAVEPOINT mypoint;