Знание обработки транзакций (автокоммит, явный и неявный) для вашей базы данных может избавить вас от необходимости восстанавливать данные из резервной копии.
Транзакции управляют оператором (ами) обработки данных, чтобы гарантировать их атомарность. Быть «атомным» означает, что транзакция либо происходит, либо нет. Единственный способ сообщить о завершении транзакции в базу данных - использовать оператор COMMIT
или ROLLBACK
(согласно ANSI-92, который, к сожалению, не включает синтаксис для создания / начала транзакции, поэтому он зависит от поставщика). COMMIT
применяет изменения (если таковые имеются), сделанные в рамках транзакции. ROLLBACK
игнорирует любые действия, которые имели место в транзакции - очень желательно, когда инструкция UPDATE / DELETE делает что-то непреднамеренное .
Обычно отдельные операторы DML (вставка, обновление, удаление) выполняются в транзакции автоматического подтверждения - они фиксируются, как только оператор успешно завершается. Это означает, что нет возможности откатить базу данных до состояния до запуска оператора в таких случаях, как ваш. Если что-то идет не так, единственный доступный вариант восстановления - восстановить данные из резервной копии (если она существует). В 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 (язык определения данных) автоматически фиксируются - им не требуется оператор COMMIT. IE: таблица, индекс, хранимая процедура, база данных и операторы создания или изменения представления.