Точки сохранения
1. Синтаксис
2. Точки сохранения
ТОЧКИ_СОХРАНЕНИЯ — это способ создания транзакций, аналогичный BEGIN и COMMIT, за исключением того, что команды SAVEPOINT и RELEASE имеют имена и могут быть вложены.
Команда SAVEPOINT запускает новую транзакцию с именем. Имена транзакций необязательно должны быть уникальными. Точка сохранения может быть запущена как внутри, так и вне BEGIN...COMMIT. Когда точка сохранения является самой внешней точкой сохранения и она не находится внутри BEGIN...COMMIT, поведение аналогично BEGIN DEFERRED TRANSACTION.
Команда ROLLBACK TO возвращает состояние базы данных к состоянию, существовавшему сразу после соответствующей точки сохранения. Обратите внимание, что в отличие от обычной команды ROLLBACK (без ключевого слова TO) команда ROLLBACK TO не отменяет транзакцию. Вместо отмены транзакции команда ROLLBACK TO перезапускает транзакцию с начала. Однако все промежуточные точки сохранения отменяются.
Команда RELEASE похожа на COMMIT для точки сохранения. Команда RELEASE удаляет все точки сохранения, начиная с последней точки сохранения с совпадающим именем, из стека транзакций. Выпуск внутренней транзакции не приводит к записи каких-либо изменений в файл базы данных; она просто удаляет точки сохранения из стека транзакций, так что больше нельзя выполнить ROLLBACK к этим точкам сохранения. Если команда RELEASE высвобождает самую внешнюю точку сохранения, так что стек транзакций становится пустым, то RELEASE эквивалентна COMMIT. Команда COMMIT может быть использована для освобождения всех точек сохранения и подтверждения транзакции, даже если транзакция была первоначально запущена с помощью команды SAVEPOINT вместо команды BEGIN.
Если имя точки сохранения в команде RELEASE не соответствует ни одной точке сохранения, в настоящее время присутствующей в стеке транзакций, то точки сохранения не освобождаются, база данных не изменяется, и команда RELEASE возвращает ошибку.
Обратите внимание, что внутренняя транзакция может быть подтверждена (с помощью команды RELEASE), а затем позже ее работа может быть отменена командой ROLLBACK во внешней транзакции. Отключение электропитания, сбой программы или сбой операционной системы приведет к откату самой внешней транзакции, отменив все изменения, произошедшие внутри этой внешней транзакции, даже изменения, которые, по-видимому, были «подтверждены» командой RELEASE. Содержание фактически не подтверждается на диске до тех пор, пока не будет подтверждена самая внешняя транзакция.
Существует несколько способов взглянуть на команду RELEASE:
Некоторые считают RELEASE эквивалентом COMMIT для точки сохранения. Это приемлемая точка зрения, если помнить, что изменения, подтвержденные внутренней транзакцией, могут позже быть отменены откатом во внешней транзакции.
Другое представление о RELEASE заключается в том, что она объединяет именованную транзакцию со своей родительской транзакцией, так что именованная транзакция и ее родительская становятся одной транзакцией. После RELEASE именованная транзакция и ее родитель будут подтверждены или отменены вместе, независимо от их судьбы.
Также можно рассматривать точки сохранения как «метки» во временной шкале транзакции. В этом представлении команда SAVEPOINT создает новую метку, команда ROLLBACK TO возвращает временную шкалу назад к моменту сразу после именованной метки, а команда RELEASE стирает метки из временной шкалы без фактического внесения изменений в базу данных.
3. Правила вложенности транзакций
Последняя начатая транзакция будет первой подтвержденной или отмененной.
Команда BEGIN работает только в том случае, если стек транзакций пуст, или, другими словами, если нет ожидающих транзакций. Если стек транзакций не пуст при вызове команды BEGIN, то команда завершается с ошибкой.
Команда COMMIT подтверждает все ожидающие транзакции и оставляет стек транзакций пустым.
Команда RELEASE начинается с последнего добавленного элемента в стек транзакций и высвобождает точки сохранения в обратном порядке во времени до тех пор, пока она не высвободит точку сохранения с совпадающим именем точки сохранения. Предшествующие точки сохранения, даже точки сохранения с совпадающими именами, остаются неизменными. Если команда RELEASE приводит к тому, что стек транзакций становится пустым (если команда RELEASE высвобождает самую внешнюю транзакцию из стека), то транзакция подтверждается.
Команда ROLLBACK без предложения TO откатывает все транзакции и оставляет стек транзакций пустым.
Команда ROLLBACK с предложением TO откатывает транзакции в обратном порядке во времени до самой последней точки сохранения с совпадающим именем. Точка сохранения с совпадающим именем остается в стеке транзакций, но все изменения в базе данных, произошедшие после создания этой точки сохранения, отменяются. Если имя точки сохранения в команде ROLLBACK TO не соответствует никакой точке сохранения в стеке, то команда ROLLBACK завершается с ошибкой и состояние базы данных остается неизменным.
Эта страница была в последний раз изменена 2022-01-08 05:02:57 UTC
SQLite is in the Public Domain.
https://sqlite.org/lang_savepoint.html