Ответ 1
Осознание транзакции (автоматическая, явная и неявная) обработка вашей базы данных может избавить вас от необходимости восстанавливать данные из резервной копии.
Операции (транзакции) управления операциями управления транзакциями, чтобы гарантировать, что они являются атомарными. Быть "атомарным" означает, что транзакция либо происходит, либо нет. Единственный способ сигнализировать о завершении транзакции в базу данных - это использовать оператор COMMIT
или ROLLBACK
(для ANSI-92, который, к сожалению, не содержит синтаксиса для создания/начала транзакции, поэтому он специфичен для поставщика). COMMIT
применяет изменения (если таковые имеются) в транзакции. ROLLBACK
игнорирует любые действия, произошедшие в транзакции - очень желательно, когда инструкция UPDATE/DELETE делает что-то непреднамеренное.
Обычно отдельные транзакции DML (Insert, Update, Delete) выполняются в транзакции autocommit - они фиксируются, как только оператор успешно завершается. Это означает, что нет возможности откатить базу данных до состояния до того, как оператор был запущен в таких случаях, как ваш. Когда что-то пойдет не так, единственной возможностью восстановления является восстановление данных из резервной копии (при условии, что она существует). В MySQL autocommit по умолчанию по для InnoDB - MyISAM не поддерживает транзакции. Его можно отключить, используя:
SET autocommit = 0
Явная транзакция заключается в том, когда оператор обернуты внутри явно определенного блока кода транзакции - для MySQL, START TRANSACTION
. Он также требует явно сделанного оператора COMMIT
или ROLLBACK
в конце транзакции. Вложенные транзакции выходят за рамки этой темы.
Неявные транзакции немного отличаются от явных. Неявные транзакции не требуют объяснения транзакции. Однако, как и явные транзакции, они требуют инструкции COMMIT
или ROLLBACK
.
Заключение
Явные транзакции - самое идеальное решение - для этого требуется инструкция COMMIT
или ROLLBACK
, чтобы завершить транзакцию, и то, что происходит, четко указано для чтения другими, если есть необходимость. Неявные транзакции в порядке, если вы работаете с базой данных в интерактивном режиме, но операторы COMMIT
должны указываться только после того, как результаты были протестированы и тщательно определены как действительные.
Это означает, что вы должны использовать:
SET autocommit = 0;
START TRANSACTION;
UPDATE ...;
... и используйте только COMMIT;
, когда результаты верны.
Тем не менее, инструкции UPDATE и DELETE обычно возвращают только количество затронутых строк, а не конкретные данные. Преобразуйте такие выражения в операторы SELECT и просмотрите результаты, чтобы обеспечить правильность до, чтобы выполнить оператор UPDATE/DELETE.
Добавление
Операторы DDL (Data Definition Language) автоматически фиксируются - они не требуют инструкции COMMIT. IE: инструкции таблицы, индекса, хранимой процедуры, базы данных и представления или изменения.