ВОЗВРАТ НАЗАД
Заявление ROLLBACK отменяет (завершает) транзакцию, удаляя любые изменения в данных SQL, чтобы они никогда не стали видимыми для последующих транзакций. Требуемый синтаксис для заявления ROLLBACK выглядит следующим образом.
ROLLBACK [ WORK ] [ AND [ NO ] CHAIN ]
[ TO [ SAVEPOINT ] {<savepoint name> | <simple target specification>} ]
Заявление ROLLBACK либо завершит транзакцию, удалив все изменения данных, произошедшие во время любой из транзакций, либо просто удалит любые изменения данных, произошедшие с момента создания точки сохранения. Основной вид заявления ROLLBACK — это просто ключевое слово ROLLBACK (ключевое слово WORK — просто шум и может быть опущено без изменения результата).
Необязательная часть AND CHAIN служит для удобства начала новой транзакции сразу после завершения старой. Если AND CHAIN указан, то фактически ничего нет между старой и новой транзакциями, хотя они остаются отдельными. Характеристики новой транзакции будут такими же, как у старой — то есть, новая транзакция будет иметь тот же режим доступа, уровень изоляции и размер области диагностики (мы обсудим все это вскоре), что и завершенная транзакция. Опция AND NO CHAIN просто сообщает вашей СУБД завершить транзакцию — то есть, эти четыре SQL-заявления эквивалентны:
ROLLBACK; ROLLBACK WORK; ROLLBACK AND NO CHAIN; ROLLBACK WORK AND NO CHAIN;
Все они завершают транзакцию без сохранения характеристик транзакции. Единственные другие варианты, эквивалентные заявления:
ROLLBACK AND CHAIN; ROLLBACK WORK AND CHAIN;
оба сообщают вашей СУБД завершить транзакцию, но сохранить характеристики этой транзакции для следующей транзакции.
ROLLBACK намного проще, чем COMMIT: это может включать не более нескольких удалений (курсоров, блокировок, подготовленных SQL-запросов и записей журнала). Обычно предполагается, что ROLLBACK не может завершиться ошибкой, хотя такое возможно (например, охватывающая транзакция может отклонить попытку ROLLBACK из-за того, что она находится в очереди для COMMIT).
ROLLBACK отменяет все эффекты транзакции. Она не отменяет эффекты на объекты, находящиеся вне контроля СУБД (например, значения в переменных программы-клиента или настройки, сделанные некоторыми вызовами функций SQL/CLI). Но в целом, это удобное заявление для тех ситуаций, когда вы говорите «ой, это не работает» или когда вам просто всё равно, станут ли ваши временные изменения постоянными или нет.
Вот спорный вопрос. Если всё, что вы делали, это SELECTы, так что не было изменений данных, должны ли вы завершить транзакцию с помощью ROLLBACK или COMMIT? На самом деле, это не должно иметь значения, потому что как ROLLBACK, так и COMMIT выполняют ту же работу по завершению транзакции. Однако, общепринятое мнение состоит в том, что ROLLBACK подразумевает ошибку, поэтому после успешного ряда SELECT заявлений принято завершать транзакцию с помощью COMMIT а не ROLLBACK.
MariaDB (и большинство других СУБД) поддерживает откат (rollback) изменений данных SQL-заявлений, но не SQL-схемы. Это означает, что если вы используете любое из CREATE, ALTER, DROP, GRANT, REVOKE, вы неявно подтверждаете (commit) при выполнении.
INSERT INTO Table_2 VALUES(5); DROP TABLE Table_3 CASCADE; ROLLBACK;
В результате и INSERT и DROP пройдут как отдельные транзакции, так что ROLLBACK не будет иметь никакого эффекта.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/rollback/