Тук трябва да научите два урока:
- Резервно копие на данни
- Изпълнете оператори UPDATE/DELETE в рамките на транзакция, за да можете да използвате
ROLLBACK
ако нещата не вървят по план
Да сте наясно с обработката на транзакциите (автоматично извършване, изрично и неявно) за вашата база данни може да ви спести от необходимостта да възстановявате данни от резервно копие.
Транзакциите контролират израза(ите) за манипулиране на данни, за да гарантират, че са атомарни. Да бъдеш „атомен“ означава, че транзакцията или се случва, или не. Единственият начин да сигнализирате за завършването на транзакцията в базата данни е чрез COMMIT
или ROLLBACK
оператор (съгласно ANSI-92, който за съжаление не включва синтаксис за създаване/започване на транзакция, така че е специфичен за доставчика). COMMIT
прилага промените (ако има такива), направени в рамките на транзакцията. ROLLBACK
пренебрегва всички действия, извършени в рамките на транзакцията – много желателно, когато оператор UPDATE/DELETE направи нещо непреднамерено .
Обикновено отделните оператори на DML (вмъкване, актуализиране, изтриване) се изпълняват в транзакция за автоматично извършване - те се ангажират веднага щом операторът завърши успешно. Което означава, че няма възможност за връщане на базата данни до състоянието преди изявлението да е било стартирано в случаи като вашия. Когато нещо се обърка, единствената налична опция за възстановяване е да се реконструират данните от резервно копие (при условие, че съществува). В MySQL автоматичното завършване е на по подразбиране за 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:Таблица, индекс, съхранена процедура, база данни и изрази за създаване или промяна.