Усвідомлення обробки транзакцій (автокомісія, явна та неявна) для вашої бази даних може позбавити вас від необхідності відновлення даних із резервної копії.
Транзакції контролюють заяву (і) про маніпулювання даними, щоб переконатися, що вони є атомними. Будучи "атомною" означає, що транзакція або відбувається, або не відбувається. Єдиний спосіб сигналізувати про завершення транзакції в базі даних - використовувати 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: Таблиця, індекс, збережена процедура, база даних та оператори створення або зміни подання.