В моем предыдущем посте «Транзакции MySQL и почему вы не можете эмулировать их в PHP» мы обсуждали, почему транзакции полезны и как несколько простых команд SQL могут сделать ваше приложение более устойчивым. Но в жизни веб-разработчика так мало вещей…
Заявления, которые вы не можете откатить
К сожалению, ROLLBACK не является глобальной отменой для каждого действия базы данных. Если вы внесете фундаментальное изменение в схему, любые существующие транзакции будут выполнены в режиме COMMIT, и изменение будет выполнено в рамках отдельной транзакции. Заявления, на которые следует обратить внимание:
- СОЗДАТЬ БАЗУ ДАННЫХ
- ALTER DATABASE
- DROP DATABASE
- СОЗДАТЬ СТОЛ
- ALTER TABLE
- DROP TABLE
- Переименовать таблицу
- TRUNCATE TABLE
- СОЗДАТЬ ИНДЕКС
- Индекс капли
- СОЗДАТЬ СОБЫТИЕ
- DROP EVENT
- СОЗДАТЬ ФУНКЦИЮ
- ФУНКЦИЯ КАПЛИ
- СОЗДАТЬ ПРОЦЕДУРУ
- ПРОЦЕДУРА КАПЛИ
По сути, вы не можете отменить серьезные изменения в базе данных, например:
START TRANSACTION;
DROP TABLE MyImportantData;
-- existing (empty) transaction is COMMIT-ed
-- table is dropped permanently
ROLLBACK;
-- no chance, mate - your data's gone
Можно создавать CREATE, ALTER и DROP временные таблицы, не вызывая неявный COMMIT. Однако невозможно откатить эти действия.
Точки сохранения
Мы достаточно много слышали об исключениях, поэтому давайте посмотрим на другие хорошие моменты. Точки сохранения — это фактически именованные местоположения в вашей транзакции. Вы можете выполнить ROLLBACK для любого SAVEPOINT, не затрагивая более ранние обновления SQL … это немного похоже на палитру History в Photoshop.
Примером является самый простой способ продемонстрировать точки сохранения:
START TRANSACTION;
-- add record to tableA
INSERT INTO tableA VALUES (1,2,3);
-- create a savepoint
SAVEPOINT tableAupdated;
-- add record to tableB
INSERT INTO tableB VALUES (4,5,6);
-- Whoops! Let's undo the tableB updates...
ROLLBACK TO tableAupdated;
-- Only tableA is updated
COMMIT;
Вы можете установить и ROLLBACK TO любое количество идентификаторов SAVEPOINT в вашей транзакции.
При желании вы можете удалить точку сохранения, используя:
RELEASE SAVEPOINT savepointName;
Все точки сохранения удаляются, когда в транзакции происходит COMMIT или ROLLBACK.
Транзакции и точки сохранения просты в использовании и защищают ваши ценные данные таблицы InnoDB. Есть ли причина продолжать использовать MyISAM?
Если вы хотите узнать больше от Крейга, подпишитесь на нашу еженедельную новостную рассылку Tech Times .