Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Скляр А.Я. Введение в InterBase

.pdf
Скачиваний:
68
Добавлен:
02.05.2014
Размер:
6.41 Mб
Скачать

258

Глава 9

Идентификаторы транзакциям присваиваются таким образом, что транзакция, которая стартовала позже, будет иметь и больший идентификатор.

Чтобы правильно работать с версиями, необходимо располагать информацией о текущем состоянии транзакций. InterBase хранит сведения о текущем состоянии транзакций на специальных страницах базы данных - Transaction Inventory Page (TIP). Транзакция вне зависимости от ее уровня изоляции может находиться в одном из четырех состояний: active, committed, rolled back или in limbo. Текущее состояние транзакции всегда отражается в глобальной TIP. Помимо глобальной TIP существуют также и локальные TIP, используемые транзакциями уровня SNAPSHOT, отражающие состояние TIP на момент их старта.

Подробнее о возможных состояниях мы поговорим ниже, а пока ограничимся констатацией того факта, что знание состояния транзакцией необходимо для управления версиями строк таблиц базы.

Работа с версиями данных в InterBase

Впредыдущем разделе мы говорили о механизме создания версий. Каждая транзакция, обновляющая данные, создает новые версии строк таблиц. Если не позаботиться об удалении ненужных версий, то база очень быстро будет состоять только из них и фактически прекратит работу.

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

Пусть какая-либо транзакция успешно завершилась {commit). Можно ли удалить после этого версии строк таблиц, предшествующих зафиксированному транзакцией состоянию? Ответ будет отрицательным, поскольку SNAPSHOT-транзакции, стартовавшие до завершения данной транзакции, должны использовать именно их. Старые версии, конечно, должны быть удалены, поскольку замусоривают базу, но сделать это можно только тогда, когда будет точно известно, что более они никому не нужны.

Если какая-либо транзакция завершилась аварийно {rollback), то можно ли удалить версии строк таблиц, созданных данной транзакцией? Да, можно. Пока она была активна, никто не мог использовать ее версии, а теперь они вообще не нужны. Нужно ли выполнять откат немедленно? Наверное, нет. Процедура эта довольно громоздка, а мусор в базе все равно сохраняется, и его сборка должна проводиться, так что целесообразнее поручить это процедуре сборки мусора, чем строить еще одну процедуру, что на самом деле и реализовано в InterBase.

В какой же момент можно установить, какие версии потеряли актуальность. Рассмотрим эту проблему подробнее.

Соседние файлы в предмете Базы данных