RussianLDP Рейтинг@Mail.ru
WebMoney: 
WMZ Z294115950220 
WMR R409981405661 
WME E134003968233 
Visa 
4274 3200 2453 6495 

Small. Fast. Reliable.
Choose any three.
Savepoints

1. Синтаксис

savepoint-stmt:

SAVEPOINT savepoint-name

release-stmt:

RELEASE SAVEPOINT savepoint-name

rollback-stmt:

ROLLBACK TRANSACTION TO SAVEPOINT savepoint-name

2. Savepoints

SAVEPOINT это метод создания транзакций, подобных BEGIN и COMMIT, за исключением того, что команды SAVEPOINT и RELEASE именованы и можно вкладывать.

SAVEPOINT начинает новую транзакцию с именем. Операционные имена не должны быть уникальными. SAVEPOINT может быть начата в или за пределами BEGIN... COMMIT. Когда SAVEPOINT наиболее удаленная точка сохранения, и это не в BEGIN... COMMIT, поведение совпадает с BEGIN DEFERRED TRANSACTION.

ROLLBACK TO возвращает состояние базы данных назад к тому, чем это было сразу после соответствующей SAVEPOINT. Обратите внимание на то, что в отличие от простой ROLLBACK (без TO), ROLLBACK TO не отменяет транзакцию. Вместо того, чтобы отменить транзакцию, ROLLBACK TO перезапускает ее снова. Все прошедшие SAVEPOINT отменяются, как бы то ни было.

Команда RELEASE подобна COMMIT для SAVEPOINT. RELEASE заставляет все точки сохранения вернуться, включая новую точку сохранения с соответствующим именем, и удалиться из операционного стека. RELEASE внутренней транзакции не заставляет изменения быть написанными в файл базы данных. Это просто удаляет точки сохранения из операционного стека, таким образом, что больше невозможно ROLLBACK TO для тех точек сохранения. Если команда RELEASE выпускает наиболее удаленную точку сохранения, чтобы операционный стек стала пустым, то RELEASE совпадает с COMMIT. COMMIT может использоваться, чтобы выпустить все точки сохранения и передать транзакцию, даже если она была первоначально начата командой SAVEPOINT вместо команды BEGIN.

Если имя точки сохранения в команде RELEASE в настоящее время не соответствует никакой точке сохранения в операционном стеке, то никакие точки сохранения не выпущены, база данных неизменна, а команда RELEASE возвращает ошибку.

Обратите внимание на то, что внутренняя транзакция могла бы передать (использованием команды RELEASE), но тогда позже отменить ее работу ROLLBACK во внешней транзакции. Перебой в питании или катастрофа программы вызовут отмену наиболее удаленной транзакции, отменяя все изменения, которые произошли в той внешней транзакции, даже изменения, которые были, предположительно, "переданы" командой RELEASE. Содержание на самом деле не передается на диск, пока наиболее удаленная транзакция не передается.

Есть несколько способов мышления о команде RELEASE:

  • Некоторые люди рассматривают RELEASE как эквивалент COMMIT для SAVEPOINT. Это приемлемая точка зрения, пока каждый помнит, что изменения, переданные внутренней транзакцией, могли бы позже быть отменены во внешней.

  • Другое представление о RELEASE: это сливает названную транзакцию в свою родительскую транзакцию, чтобы названная транзакция и ее родитель стали той же самой транзакцией. После RELEASE названная транзакция и ее родитель передадутся или отменятся вместе.

  • Можно также думать о точках сохранения как об "отметках" в операционной временной шкале. В этом представлении команда SAVEPOINT создает новую отметку, команда ROLLBACK TO перематывает временную шкалу назад к пункту сразу после названной отметки, команда RELEASE стирает отметки с временной шкалы, на самом деле не внося изменений в базу данных.

3. Операционные правила вложения

Начатая последняя транзакция будет первой, переданной или отмененной.

BEGIN работает только если операционный стек пуст или другими словами при отсутствии отложенных транзакций. Если операционный стек не пуст, BEGIN терпит неудачу с ошибкой.

COMMIT передает все транзакции и оставляет операционный стек пустым.

RELEASE начинается с нового дополнения к операционному стеку и выпускает точки сохранения назад, пока это не выпустит точку сохранения с соответствующим именем точки сохранения. Предшествующие точки сохранения, даже точки сохранения с соответствием именам точки сохранения, неизменны. Если команда RELEASE заставляет операционный стек стать пустым (если команда RELEASE выпускает наиболее удаленную транзакцию из стека), транзакция передается.

ROLLBACK без TO отменяет все транзакции, оставляя стек пустым.

ROLLBACK TO отменяет до прежнего уровня транзакции по времени предшествующие новому SAVEPOINT с соответствующим именем. SAVEPOINT с соответствующим именем остается в операционном стеке, но все изменения базы данных, которые произошли после того, как SAVEPOINT был создан, отменены. Если имя точки сохранения в ROLLBACK TO не соответствует никакому SAVEPOINT в стеке, то ROLLBACK терпит неудачу с ошибкой и оставляет статус базы данных без изменений.