Оптимизация приложений для работы с СУБД InterBase - Завершение транзакций

ОГЛАВЛЕНИЕ

Завершение транзакций

Существует два способа завершения транзакций: подтверждение (COMMIT) и отмена (ROLLBACK). По причинам, которые будут обсуждаться ниже, очень важно закрывать (или, правильнее будет сказать, завершать) транзакции, когда в них больше нет необходимости, даже если вам придется их сразу же перезапустить (переоткрыть). Заметьте, что команды COMMIT RETAINING и ROLLBACK RETAINING реально не завершают транзакцию — они только делают изменения, внесенные транзакцией, видимыми для других транзакций. Везде же, где видится возможным, рекомендуется использовать команды COMMIT и ROLLBACK вместо COMMIT RETAINING/ROLLBACK RETAINING. До выхода InterBase версии 7 единственным преимуществом COMMIT RETAINING являлась возможность использовать изменения, сделанные вашей транзакцией, в контексте этой самой транзакции. Впрочем, если необходимо, вы можете использовать и две транзакции. В седьмой версии InterBase добавлены новые возможности для COMMIT RETAINING, требующие отдельного рассмотрения.

В отличие от многих других серверов баз данных, InterBase может исполнять откат транзакций немедленно благодаря многоверсионной структуре данных. Однако использовать откат транзакций следует только тогда, когда это действительно необходимо, так как количество откатов учитывается сервером для определения времени очистки базы данных (SWEEP INTERVAL of DATABASE). Разработчики часто задаются вопросом, как завершать транзакцию в read-only-запросах. Правильнее, наверное, будет использовать COMMIT ввиду того, что InterBase все равно для read-only-запроса выполнит команду COMMIT вместо ROLLBACK, даже если была послана последняя команда. Фактически же каждый четный откат в транзакциях с параметром read-write преобразуется в подтверждение старой версии редактируемых данных, так как это повышает производительность сервера. Так что следует разумно пользоваться операцией отката (ROLLBACK), когда изменения нужно отменить, и операцией подтверждения, если изменения надо сохранить. Конечно, с учетом контекста текущей транзакции.