Статьи

MySQL Transaction Gotchas & Good Parts

В моем предыдущем посте «Транзакции 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 .