Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
Шрифт:
Вот шаблон синтаксиса для отката на точку сохранения:
ROLLBACK [WORK] ТО [SAVEPOINT] <идентификатор>;
Если транзакция позволяет продолжить работу после отката на точку сохранения, то в дальнейшем работа может осуществлять откат на эту точку сохранения столько раз, сколько потребуется. Версии записей, которые были отменены откатом, не будут доступны для сборщика мусора, потому что транзакция все еще является активной.
Механизм реализации точек сохранения на сервере - протокол в памяти - может требовать значительного количества ресурсов, особенно если одни и те же строки изменяются многократно в процессе выполнения задачи. Ресурсы уже ненужных точек сохранения могут быть освобождены при использовании оператора RELEASE
SAVEPOINT:
RELEASE SAVEPOINT <идентификатор> [ONLY];
Без ключевого слова ONLY указанная точка сохранения и все точки сохранения, которые были созданы после нее, будут освобождены и потеряны. Используйте ONLY для освобождения только указанной точки сохранения.
Следующий пример иллюстрирует работу точек сохранения:
CREATE TABLE SAVEPOINT_TEST (ID INTEGER);
COMMIT;
INSERT INTO SAVEPOINT_TEST
VALUES(99);
COMMIT;
INSERT INTO SAVEPOINT_TEST
VALUES(100) ;
/**/
SAVEPOINT SP1;
/**/
DELETE FROM SAVEPOINT_TEST;
SELECT * FROM SAVEPOINT_TEST; /* не вернет ничего */
/**/
ROLLBACK TO SP1;
/**/
SELECT * FROM SAVEPOINT_TEST; /* вернет 2 строки */
ROLLBACK;
/**/
SELECT * FROM SAVEPOINT_TEST;
/* вернет одну подтвержденную строку */
Когда ядро сервера выполняет откат, его контрольная точка по умолчанию для отменяемой транзакции ссылается на внутреннюю точку сохранения, находящуюся в протоколе автоотмены в оперативной памяти. При завершении отката он подтверждает транзакцию. Целью этой стратегии является сокращение количества мусора, порождаемого откатами.
Когда объем изменений, выполненных перед точкой сохранения на уровне транзакции, становится большим - в пределах от 10 000 до 1 миллиона строк - ядро сервера прекращает использовать протокол автоотмены и получает ссылки напрямую из глобального образа состояния транзакции (TSB). Если у вас есть транзакция, в которой цы предполагаете выполнение операции с большим количеством изменений, отключение ведения протокола автоотмены предотвратит утечку потребляемых ресурсов, которая появится, если ваш сервер решит отменить ведение протокола. Подробности см. в разд. "Протокол автоотмены" ранее в этой главе.
Эквивалентом точек сохранения в модулях PSQL является обработка исключений. Каждый блок PSQL для обработки исключений также ограничен автоматической системой точек сохранения. Расширения PSQL предоставляют языковую
Логический контекст
Простой способ рассматривать транзакцию между START TRANSACTION и COMMIT или ROLLBACK - это смотреть на нее как на серию клиентских операций и взаимодействий клиента и сервера, которые точно отображают задачу. Это очень полезная модель для понимания того, как транзакция создает обертку для единицы работы. Эта модель не обязательно точно отражает то, как именно пользователи выполняют конкретные задачи.
С пользовательской точки зрения "задача" не ограничена операторами START TRANSACTION и COMMIT. Его задача имеет начало, середину и окончание, что может включать множество транзакций. Например, ошибки при пересылке или подтверждении оператора повлекут за собой откат для завершения физической транзакции. Некоторые виды вмешательств могут привести к завершению логической задачи или в нормальном случае потребуют другой физической транзакции для завершения логической задачи.
Одна физическая транзакция может включать множество дискретных пользовательских задач, формирующих логическое "целое", что требует атомарности единой физической транзакции. Другой вариант- типичная задача "пакетного ввода данных" - выполняет многократные повторения похожей задачи, помещенные внутрь одной физической транзакции для сокращения количества нажатий клавиш клавиатуры и соответствия пользовательским требованиям выполнения работы.
Подводя итог, логическая задача - это то, что мы как разработчики должны проектировать и к чему обращаться - почти всегда выходит за пределы границ START TRANSACTION и COMMIT. Физическая транзакция при этом является частью логического контекста.
Двумя ключевыми факторами в отношении логического контекста транзакции являются:
* как сохранять физический контекст начальной транзакции после ROLLBACK, чтобы работа пользователя не пропала, когда сервер отменит доступ;
* что делать, если поток работы будет прерван исключением - как диагностировать исключение и как его скорректировать.
Для решения этих задач мы рассмотрим операции COMMIT и ROLLBACK, а также все за и против использования доступных режимов для сохранения логического контекста транзакций. После этого мы рассмотрим вопросы диагностирования исключений, которые могут потребовать повторного запуска транзакций.
Завершение транзакций
Транзакция завершается, когда клиентское приложение подтверждает ее или отменяет. Если оператор COMMIT или вызов эквивалентной функции API isc_commit_ transaction не будут успешными, то транзакция не будет подтверждена. Если транзакция, которая не может быть подтверждена, не будет отменена явным вызовом клиентом ROLLBACK (ИЛИ функцией API isc_roiiback_transaction), транзакция не будет отменена. Эти операторы не являются силлогизмом. Ошибки при завершении транзакций являются весьма общей проблемой, часто обсуждаемой в публичных конференциях!