Использование точек сохранения (сэйвпоинтов) для частичного отката
На этом этапе вы узнаете, как использовать точки сохранения (сэйвпоинты) в рамках транзакции для выполнения частичного отката. Точки сохранения - это метки в транзакции, к которым вы можете вернуться, тем самым отменяя только некоторые изменения, внесенные в рамках транзакции, а не всю транзакцию целиком.
Продолжая с предыдущего этапа, вы должны быть по-прежнему подключены к серверу MySQL. Если это не так, подключитесь снова с помощью следующей команды:
mysql -u root -p
Введите пароль, если вас об этом попросят, а затем выберите базу данных labex_db
:
USE labex_db;
Теперь начнем новую транзакцию:
BEGIN;
Сначала создадим точку сохранения с именем savepoint1
:
SAVEPOINT savepoint1;
Эта команда создает точку сохранения с именем savepoint1
. Любые изменения, внесенные после этой точки сохранения, могут быть отменены, вернувшись к ней.
Теперь обновим баланс счета 'ACC001':
UPDATE accounts SET balance = balance - 200 WHERE account_number = 'ACC001';
Далее создадим еще одну точку сохранения с именем savepoint2
:
SAVEPOINT savepoint2;
Теперь вставим новую запись в таблицу accounts
:
INSERT INTO accounts (account_number, balance) VALUES ('ACC004', 300.00);
Предположим, что вы решили отменить вставку записи о счете 'ACC004', но сохранить обновление баланса счета 'ACC001'. Вы можете откатиться к точке сохранения savepoint2
:
ROLLBACK TO savepoint2;
Эта команда откатывает транзакцию до состояния, которое было на момент создания точки сохранения savepoint2
, тем самым отменяя вставку записи о счете 'ACC004'.
Для проверки того, что откат до точки сохранения savepoint2
был успешным, проверим, существует ли счет 'ACC004':
SELECT * FROM accounts WHERE account_number = 'ACC004';
Этот запрос не должен вернуть ни одной строки, что означает, что запись о счете 'ACC004' была удалена.
Теперь проверим баланс счета 'ACC001':
SELECT * FROM accounts WHERE account_number = 'ACC001';
Баланс счета 'ACC001' должен быть обновлен (уменьшен на 200).
Если вы удовлетворены оставшимися изменениями (обновлением баланса счета 'ACC001'), вы можете зафиксировать транзакцию:
COMMIT;
Эта команда фиксирует транзакцию, делая обновление баланса счета 'ACC001' постоянным.
В резюме, на этом этапе показано, как использовать точки сохранения в рамках транзакции для выполнения частичного отката. Это позволяет более детально управлять транзакциями, отменяя определенные изменения, сохраняя при этом другие.