Как откатить изменения, внесенные в базу данных при наличии Try Catch Statement в PHP? - PullRequest
1 голос
/ 04 ноября 2011

Я использую операторы try catch почти в каждом из моих операторов вставки или обновления на сайте, построенном на PHP и MySQL. В случае чего-то вроде:

try {
    //do insert or update
}

catch (PDOException $e) {
   $db->rollback();
   //do something with error $e
}

в этом примере, если произойдет ошибка, все, что было сделано с БД, будет откатано (изменения отменены), и все будет "хорошо". Однако я не уверен, как справляться с ситуациями, когда в одной попытке / перехвате существует несколько операторов вставки или обновления - как даже несколько попыток / перехватов на одной странице.

В конечном итоге я пытаюсь решить: если в скрипте обнаружена ошибка, которая не позволяет завершить один оператор вставки / обновления (try / catch), откатить изменения, внесенные во ВСЕ таблицы в этом конкретном скрипте.

Есть ли надежный способ сделать это?

Ответы [ 3 ]

2 голосов
/ 04 ноября 2011

Самый простой способ откатить изменения - убедиться в трех основных вещах:

  • Использовать START TRANSACTION/COMMIT или START TRANSACTION/ROLLBACK
  • Все таблицы, используемые в Транзакции, используют InnoDBStorage Engine
  • Используйте CHECKPOINT, если вы хотите откатить некоторые INSERT / UPDATE, а не все

CAVEAT

Пожалуйста, убедитесь, что вы не выдает ни однойследующие команды в середине транзакции, потому что они запускают неявный COMMIT и начинают новую транзакцию:

  • ALTER TABLE
  • BEGIN
  • CREATE INDEX
  • DROP DATABASE
  • DROP INDEX
  • DROP TABLE
  • RENAME TABLE
  • TRUNCATE TABLE
  • LOCK TABLES
  • UNLOCK TABLES
  • SET AUTOCOMMIT = 1
  • START TRANSACTION
2 голосов
/ 04 ноября 2011

Вам не нужно иметь только одно действие в каждой транзакции.Вы можете иметь несколько.

Например:

Когда вы заходите в банкомат: войдите, получите наличные.выйти.войдите в систему. внесите депозит.выйти.(и на ..)
ИЛИ Вы Войти. Получите деньги, внесите депозит.(и на ...) выйти.

1 голос
/ 04 ноября 2011

Самый простой способ - использовать ADOdb для PHP с таблицами InnoDB и типом базы данных "mysqlt".DBAL следит за всеми изменениями, внесенными во время транзакции, и откатит их для вас, если их попросят.

...