|
|
Страница-заголовок
Страница-заголовок занимает первый блок первого (если таковых несколько)
файла БД. Когда сервер InterBase соединяется с БД, он читает первые
1024 байта первого файла БД. Эта страница содержит в своих первых
1024 байтах (а это минимальный размер страницы БД) значения таких
важнейших параметров БД, как версия структуры БД (On Disk Structure
(ODS) - дословно "надисковая структура") и размер страницы.
Как только сервер InterBase определяет данный файл как файл БД InterBase
и проверяет совместимость версии структуры БД (ODS) с версией сервера,
он считывает всю страницу-заголовок, исходя из выясненного значения
размера страницы; в результате этой операции выясняются названия
и диапазоны номеров страниц последующих файлов БД, следующая транзакция
и старейшая интересная (oldest interesting) транзакция.
Следующий шаг, к которому готовится InterBase, - это нахождение
важнейших системных таблиц и построение внутреннего образа БД.
Страницы указателей
Страница-заголовок также содержит адрес первой страницы указателей
для таблицы RDB$PAGES, системной таблицы, позволяющей InterBase
находить такие важнейшие страницы, как страницы данных обычных таблиц.
Сервер читает первую страницу указателей и затем использует её для
обнаружения первой страницы данных таблицы RDB$PAGES. Отсюда сервер
уже может найти страницы данных и индексов других системных таблиц.
Эта
страница начинается простым заголовком, содержащим тип страницы
и номер следующей страницы указателей для данной таблицы. Оставшееся
пространство страницы занимают 32-разрядные номера страниц данных,
формирующих таблицу. Необходимо отметить, что для каждой таблицы
БД определены страницы указателей. Две первые части значения db_key
записи (строки) таблицы InterBase представляют собой соответственно
номер страницы указателей (для данной таблицы) и смещение от её
начала. Таким образом, сервер узнаёт, какую страницу данных занимает
данная запись.
Страницы
описания транзакций
Таблица
RDB$PAGES хранит адреса не только страниц данных. В их число попадают
страницы описания транзакций (Transaction Inventory Pages, TIPs).
Как и страницы указателей, страницы описания транзакций имеют простой
заголовок, включающий тип страницы и номер следующей страницы описания
транзакций. Само тело страницы составляют 2-битные объекты, отражающие
состояния транзакций в системе. "0" означает, что транзакция
ещё не стартовала, активна или канула в лету, не будучи завершена
(commited) или откатана(rolled back). "1" означает, что
транзакция завершена. "2" - произведён откат. "3"
- транзакция неопределённая (limbo), что возможно в середине 2-фазного
завершения (two-phase commit).
Чтобы
определить состояние транзакции, InterBase использует номер (ID)
транзакции в качестве адреса соответствующего 2-битного объекта
и читает, в каком из 4-х состояний он находится. Однако, алгоритм
сложнее, чем может показаться на первый взгляд, ибо необходимо учитывать
заголовки страниц описания транзакций. В случае если одна транзакция
проверяет состояние другой и складывается ситуация, когда другая
транзакция помечена как активная ("0"), но согласно таблице
блокировок (lock table) "умерла", то первая транзакция
изменяет состояние второй на "откатана" ("1").
|
|
|