Как IB обновляет (update) записи и отслеживает версии?

Анна Харрисон, Harbor Software

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

Когда вы обновляете (update) запись, IB вычисляет разницу между новой и старой версиями записей и сохраняет отличия (*) возможно на той же, где и старая версия записи, странице или на другой странице (если в текущей не хватает места). Затем IB заменяет оригинальную запись новой версией, и создает указатель на старую версию записи (back version). Главная версия записи содержит идентификатор транзакции, ее создавшей (например, 27). Старая версия содержит тоже содержит идентификатор создавшей ее транзакции (например, 13).
 

"Неизменяемое представление данных"

Существующие (активные) транзакции читают старые версии записей, если эти транзакции не read-committed (которые должны иметь возможность читать новую версию записи после подтверждения транзакции (commit)). Транзакция 17 будет продолжать читать версию, созданную транзакцией 13. Транзакция 35 будет читать версию, созданную транзакцией 27 – если, конечно, транзакция 27 завершилась подтверждением (commit).
 

"Восстановление"

Если транзакции не удалось завершиться commit (например приложение зависло), или был выполнен RollBack, то следующая транзакция, читающая запись, вернет старую версию записи на ее прежнее место. Этот процесс называется кооперативным восстановлением. Если транзакция 27 завершится отменой (rollback), то следующая транзакция при прочтении этой записи вернет версию, созданную транзакцией 13.
 

"Конкурентный доступ"

Транзакция 17 не сможет изменить запись, если для этой записи есть новая версия созданная транзакцией 27. Это предотвращает взаимную отмену изменений между конкурирующими транзакциями.
 

Изменение индексов

Если вы меняете значение поля, по которому есть индекс, то индекс обновляется. Если поле не изменилось, то и индекс не меняется, если не меняется расположение записи (db-key).
 

(*) 'отличия' или 'дельта'-записи

Если, к примеру, вы меняете третий символ первого поля с 'A' на 'Z', затем добавляете '123' в конец третьего поля, то 'дельта'-запись будет выглядеть как "игнорировать с 1 по 3, 4-й удалить, вставить 'Z', игнорировать с 5 по 30, добавить '123'". Такая компрессия дает достаточное сжатие, за исключением модификации большей части полей записи. После вычисления 'дельты' ее длина сравнивается с длиной записи. Если сжатия получить не удалось, то 'дельта' игнорируется, и записывается полная версия записи.  

Подпишитесь на новости Firebird в России

Подписаться