ГЛАВА 2.
ОРГАНИЗАЦИЯ BTRIEVE - ФАЙЛОВ
Эта глава описывает структуру файлов Btrieve и методы файловой
организации. Она также включает обсуждение процесса сохранности данных и управления параллелизмом.
ПОНЯТИЕ ФАЙЛА В BTRIEVE
Файл - это объект самого высокого уровня в базе данных, к которому Вы можете получить доступ при применении Btrieve. Вы создаете Btrieve-файлы и определяете их характеристики, или используя утилиту CREATE, описанную в Главе 4, или применяя операцию CREATE в Вашей прикладной программе. Btrieve допускает файлы с максимальной размерностью приблизительно 4 миллиона символв.
Ваша прикладная задача может задавать имена файлов в одном из следующих форматов: \<servername><volumename><pathname><filename> или <drive>:<pathname><filename> Всегда завершайте имя файла пробелом или двоичным нулем.
ФИЗИЧЕСКИЕ ХАРАКТЕРИСТИКИ ФАЙЛА
Btrieve-файлы состоят из ряда страниц. Страница - единица хранения информации, которую Btrieve пересылает между памятью и диском во время дисковой операции ввода/вывода. Btrieve-файл может быть составлен из трех различных типов страниц: страниц индексов, страниц данных и страницы-заголовка (или Запись Управления Файла).
Вы задаете фиксированный размер для каждой страницы при создании файла. Размер страницы всегда кратен 512, до 4096 байт. Если Вам требуется более восьми сегментов ключа, Вы должны задать размер 1024 байта или больше. Оптимальный размер страницы для Вашей прикладной задачи зависит от числа сегментов ключей в Вашем файле и длины записей Ваших данных. Смотрите "Определение длины записи и размера страницы" в этой главе для дополнительной информации.
С т р а н и ц а - з а г о л о в о к ( З а п и с ь У п р а в л е н и я Ф а й л о м )
Каждый Btrieve-файл имеет единственную страницу-заголовок или
Запись Управления Файлом (FCR), всегда являющуюся первой страницей в файле. FCR содержит информацию о файле такую, как размер файла, размер страницы, альтернативную последовательность сортировки (если существует) и другие характеристики файла.
С т р а н и ц ы д а н н ы х
Btrieve хранит записи, которые Ваша прикладная задача добавляет в файл на страницах данных. В Btrieve применяется два вида страниц данных: страницы записей фиксированной длины и страницы записей переменной длины.
Если файл не допускает записи переменной длины или сжатие данных, то все его страницы данных будут страницами записей фиксированной длины. Каждая страница данных может содержать одну или более записей данных. Количество записей данных на странице зависит от того, как Вы определили длину записи при первом создании файла. Btrieve не будет разбивать фиксированную часть записи между
страницами.
Если файл допускает записи переменной длины или сжатие данных, или то и другое, то он будет содержать как страницы записей фиксированной длины, так и страницы записей переменной длины. Страницы записей фиксированной длины содержат только части фиксированной длины. Страницы записей переменной длины содержат только переменные части записи. Если переменная часть записи длиннее, чем размер страницы файла, Btrieve разобъет переменную часть между страницами.
С т р а н и ц ы и н д е к с о в
Страницы индексов содержат значения ключей для доступа к записям данных. Обычно страницы индексов содержат много различных значений ключей. Каждое значение ключа на странице имеет адрес записи (или два адреса при задании двойных ключей). Btrieve
использует эти адреса для поиска записи, содержащей это значение ключа.
В - д е р е в ь я
Btrieve хранит все индексы записей данных в виде В-деревьев. В-дерево - это метод быстрого поиска данных при эффективном использовании дискового пространства. Как только создано В-дерево, периодическая поддержка не требуется. Для каждого ключа файла создается отдельное В-дерево.
Д и н а м и ч е с к о е р а с ш и р е н и е
Btrieve распределяет дисковое пространство как требуется. Если при текущем распределении недостаточно места, когда Ваша прикладная задача добавляет новые записи, Btrieve динамически
размещает дополнительные страницы данных и индексов для файла. Btrieve также обновляет структуры директорий, чтобы отразить новый размер файла.
Как только прстранство для файла было распределено, оно остается таковым до тех пор, пока существует файл. Чтобы уменьшить требуемое пространство для файла, из которого было удалено множество записей, можно создать новый файл с теми же характеристиками, что и у исходного, а затем или написать небольшую прикладную программу, которая читает записи из исходного файла и добавляет их в новый файл, или использовать утилиту BUTIL-COPY, описанную в главе 4. Затем можно удалить исходный файл с диска.
И с п о л ь з о в а н и е с в о б о д н о г о п р о с т р а н с т в а
Когда Вы удаляете запись, прежде занятое пространство помещается в список свободного пространства. Когда Ваша прикладная задача добавляет новые записи, Btrieve использует свободное пространство вместо добавления новых страниц в файл.
Btrieve-метод вторичного использования свободного дискового пространства устраняет необходимость реорганизации файлов для освобождения дискового пространства.
ТИПЫ ФАЙЛОВ BTRIEVE
Btrieve позволяет определять три различных типа файлов: стандартные, только данных, только ключей. Типы файлов разделены по типам содержащихся в файле страниц. Вы можете определить и создать любой файл также, как и файл из двух типов.
С т а н д а р т н ы е ф а й л ы B t r i e v e
Стандартный Btrieve-файл содержит страницу-заголовок, за которой следуют страницы индексов и страницы данных. Вы можете определить стандартный Btrieve файл для использования записей или фиксированной или переменной длины.
Т.к. стандартные Btrieve-файлы содержат все индексные структуры и записи данных, Btrieve может динамически поддерживать всю индексную информацию для записей файла. Вы можете применять любую из операций поиска для доступа к информации, накопленной в стандартном Btrieve-файле.
Ф а й л ы д а н н ы х
Btrieve позволяет создавать файлы, содержащие только данные. Когда Вы создаете файлы данных, Вы не задаете какие-либо характеристики ключей, и Btrieve не размещает какие-либо страницы
индексов для файла. Результатом этого являются уменьшение первоначального размера файла по сравнению со стандартными Btrieve-файлами.
Когда Ваша прикладная программа добавляет записи в файл, Btrieve накапливает их в хронологическом порядке добавления. (Хронологический порядок может быть нарушен, когда Вы удаляете записи и добавляете новые). Btrieve не поддерживает и не создает какие-либо страницы индексов во время добавления записей. С этой
точки зрения Вы можете обращаться к записи, используя только Step операции, которые используют физическое расположение для поиска записей.
В любое время после создания файла данных можно добавить индекс, используя операцию Create Supplemental Index (Создание Дополнительного Индекса). Как только Вы успешно добавили дополнительный индекс, Вы можете искать записи с помощью операций Get, используя дополнительный индекс.
Ф а й л ы к л ю ч е й
Файлы ключей содержат только страницу-заголовок, за которой следует одна или более страниц индексов. В файле ключей вся запись хранится с ключом, поэтому не требуется страниц данных. Обычное применение файлов ключей - внешний индекс для стандартного Btrieve-файла.
На файлы ключей накладываются следующие ограничения:
- файл может содержать только один ключ
- максимальная задаваемая Вами длина записи 255 байт
- значения, хранимые в файле не могут быть обновлены или удалены после добавления их в файл. Единственные допустимые операции над файлом Open, Close, Stat, Insert и операции Get и Step.
ЗАПИСИ
Запись представляет собой набор логически связанных элементов данных в Btrueve-файле. Это единица передачи между Вашей прикладной программой и Record Manager в одной операции.
Нет ограничения на число записей, допустимых в Btrieve-файле. Запись может иметь фиксированную длину ("запись фиксированной длины") или может состоять из части фиксированной длины, следуемой за частью переменной длины ("запись переменной длины"). Записи в файлах, использующих сжатие данных, всегда
переменной длины. Все ключи, которые Вы определяете для файла,
должны быть размещены в записи в части фиксированной длины.
Максимальная длина фиксированной части записи зависит от физического размера страницы и числа ключей-дубликатов, которые Вы определяете для файла. Btrieve позволяет части фиксированной длины в записи содержать до 4090 байтов. Вы можете определить длину записей переменной длины до 64 К.
Смотрите раздел "Определение размера страниц и длины записи" для дополнительной информации о максимальной длине записи.
ЗАПИСИ ПЕРЕМЕННОЙ ДЛИНЫ
Когда Вы создаете Btrieve-файл, Вы можете задать, что Вам нужен файл с записями переменной длины. Т.е. длина каждой записи в файле может изменяться. Если Вы задаете файл с использованием сжатия данных, то файл будет использовать записи переменной длины по умолчанию.
Когда Вы создаете Btrieve-файл, использующий записи переменной длины, Вы задаете в байтах длину фиксированной части записи. Длина, задаваемая Вами для фиксированной части записи, - минимальная возможная длина записи. Вы не определяете максимальную длину записи в Btrieve. Все свыше минимальной длины
(до 64 Кбайт в целом) - необязательно.
Когда Вы добавляете или корректируете запись, Ваша прикладная задача использует параметр длины буфера данных для задания длины записи Btrieve. Если заданная длина буфера данных меньше определенной Вами фиксированной части записи, Btrieve возвращает ошибочное состояние и не добавляет и не обновляет запись.
Когда Вы читаете запись переменной длины и задаете буфер данных меньше, чем фиксированная часть, Btrieve возвращает ошибочное состояние и не возвращает какие-либо данные в Вашу прикладную задачу. Если Вы задаете длину буфера данных равную или большую длине фиксированной части, но не такую длинную как запись, котрую Вы хотите прочитать, Btrieve возвращает число байтов данных, что
Вы запрашивали, и статусный код, информирующий Вас, что Btrieve возвратил не всю запись.
Если Вы задаете длину буфера данных длиннее, чем запись, которую Вы хотите найти, Btrieve возвращает только число байтов в действительной записи. Во всех случаях Btrieve информирует Вашу прикладную задачу о числе возвращаемых байтов установкой параметра длины буфера данных равным этому значению.
Btrieve хранит записи переменной длины на их собственных страницах данных, отдельно от фиксированной части записи. Btrieve оставляет определенное количество свободного пространства,
называемого границей свободного пространства, на каждой странице, где хранится запись переменной длины. Это позволяет расширять записи при обновлении и минимизировать разбиение записи по множеству страниц. Когда Вы создаете файл, Вы можете задать величину свободного пространства, которое Btrieve оставит на каждой странице переменной длины.
КЛЮЧИ И КЛЮЧЕВЫЕ АТРИБУТЫ
Btrieve использует ключи для распознования особых записей в файле. Используя ключ Btrieve может эффективно выбирать требуемые записи из всего набора записей в файле. Т.к. Btrieve не имеет способа узнать точную структуру записей в каждом файле, Вы определяете каждый ключ, идентифицируя его смещение в байтах от начала записи и задавая число байт, требуемых для ключа.
Например, предположим некоторый ключ начинается в восьмом байте записи и занимает четыре байта. Когда Вы добавляете запись в файл, Btrieve читает четыре байта, начиная с восьмого байта и использует найденное значение для выбора записи по индексу.
При создании файла Вы можете задать шесть различных атрибутов для каждого ключа в файле. Шесть ключевых атрибутов - это дубликат, модифицируемый, сегментированный, убывающий, нулевой и ручной.
К л ю ч и - д у б л и к а т ы
Вы можете определить ключ-дубликат для распознования подмножества записей, которые все содержат одно и то же значение некоторого ключа. Если Вы задаете, что ключ не может быть дубликатом, то Btrieve не позволяет прикладной задаче добавлять в файл записи с одним и тем же значением в поле ключа. Btrieve хранит значения ключей-дубликатов в хронологическом порядке добавления их в файл.
Если один из сегментов сегментированного ключа допускает дубликаты, то все сегменты должны допускать дубликаты.
Например, в файле содержащем записи покупателей Вы можете определить поле кода как ключ-дубликат таким образом, что множество различных записей сможет содержать одно и то же значение кода. Однако, если Вы также сделаете поле для номера покупателя ключевым полем, то Вы, вероятно, не захотите допустить
дубликаты, т.к. каждый покупатель должен иметь уникальный номер.
М о д и ф и ц и р у е м ы е к л ю ч и
Вы можете также определить ключ модифицируемым. Btrieve тогда позволяет Вашей прикладной задаче обновлять существующую запись и изменять значение ключевого поля. Например, если баланс счета ключевое поле, Вы можете позволить программе модифицировать значение поля после того, как покупатель сделает покупки и
платежи. Однако, Вы, вероятно, сделаете поле номера счета
немодифицируемым ключом, т.к. номер счета покупателя никогда не будет изменяться. Если один сегмент ключа - модифицируемый, то все сегменты должны быть модифицируемыми.
С е г м е н т и р о в а н н ы е к л ю ч и
Ключи могут состоять из одного или более сегментов в каждой записи. Сегмент обычно соответствует полю в записи и сегменты не должны пересекаться. Общая длина ключа равна сумме длин сегментов ключа. Максимальная общая длина - 225 символов. Сегменты различных ключей могут перекрывать друг друга в записи.
Btrieve-файл скорее ограничен максимальным числом сегментов в ключе, чем максимальным числом ключей. Максимальное допустимое число сегментов ключа зависит от размера страницы. Вы можете определить восемь ключевых сегментов, если размер страницы - 512 байт. Для файла с размером страницы 1024 байта или больше Вы можете определить до 24 ключевых сегментов. (Смотрите " Определение длины записи и размера страницы" для дополнительной информации о размере страницы. )
Файл с размером страницы 512 байт или больше может содержать один ключ с восьмью сегментами, восемь ключей с одним сегментом в каждом или любую комбинацию их. Если файл имеет размер страницы 1024 байта или больше, он может содержать один ключ с 24 сегментами, 24 ключа с одним сегментом или их любую комбинацию.
Любой сегмент в ключе может иметь различный тип ключа. Порядок сортировки, убывающий или возрастающий, также может быть различным для каждого сегмента.
У б ы в а ю щ и е к л ю ч и
Btrieve обычно упорядочивает ключи в возрастающем порядке (от самого меньшего к самому большему). Однако, Вы можете задать порядок сортировки ключевых значений по убыванию (от самого большего к самому меньшему), когда Вы определяете ключевой сегмент.
Операции Btrieve выдают результаты, основываясь на порядке значений ключей в индексе, а не на результате сравнения значений ключей. Например, когда Вы выполняете операцию Get Greater при убывающем ключе, Btrieve возвращает запись, соответствующую первому значению ключа, меньшему значения ключа, заданного Вами в буфере ключа. И наоборот, когда Вы выполняете операцию Get Less Than, используя убывающий ключ, Btrieve возвращает запись со следующим большим, чем Вы задали в буффере ключа, значением ключа.
П у с т ы е к л ю ч и
Вы можете указать Btrieve исключить некоторые записи из индекса, определяя пустые ключи. Когда Вы определяете пустой ключ, Вы задаете значение, которое должно распознаваться Btrieve как пустое значение этого ключа. Если все байты ключа содержат пустое значение, Btrieve не включит запись в индекс для зтого
ключа. Если Вы определите один сегмент ключа с пустым атрибутом, Вы должны определить все сегменты зтого ключа с пустым атрибутом.
Btrieve трактует ключ как нулевой, только если ВСЕ БАЙТЫ в ключе содержат пустые значения. Если ключ - сегментированный, все байты во ВСЕХ сегментах должны содержать пустые значения для того, чтобы Btrieve исключил ключ из индекса. Вы можете определить различные пустые значения для разных сегментов в сегментированном ключе. Наиболее общеупотребительные пустые значения - зто ASCII пробел (шестнадцетиричное 20) и двоичный нуль (шестнадцатиричный 0).
Вы можете применять пустое значение ключа, когда данные для ключа недоступны или когда Вы не хотите, чтобы Btrieve включал зту запись в индекс для зтого ключа. Пустые ключи позволяют Вам избежать поиска среди не имеющих значения записей в индексном пути и уменьшить время, требуемое для обновления индекса всякий раз, как вставляется пустой ключ. Когда данные становятся доступны или когда Вы хотите включить запись в индекс, Вы можете обновить запись, заменяя пустое значение другим.
Р у ч н о й к л ю ч
Ручной ключ модифицирован из пустого ключа и может быть использован для исключения некоторых записей из индекса. Подобно пустому ключу Вы должны определить значение, которое указывает, хотите ли Вы, чтобы Btrieve включил запись в индекс. Если Вы определили один сегмент ключа с ручным атрибутом, Вы должны определить все сегменты зтого ключа с ручным атрибутом.
Ручные ключи имеют все атрибуты пустого ключа за одним исключением. В ручном ключе, если все байты ОДНОГО ЛЮБОГО сегмента содержат нулевое значение, Btrieve исключит ключ из индекса.
Например, Вы можете использовать сегмент ручного ключа как флаг для указания, должен ли ключ быть индексирован. Если сегмент содержит только пустое значение, что Вы определили для зтого сегмента, Btrieve не включит ключ в индекс, даже если остальные сегменты в ключе содержат непустые значения. Заменяя сегмент флага любым значением отличным от заданного нулевого значения,
Вы можете дать Btrieve указание включить запись в индекс.
Вы можете определить ключ одновременно и ручным, и пустым. В
этом случае пустое значение всегда будет одним и тем же для пустого и ручного атрибутов. Однако ручной атрибут всегда переопределит пустой атрибут.
ТИПЫ КЛЮЧЕЙ
Типы ключей Btrieve попадают в две основные категории - стандартные и расширенные. Стандартные типы ключей - двоичные и строковые. Расширенные типы ключей включают расширенный набор наиболее употребительных типов данных.
С т а н д а р т н ы е т и п ы к л ю ч е й
Каждый сегмент ключа стандартного типа является или двоичным, или строковым. Btrieve сортирует двоичные ключевые значения как целые
числа без знака. Строковые ключи Btrieve сравнивает байт за байтом слева направо. Двоичные ключи он сравнивает целыми словами справа налево, т.к. старший и младший байты в целом числе переставляются в процессорах семейства Intel 8086.
Btrieve сортирует строковые ключи в соответствии с их ASCII значениями. Однако Вы можете задать альтернативную последовательность сортировки для строковых ключей. Альтернативная последовательность сортировки может применяться для сортировки не по набору символов английского алфавита, а по немецкому, шведскому или французскому набору символов.
Р а с ш и р е н н ы е т и п ы к л ю ч е й
Расширенные типы ключей позволяют Btrieve распозновать и сортировать ключевые значения, основываясь на внутреннем представлении в памяти 13 наиболее употребительных типов данных. Эта возможность дает Вам большую гибкость при пректировании индексов Ваших Btrieve-файлов.
Некоторые из поддерживаемых Btrieve типов - IEEE с плавающей точкой, оканчивающаяся на нуль строка, упакованное десятичное число, автоинкремент, целое число (двоичное со знаком). В приложении G перечислены и описаны расширенные типы ключей. Два из расширенных типов ключей, строковые и двоичные, - те же, что два стандартных типа ключей.
ИНДЕКСЫ
Индекс - это структура в Btrieve-файле, содержащая ключевые значения и поддерживающая их в отсортированном порядке. Btrieve динамически поддерживает индексы в сбалансированной структуре В-дерева. Когда Вы добавляете, обновляете или удаляете запись, Btrieve согласовывает все индексы для файла, чтобы отразить
самые последние изменения в ключевых значениях, содержащихся в
записях.
Когда Вы создаете файл данных Btrieve, можно определить один или более ключей для создания индексов. Любой ключ, определенный Вами при создании файла, называется постоянным индексом, так как он существует в течении жизни файла данных.
Btrieve также позволяет Вам определять внутренние индексы для файла после его создания. Эти индексы называются дополнительными индексами. Как только Вы создали дополнительный индекс, Btrieve поддерживает его как данные в изменениях файла, как и для постоянного индекса. Правила позиционирования для дополнительного индекса - те же, что и для постоянного индекса. Общее число
постоянных и дополнительных индексов или сегментов файла не может превышать 24. Дополнительные индексы отличаются от постоянных
индексов в двух случаях.
В отличии от постоянного индекса Вы можете удалить или "отбросить" дополнительный индекс, когда он больше не нужен Вашей прикладной
задаче. Пространство в файле, занятое индексом, освобождается для данных или других индексных страниц и Btrieve больше не поддерживает этот индекс.
Btrieve сортирует значения ключей-дубликатов для дополнительного индекса в другом порядке, чем для постоянного индекса. Для постоянного индекса Btrieve сортирует значения-дубликаты в хронологическом порядке добавления записей в файл. Для дополнительного индекса Btrieve включает значение-дубликат в индекс в порядке, соответствующем физическому расположению записей в файле.
Вы можете также задать для дополнительного ключа альтернативную последовательность сортировки. Если альтернативная
последовательность сортировки уже существует в файле, Btrieve будет использовать эту альтернативную последовательность сортировки для нового дополнительного ключа, если ключ так определен. Если альтернативная последовательность сортировки не существует, Вы можете включить ее в определение нового дополнительного индекса.
ИСПОЛЬЗОВАНИЕ ДИСКА
Вы можете уменьшить дисковое пространство, используемое файлом, уменьшая количество используемого пространства для данных и индексных страниц.Следующие разделы описывают как достигнуть наиболее эффективного использования дискового пространства и как оценить общий размер Вашего файла.
ПРИМЕЧАНИЕ:
Следующие рассуждения и формулы для определения размера файла не применимы для файлов, использующих сжатие данных, так как длина записи для этих файлов зависит от числа повторяющихся символов в каждой записи. ------------------------------------------------------------
ОПРЕДЕЛЕНИЕ ДЛИНЫ ЗАПИСИ И РАЗМЕРА СТРАНИЦЫ
Когда Вы создаете файл, Вы должны задать фмзический размер страницы и логическую длину записи. Следующие разделы помогут Вам определить оптимальный размер страницы. Для файлов, допускающих записи переменной длины, логическая длина записи имеет отношение к фиксированной части записи.
Д л и н а з а п и с и
Вначале определите длину логической записи (сколько байтов данных требуется хранить в фиксированной части каждой записи). Вы задаете это значение при создании файла. Затем Вы должны определить длину физической записи (сколько байтов данных, включая заголовок Btrieve, требуется для хранения фиксированной
части каждой записи).
Для файлов с записями фиксированной длины без ключей-дубликатов длина физической записи равна длине логической записи.
Число требуемых байт для хранения каждой записи на диске зависит от количества ключей-дубликатов, заданных в определении файла. Btrieve хранит восемь дополнительных байтов информации для каждого ключа в записи, допускающей дубликаты.
Таким образом, для определения длины физической записи Вашего файла добавьте восемь байтов к длине логической записи для каждого ключа, допускающего дубликаты. Добавьте четыре дополнительных байта, если файл допускает записи переменной длины, или шесть байт, если файл допускает усечение пробелов.
Р а з м е р с т р а н и ц ы д а н н ы х
Btrieve хранит на каждой странице данных файла столько записей, сколько возможно. Каждая страница данных требует шесть байтов для информации заголовка. Фиксированная часть записей не покрывает страницы, позтому в файле будет неиспользованное пространство, если размер страницы минус шесть байтов не кратен длине физической записи. Конечно, если Вы применяете сжатие данных,
нет способа точно узнать, какова будет длина хранимой записи.
Для максимального использования диска выберите размер страницы, содержащей Ваши записи при наименьшем количестве неиспользуемого пространства. Размер страницы должен всегда быть кратен 512 байтам, до 4096 байтов. Большие размеры страницы обычно приводят к более эффективному использованию дискового пространства.
Например, предположим Вам необходимо хранить 320 байтов данных в каждой записи и один из ключей файла допускает дубликаты. Длина логической записи, задаваемая Вами при создании файла, - 320. Длина физической записи - 328 байтов из-за восьмибайтового заголовка для одного ключа-дубликата.
Если Вы выбрали размер страницы - 512, то на странице может храниться только одна запись и будет неипользовано 178 (512-6-328) байт на каждой странице. Однако, если Вы выберите размер страницы - 1024, то на странице сможет храниться три записи и будет неиспользовано только 34 (1024-6-(328*3)) байта на каждой странице.
ОЦЕНКА РАЗМЕРА ФАЙЛА
Вы можете оценить число страниц, требующихся для хранения Btrieve файла по приведенным ниже формулам. Эти формулы базируются на максимальной (худший случай) требуемой памяти.
Индексная структура В-дерева гарантирует по крайней мере 50% использование страниц ключей. Поэтому в приведенных ниже вычислениях для страницы ключей минимальное число требуемых страниц ключей умножается на два, чтобы учесть наихудший возможный случай.
Большинство файлов потребуют меньшее пространство, но Вы должны рассматривать максимальные размеры при оценке размера файла. Эти формулы не берут в рассмотрение дополнительное использование индексной страницы при загрузке Btrieve с опцией Index Compaction.
Эти формулы применимы к файлам с записями фиксированной длины. Все переменные части записей компонуются в дополнительные страницы.
Вычислим число страниц данных по следующей формуле:
Число страниц данных = число записей / ((размер страницы - 6) / (длина записи + ( 8 * число полей двойных ключей))) Вычислим число индексных страниц для каждого поля ключа по
следующей формуле:
для полей ключа, допускающих дубликаты: Число индексных страниц = (число уникальных значений ключа / ((размер страницы - 12) / (длина ключа + 12))) * 2 для полей ключа, не допускающих дубликаты: Число индексных страниц = (число ключевых значений / ((размер страницы - 12) / (длина ключа + 8))) * 2 После того, как Вы вычислили отдельные индексные страницы,
вычислите страницы, требующиеся для файла, добавляя отдельные индексные страницы, страницы данных и дополнительную страницу для записи управления файлом следующим образом:
Общее число страниц файла = 1 + число страниц данных + число индексных страниц(1) + число индексных страниц(2) + ... Максимальное число требуемых байтов для хранения файла может быть
вычислено как:
Размер файла в байтах = число страниц в файле * размер страницы
П е р е р а с п р е д е л е н и е ф а й л а
Скорость операций над файлом может быть увеличена, если файл данных занимает непрерывную область на диске. Выигрыш в скорости наиболее заметен на очень больших файлах. Btrieve позволяет перераспределить до 65535 страниц файла при создании файла данных.
Для перераспределения непрерывного дискового пространства для файла устройство, на котором Вы создаете файл, должно иметь требуемое число байтов доступного непрерывного свободного дискового пространства. Btrieve перераспределяет заданное Вами число страниц, независимо от того, есть ли на диске непрерывное
пространство. Если на диске недостаточно места для перераспределения заданного числа страниц, Btrieve возвращает состояние "дмск полный" и не создает файл.
Применим формулы, описанные в предыдущем разделе, для определения числа требуемых для файла страниц данных и индексов. Вы должны округлить зто число до ближайшего целого значения.
Когда Вы перераспределяете страницы файла, файл, действительно, занимает эту область диска. Никакие другие файлы данных не могут использовать эти участки диска, пока Вы не удалите или не переместите оттуда файл.
Когда Вы добавляете записи, Btrieve использует перераспределенное пространство для данных и индексов. Когда использовано все перераспределенное для файла пространство, Btrieve расширяет файл при добавлении новых записей.
Когда Вы запрашиваете операцию Stat или запускаете утилиту BUTIL-STAT, Btrieve возвращает разницу между числом размещенных Вами страниц во время создания файла и числом страниц, используемых Btrieve в данное время. Это число всегда будет меньше числа страниц, заданных для перераспределения, т.к. Btrieve полагает, что некоторое количество страниц использовано при создании файла, даже если Вы не добавляли какие-либо записи.
Как только страница файла была использована, она остается таковой на все время существования файла, даже если Вы удалили все записи, хранящиеся на странице. Таким образом, число свободных страниц, возвращаемых операцией Stat, никогда не увеличивается. Когда Вы удаляете запись, Btrieve поддерживает список свободного пространства в файле и вновь использует доступное пространство при добавлении новых записей.
Если число возвращаемых операцией Stat свободных страниц равно нулю, это не всегда значит, что в файле нет свободного пространства. Число свободных страниц может быть равно нулю, если справедливо одно из следующих утверждений:
- Вы не перераспределяли какие-либо страницы файла.
- Все перераспределенные страницы когда-либо использовались
СОХРАНЕНИЕ ДИСКОВОГО ПРОСТРАНСТВА
Btrieve предлагает два метода для уменьшения пространства, занятого Вашими файлами данных: отбрасывание пробелов и сжатие данных. Метод отбрасывания пробелов применим только к файлам с записями переменной длины. Вы можете использовать сжатие данных для любого Btrieve-файла.
ОТБРАСЫВАНИЕ ПРОБЕЛОВ
Когда Вы определяете файл, допускающий записи переменной длины, Вы можете задать Btrieve использовать метод отбрасывания пробелов для сохранения дискового пространства. Если Вы выбрали отбрасывание пробелов, Btrieve не хранит кикие-либо пробелы в конце переменной части записи, когда он пишет запись в файл. Отбрасывание пробелов неэффективно для фиксированой части записи. Btrieve не убирает пробелы, всавленные среди данных.
Когда Вы читаете запись, содержащую отброшенные в конце пробелы, Btrieve расширяет запись до ее первоначальной длины. Значение, возвращаемое Btrieve в параметр длины буфера данных, включает отброшенные пробелы, если они есть. Отбрасывание пробелов
добавляет два байта в заголовок записи.
СЖАТИЕ ДАННЫХ
При создании Btrieve-файла Вы можете задать, требуется ли Вам сжимать записи данных при хранении их в файле. Сжатие данных может привести к значительному уменьшению пространства, необходимого для хранения записей, содержащих множество повторяющихся символов.
Вы должны рассматривать использование сжатия данных, если:
- сжимаемые записи имеют такую структуру, что выгода от применения сжатия данных - максимальна;
- Ваша прикладная прграмма не требует дополнительной памяти, используемой Btrieve для буферов сжатия;
- необходимость лучшего использования диска превышает возможное увеличение времени выполнения и доступа к сжатым файлам.
Когда Вы выполняете ввод/вывод записей в сжатый файл, Btrieve использует буфер сжатия, чтобы отвести блок памяти для сжатия данных или процесса расширения. Чтобы иметь достаточно памяти для сжатия или расширения записи, Btrieve требует достаточно буферного пространства для хранения удвоенной длины самой длинной записи, которую Ваша прикладная задача добавляет в сжатый файл. Это требование может повлиять на количество свободной памяти, остающейся в компьютере после загрузки Btrieve. Например, если самая длинная запись, что пишет или ищет Ваша прикладная задача,
- длиной 2000 байтов, Btrieve потребует 4000 дополнительных байтов памяти для сжатия или расширения зтой записи.
Т.к. окончательная длина сжатой записи не может быть определена до того, как запись записана в файл, Btrieve всегда создает сжатый файл как файл записей переменной длины. Т.к. образы сжатых записей хранятся как записи переменной длины, отдельные записи могут быть разделены по нескольким страницам файла, если Ваша прикладная задача часто выполняет добавление, корректировку и
удаление. Это разделение может привести к увеличению времени доступа, т.к. Btrieve может потребоваться читать множество страниц файла для поиска одной записи.
Режим сжатия данных наиболее зффективен, когда в каждой записи возможно нахождение большого количества повторяющихся символов. Например, запись может содержать несколько полей, которые все инициализированы пробелами в Вашей прикладной задаче при добавлении записи в файл. Сжатие будет более эффективным, если зти поля сгруппированы в записи вместе, а не разделены полями, содержащими другие значения.
Для применения сжатия данных файл должен быть создан с установкой флага сжатия. Более подробную информацию о флаге сжатия смотрите в описании операции Create или в обсуждении файлов-описаний BUTIL в главе 4.
ПОЗИЦИОНИРОВАНИЕ
Btrieve позволяет Вам искать записи в файле, опираясь или на физический адрес записи в файле или на значение ключа записи.
Когда Вы добавляете запись в Btrieve-файл, Btrieve записывает ее на первое свободное место, доступное в файле, невзирая на значения ключей в записи. Запись останется на этом месте, пока Ваша прикладная задача не удалит ее из файла. Это расположение рассматривается как "физическое размещение" или "адрес" записи.
Когда Btrieve пишет запись в файл, он также обновляет заданные пути доступа (индексы) в соответствии со значением ключей в записи. Место в каждом индексе, где существуют ключевые значения, рассматривается как "позиция" записи. Позиция записи в индексе может изменяться при добавлении новых записей и удалении существующих записей или изменении их ключевых значений.Таким
образом, не существует обязательного соответствия между физическим адресом записи и ее позицией в пути доступа.
ПОИСК ЗАПИСИ ПО ЕЕ ФИЗИЧЕСКОМУ РАСПОЛОЖЕНИЮ
Ваша прикладная задача может применять четыре Step операции, предоставляемых Btrieve для поиска записей по их физическому расположению в файле. Например, операция Step First ищет запись, хранящуюся в первом (самом нижнем) физическом местоположении в файле. Операция Step Next ищет запись, хранящуюся в следующем более высоком физическом местоположении, а операция Step Previous
ищет запись, хранящуюся в следующем более низком физическом местоположении в файле. Операция Step Last ищет запись, хранящуюся в последнем (самом верхнем) физическом местоположении в файле.
Поиск записи по физическому расположению обычно быстрее поиска записи по значению ключа, т.к. Btrieve не должен изменять какую-либо позиционную информацию для индекса и потому, что следующая или предыдущая физическая запись очень вероятно уже в кэш-памяти.
Step операции полезны для быстрого обхода файла данных, если Вашей прикладной задаче не требуется искать записи в особом порядке. Т.к. Step операции используют только физическое расположение для поиска записей, они бесполезны для нахождения
записей, содержащих особое значение или для поиска записей в
особом порядке.
Ваша прикладная задача может установить логическую позицию в индексе после запроса Step операций, используя следующий метод:
- Поиск требуемой записи по запросу одной из Step операций.
- Запрос операции Get Position для поиска 4-байтового физического адреса записи.
- Запрос Get Direct операции, передающей Btrieve 4-байтовую позицию и номер ключа, на который Вы хотите установить позицию.
После выполнения выше перечисленных операций Ваша прикладная задача может перейти к поиску записей по значениям ключей.
ПОИСК ЗАПИСИ ПО ЗНАЧЕНИЮ КЛЮЧА
Ваша прикладная задача может использовать Get операции для поиска записей по значениям ключей для заданного пути доступа. Подходящая Get операция может искать заданную запись в файле или искать записи в определенном порядке.
Например, операция Get First ищет первую запись в пути доступа. Операция Get Last ищет последнюю запись в пути доступа. Такие Get операции, как Get Equal или Get Less Then, возвращают запись по значению ключа, заданного Вашей прикладной задачей в параметре буфера ключа.
Get операции устанавливают позицию Btrieve в индекс. Ваша прикладная задача может переходить от одного индекса к другому, используя следующий метод:
- Поиск записи по запросу одной из Get операций.
- Запрос операции Get Postion для поиска 4-байтового физического адреса записи.
- Запрос операции Get Direct, передавая Btrieve 4-байтовый физический адрес и номер ключа, что Вы хотите изменить.
БЛОК ПОЗИЦИИ
Btrieve поддерживает позиционную информацию, связанную с каждым открытым файлом. Он хранит эту позиционную информацию в 128-байтовом блоке памяти, который передается между Record Manager и Вашей прикладной программой. Эта область памяти
известна как "блок позиции".
Блок позиции содержит:
- Идентификатор пути доступа (номер ключа).
- Указатели индексов пути доступа.
- Три указателя записи.
Три указателя записи означают следующее:
- Указатель предыдущей записи указывает на запись, предшествующую текущей записи в индексе.
- Указатель текущей записи указывает на самую последнюю найденную запись.
- Указатель следующей записи указывает на запись, следующую за текущей записью в индексе.
Btrieve обновляет позиционный блок при каждой операции, чтобы отразить новую позицию индекса в файле. Btrieve использует позиционную информацию для последовательного чтения файла по заданному пути доступа.
Ваша прикладная задача должна поддерживать 128-байтовый позиционный блок для каждого открытого Btrieve-файла. Ваша прикладная задача никогда не должна писать в позиционный блок, т.к. это может привести к ошибке потери позиции или к повреждению Btrieve-файла.
ПРОЦЕСС СОХРАННОСТИ
Нормальный режим операций Btrieve предусматривает несколько уровней автоматического восстановления данных. Btrieve использует Средство Связи Транзакций (Transaction Tracking Service или TTS) для защиты отдельных операций Insert, Update и Delete от системного сбоя, если инсталировано TTS и файл имеет флаг транзакции. Если файл не имеет флага транзакции или не является активным, Btrieve обеспечивает сохранность файла с помощью системы, называемой "создание прообразов". Дополнительно Btrieve защищает набор операций отношения над множеством файлов с помощью процесса контроля транзакций. Оба этих способа описаны в следующих параграфах.
Вы можете блокировать любой уровень автоматического восстановления с помощью опций выполнения, описанных в "Ускоренном Доступе". Если файл поврежден из-за системного сбоя во время запуска Btrieve с блокировкой процесса сохранности, Вы
можете для восстоновления данных воспользоваться утилитой RECOVER.
СОЗДАНИЕ ПРООБРАЗОВ
Record Manager может потребоваться выполнить корректировку некоторых физических страниц для осуществления одного логического запроса из прикладной задачи. Если Btrieve-процесс прерван по системному сбою, файлы могут стать несовместимыми, возможно, из-за появления неправильных путей доступа, которые могут сделать поиск данных невозможным.
ПРИМЕЧАНИЕ:
Обсуждение создания прообразов в зтой главе применимо только к файлам БЕЗ флага транзакции или к тем, что хранятся на файл-сервере, где TTS не является активным. ----------------------------------------------------------- Btrieve защищает от несуществующих состояний файла с помощью
процесса создания прообразов. Если выполнение прервано, Btrieve автоматически восстанавливает файлы в состояние, которое они имели до незавершенного запроса.
Btrieve создает файл-прообраз при первом обновлении файла или доступа к нему во время транзакции. Временный файл имеет то же самое имя, что и защищаемый файл, за исключением того, что расширение файла всегда .PRE. Например, если Вы открыли файл ACCTID.DTA, то временным файлом будет ACCTID.PRE. Btrieve использует этот временный файл для связи изменений в актуальном файле на время действия запроса. Не создавайте имена файлов с расширением .PRE, т.к. они приведут к неправильному процессу восстановления.
Когда Вы корректируете файл, Btrieve хранит корректуру в локальных кэш-буферах. До изменения страницы он пишет копию в буферы прообраза.
В конце операции Btrieve сперва пишет буферы прообраза в файл-прообраз на диске. Затем он записывает корректуру файла данных на диск. Если или кэш-буферы, или буферы прообраза заполняются до конца операции, то Btrieve запишет информацию, хранящуюся в буферах, на диск для освобождения буферного пространства. Независимо от того, когда Btrieve пишет информацию на диск, он всегда записывает данные в буферы прообраза на диск до корректировки актуального файла данных.
Каждый Btrieve файл, к которому Вы имеете доступ, должен иметь свой собственный файл-прообраз. Т.к. имя файла-прообраза - то же,
что и у Btrieve файла (кроме расширения), не создавайте множество Btrieve файлов с одними и теми же именами, но разными расширениями. Например, не применяйте такую схему наименований, как INVOICE.HDR и INVOICE.DET для Ваших Btrieve-файлов. Иначе,
Btrieve пытается использовать INVOICE.PRE для обоих файлов и автоматическое восстановление становится невозможным.
Когда Btrieve создает файл-прообраз, не удаляйте его, пока Btrieve-файл не будет успешно закрыт. Без файла-проообраза Btrieve не может восстановить данные после ненормального завершения.
ПРИМЕЧАНИЕ:
Создание прообразов не исключает необходимость создания резервной копии файлов, т.к. процесс создания проообразов не сможет восстановить с поврежденного диска. Поэтому крайне необходимо делать резервные копии для защиты от катастрофической потери базы данных из-за сбоя оборудования. ----------------------------------------------------------
СИСТЕМА СВЯЗИ ТРАНЗАКЦИЙ (TTS)
Btrieve использует TTS для защиты и гарантии индивидуальных операциий записи в Btrieve-файлы. Для того, чтобы использовать эту возможность, должны встретиться два условия:
- TTS должна быть активной на файл-сервере.
- Btrieve файлы должны иметь флаги транзакций
При инсталяции Btrieve Вы должны задать, будут ли файлы автоматически получать флаг транзакций при создании. Если Вы создаете файл в другой системе и копируете или восстанавливаете его на Ваш сетевой диск, Вы должны задать для него флаг транзакции при помощи утилиты сети FLAG. Смотрите руководство "Утилиты Командных Строк Сети" для подробного описания утилиты FLAG.
Если выполнение на файл-сервере прервано во время операции записи, файлы с флагами транзакций могут стать несуществующими и могут содержать неверные пути доступа. Когда перезагружается файл-сервер, TTS восстанавливает несуществующие файлы в состояние, которое они имели до незавершенной операции записи.
ТРАНЗАКЦИИ
Вы можете получить более высокий уровень сохранностм данных, что обеспечивают TTS или прцесс создания прообразов, если Вы определите логические транзакции в Вашей программе. Ваша программа может выполнять операции над двенадцатью различными файлами в одной транзакции.
Когда Вы ограничиваете набор операций Btrieve вызовом Begin и End Transaction, Btrieve не выполнит ни одну из операций, пока он не сможет успешно завершить их все. Если система откажет во время незавершенной транзакции, Btrieve автоматически устранит ("перемотает обратно") все операции, выполненные во время транзакции, независимо от того, активна TTS или нет.
Btrieve использует файл управления транзакциями для хранения связи файлов, задействованных в транзакции. Он создает файл транзакций SYSSYSTEMBTRIEVE.TRN, если Вы задаете выполнение
транзакций в утилите BSETUP. Смотрите главу 3 "Конфигурация и инсталяция Btrieve" этого руководства.
Когда Вы вновь стартуете файл-сервер после ошибки системы, Btrieve смотрит на файл транзакций для определения, требуются ли процедуры восстановления. В большинстве случаев Btrieve выполняет восстановление транзакций при первом открытии задействованных файлов после сбоя. Однако, если сисема дает сбой во время выполнения Btrieve-вызова End Transaction, он выполняет восстановление при перезапуске файл-сервера. В этом случае все файлы, задействованные в незавершенной транзакции на файл-сервере
должны быть в "online" при повторном запуске.
Когда Вы запускаете прикладную задачу Btrieve, которая использует транзакции, выполняйте следующее:
- Всегда проверяйте, что Btrieve-файлы с транзакциями находятся в "online", когда Вы стартуете Record Manager.
- Никогда не удаляйте и не модифицируйте файл транзакций или какие-либо файлы с расширением ".PRE".
Для файлов без флага транзакции Btrieve использует файлы-прообразы для выполнения сохранности на уровне транзакций. Файлы-прообразы продалжают расти во время транзакций (до операции End Transaction или Abort Transaction), а не только во время одной операции. Позтому файлы-прообразы требуют большее
количество дискового пространства, когда Вы применяете транзакции в Ваших прикладных задачах. Чем больше операций Update, Delete или Insert выполняет Ваша прикладная задача во время одной транзакции и чем больше размер страницы, тем больше становится файл-прообраз.
ТРАНЗАКЦИИ И TTS
Если TTS - активна и файлы, к которым Вы имеете доступ во время транзакции, имеют флаг транзакции, Btrieve использует возможности TTS для обеспечения сохранности на уровне транзакций. Если во время операции записи в файл с транзакцией возникает ошибка, Btrieve сигнализирует TTS прокрутить обратно все операции с начала транзакции. В это время транзакция отменяется и Btrieve возвращает состояние ошибки в Вашу прикладную программу, которое отражает причину ошибки. Запросите операцию Abort Transaction (смотрите Главу 6) для выхода из транзакции.
Если Ваша прикладная программа запрашивает операцию Abort Transaction по запросу оператора или другой внешней причине, Btrieve удаляет все операции с начала транзакции из файлов, используя средства TTS.
Вы можете смешивать файлы с флагом транзакциями и без него в логической Btrieve-транзакции. Если возникает ошибка или если Ваша прикладная программа отменяет транзакцию, Btrieve использует TTS для обратной прокрутки файлов с транзакциями и возврата прообразов файлов без транзакций.
Когда Вы смешиваете файлы с флагом транзакциями и без него, файлы- прообразы файлов без транзакций будут расти во время выполнения транзакции, требуя большего количества пространства диска, чем в случае использования файлов только с флагами транзакции.
УСКОРЕННЫЙ ДОСТУП
Оба метода автоматического восстановления данных, TTS и создание прообраза, требуют дополнительное время для выполнения. Могут возникнуть обстоятельства, при которых Вас это не устраивает. Btrieve позволяет Вам отменять создание прообразов для файлов без флага транзакции, открывая их в ускоренном режиме. Это уменьшает
время, требуемое для операций Update, Delete и Insert, и особенно полезен при загрузке большого количества записей. Ускоренный
режим может быть замечательным в средах, защищенных от системных ошибок независимым источником питания, или в системах с небольшим риском системной ошибки по другим причинам.
Когда Вы открываете файл в ускоренном режиме, Btrieve не выполняет запись в операционной системе до тех пор, пока не заполнится кэш и алгоритм наименее используемой записи, управляющий буфером ввода/вывода кэш-памяти, выберет буфер для повторного использования. Btrieve никогда не пишет в файл-прообраз до тех пор, пока буферы прообразов не заполнятся во время одной операции. Вдобавок, Btrieve не выполняет дисковые операции сброса, позволяющие операционной системе освобождать кэш-буферы. Он не закрывает и не открывает вновь файл при каждом его физическом
расширении для освобождения структуры директорий.
Если Вы открываете файл в ускоренном режиме, Вы не можете допустить запись любой Вашей корректировки на диск до выполнения операции Close. При ошибках системы во время доступа к файлу в ускоренном режиме Btrieve не может автоматически восстановить файл при следующем его открытии. В этом случае Вы должны применять утилиту BUTIL-RECOVER для восстановления Ваших записей данных в последовательный файл. Восстановленные Вами данные могут не отражать все операции, выполненные Вами до сбоя системы.
После того, как рабочая станция успешно откроет файл в ускоренном режиме, другие могут открыть файл только, если они применяют ускоренный режим. Любая попытка другой рабочей станции открыть файл в другом режиме приведет к ошибке статуса "недопустимый режим".
ПРИМЕЧАНИЕ:
Ускоренный режим не оказывает влияния на файлы с флагом транзакции, когда активна система TTS. Также открытие файла в ускоренном режиме не оказывает влияния на скорость Btrieve при выполнении опираций без записи. ------------------------------------------------------------
УПРАВЛЕНИЕ ПАРАЛЛЕЛИЗМОМ
Btrieve обеспечивает три различных метода для разрешения конфликта, возникающего при попытке двух рабочих станций корректировать или удалять одну и ту же самую запись в одно и то же время: управление транзакциями, пассивный параллелизм и захваты записей. Вы можете применять эти методы по отдельности или комбинируя их в одной программе.
УПРАВЛЕНИЕ ТРАНЗАКЦИЯМИ
Когда Ваша программа имеет доступ к файлу с транзакцией, Btrieve захватывает файл для этой рабочей станции до конца или отмены этой транзакции. Другие рабочие станции могут читать этот файл, не выполняя чтений в транзакции. Однако, никто больше не может иметь доступ к файлу через транзакцию.
Btrieve обычно выполняет захваты с ожиданием. Если две рабочие станции пытаются получить доступ к одному и тому же файлу с транзакцией, Btrieve не позволит второй рабочей станции получить доступ к файлу до того, как первая рабочая станция выполнит эту транзакцию.
Однако, если Вы задаете захваты без ожидания при начале транзакции, Btrieve будет выполнять захваты без ожидания во время транзакции. Если две рабочие станции пытаются получить доступ к одному и тому же файлу с транзакцией,вторая рабочая станция получит статус "файл занят" из Btrieve.
Так как транзакция временно захватывает файл при корректировках, Btrieve прикладная программа должна руководствоваться следующим:
- Программа никогда не должна ждать ввода с клавиатуры во время транзакции. Никакие другие рабочие станции не смогут корректировать файл(ы), к которым получен доступ через эту транзакцию, до ответа оператора и отмены транзакции.
- Для того, чтобы избежать захватов "намертво", все транзакции, имеющие доступ к одному и тому же набору файлов, должны запускаться с опцией "без ожидания" или они должны иметь доступ к файлам в том же самом порядке. Иначе, возможно попасть в ситуацию, в которой каждая рабочая станция ждет доступа к файлам, которые уже захвачены другой рабочей станцией.
Рисунок 2.1 показывает, как две рабочие станции будут взаимодействовать во время запуска одной и той же прикладной задачи, которая читает и корректирует два файла в транзакции с ожиданием. Шаги пронумерованы для того, чтобы показать порядок выполнения операций.
Станция 1 ¦ Станция 2 ¦ Станция 3 Прикладная ¦ Btrieve ¦ Прикладная задача ¦ ¦ задача --------------------+-----------------+-------------------- (1) Открыть Файл 1 ¦ ¦ ¦ ¦ (2) Открыть Файл 1 (3) Открыть Файл 2 ¦ ¦ ¦ ¦ (4) Открыть Файл 2 (5) Начать Тран. ¦ ¦ ¦ ¦ (6) Начать Тран. (7) Чтение Файла 1 ¦ ¦ ¦ ¦ (8) Чтение Файла 1 ¦ (9) Задержка, ¦ ¦ т.к. Станция 1 ¦ ¦ захватила ¦ ¦ Файл 1 ¦ (10) Чтение Файла 2 ¦ ¦ (11) Корректировка ¦ ¦ Файла 1 ¦ ¦ (12) Корректировка ¦ ¦ Файла 2 ¦ ¦ (13) Конец Тран. ¦ ¦ ¦ (14) Чтение ¦ ¦ окончено ¦ ¦ ¦ (15) Чтение Файла 2 ¦ ¦ (16) Корректировка ¦ ¦ Файла 1 ¦ ¦ (12) Корректировка ¦ ¦ Файла 2 ¦ ¦ (13) Конец Тран. ¦ ¦ Рисунок 2.1 Транзакционный Захват
Рисунок 2.2 показывает, как две рабочие станции сети могут заблокироваться "намертво". Рабочие станции выполняют две разные программы, имеющие доступ к одним и тем же файлам в различном порядке в транзакциях без ожидания.
Станция 1 ¦ Станция 2 ¦ Станция 3 Прикладная ¦ Btrieve ¦ Прикладная задача ¦ ¦ задача --------------------+-----------------+-------------------- (1) Открыть Файл 1 ¦ ¦ (2) Открыть Файл 2 ¦ ¦ ¦ ¦ (3) Открыть Файл 1 ¦ ¦ (4) Открыть Файл 2 (5) Начать Тран. ¦ ¦ ¦ ¦ (6) Начать Тран. (7) Чтение Файла 1 ¦ ¦ ¦ ¦ (8) Чтение Файла 1 (9) Чтение Файла 2 ¦ ¦ ¦ (10) Задержка ¦ ¦ Btrieve на ¦ ¦ Станции 1, ¦ ¦ т.к. Станция 2 ¦ ¦ захватила ¦ ¦ Файл 2 ¦ ¦ ¦ (11) Чтение Файла 2 ¦ (12) Задержка ¦ ¦ Btrieve на ¦ ¦ Станции 2, ¦ ¦ т.к. Станция 1 ¦ ¦ захватила ¦ ¦ Файл 1 ¦ ¦ ¦ Рисунок 2.2 Пример захвата "намертво"
ПАССИВНЫЙ ПАРАЛЛЕЛИЗМ
Если Ваша прикладная программа выполняет чтение одной записи и корректирует логически не связанную последовательность, Вы можете выбрать пассивный метод параллелизма. Btrieve позволяет любой рабочей станции читать и корректировать (или удалять) записи без каких-либо захватов или транзакций.
Если запись изменяется между моментом чтения в Вашей программе и моментом, когда Ваша программа пытается корректировать (или удалять) ее, Btrieve возвращает конфликтный статус. Этот статус показывает, что данные были модифицированы другой рабочей станцией с сомента ее первоначального чтения. В этом случае Ваша
программа должна перечитать запись для выполнения операции корректировки (или удаления).
Пассивный метод позволяет Вам перемещать прикладные программы из однопользовательской среды в многопользовательскую с минимальными изменениями. Это также допускает высокую степень параллелизма в системе.
Рисунок 2.3 показывает, как прикладные программы взаимодействуют при использовании пассивного метода параллелизма.
Станция 1 ¦ Станция 2 ¦ Станция 3 Прикладная ¦ Btrieve ¦ Прикладная задача ¦ ¦ задача --------------------+-----------------+--------------------- (1) Открыть Файл ¦ ¦ ¦ ¦ (2) Открыть Файл (3) Чтение записи ¦ ¦ 101 ¦ ¦ ¦ ¦ (4) Чтение записи <-¬ (5) Корректировка ¦ ¦ 101 ¦ записи 101 ¦ ¦ ¦ ¦ ¦ (6) Корректировка ¦ ¦ ¦ записи 101 ¦ ¦ (7) Btrieve ¦ ¦ ¦ возвращает ¦ ¦ ¦ статус ¦ ¦ ¦ конфликиа ¦ ¦ ¦ ¦ (8) Повторение ----- ¦ ¦ Рисунок 2.3 Пассивный метод
Вы можете комбинировать пассивный метод эффективно с управлением на уровне транзакций. Когда одна рабочая станция имеет доступ к файлу через транзакцию, другие рабочие станции не могут больше корректировать файл или иметь доступ к нему через свои собственные транзакции.
Если возникает такая попытка, Btrieve возвратит состояние "занято" или будет ждать окончания первой транзакции, в зависимости от того, как началась транзакция второй рабочей станции. Любое количество рабочих станций может получать доступ к чтению файла, если чтения появляются вне транзакции.
Рисунок 2.4 показывает, как прикладная программа, использующая управление транзакциями с ожиданием, может взаимодействовать с
прикладной программой, использующей пассивный метод параллелизма. Когда прикладная программа Рабочей станции 1 читает файл 1 через транзакцию, Рабочая станция 2 может еще читать файл вне транзакции, но для корректировки ждет завершения транзакции.
Так как две рабочих станции имеют доступ к разным записям в одном и том же файле, Рабочая станция 2 корректирует правильно. Если обе станции корректируют одну и ту же запись, Btrieve вернет состояние конфликта на Рабочую станцию 2 при корректировке.
Станция 1 ¦ Станция 2 ¦ Станция 3 Прикладная ¦ Btrieve ¦ Прикладная задача ¦ ¦ задача --------------------+-----------------+-------------------- (1) Открыть Файл 1 ¦ ¦ (2) Открыть Файл 2 ¦ ¦ ¦ ¦ (3) Открыть Файл 1 (4) Начать Тран. ¦ ¦ (5) Чтение Файла 1 ¦ ¦ записи 10 ¦ ¦ ¦ ¦ (6) Чтение Файла 1 ¦ ¦ записи 95 ¦ ¦ (7) Корректировка ¦ ¦ Файла 1, ¦ ¦ записи 95 ¦ (8) Задержка, ¦ ¦ т.к. Станция 1 ¦ ¦ захватила ¦ ¦ Файл 1 ¦ (9) Чтение Файла 2 ¦ ¦ записи 10 ¦ ¦ (10) Корректировка ¦ ¦ Файла 2 ¦ ¦ записи 10 ¦ ¦ (11) Корректировка ¦ ¦ Файла 1 ¦ ¦ записи 10 ¦ ¦ (12) Конец Тран. ¦ ¦ ¦ (13) Успешное ¦ ¦ завершение ¦ ¦ корректировки ¦ ¦ ¦ Рисунок 2.4 Комбинация транзакции и пассивного метода
ЗАХВАТЫ ЗАПИСИ
Когда программа имеет доступ к записи через файл, она может указать на желание захватить запись. Другие рабочие станции могут читать эту запись через чтения, выполняемые без опции захвата. Однако, никакие другие рабочие станции не могут захватывать, корректировать или удалять эту запись, пока рабочая станция, выполнившая захват, не освободит ее.
Когда Вы захватываете запись, Вы используете соответствующий код Btrieve-операции для задания или захвата одной записи или захвата множества записей. Захват одной записи позволяет рабочей станции иметь только одну запись заблокированной в файле в некоторый момент времени; захват множества записей - несколько.
Btrieve допускает захваты с ожиданием и без ожидания. Захваты С ОЖИДАНИЕМ не возвращают код статуса в прикладную программу до успешного завершения захвата. Захваты БЕЗ ОЖИДАНИЯ немедленно возвращают в прикладную программу статус "занято", когда другая рабочая станция захватила запись. Когда Вы используете захваты без ожидания, прикладная программа должна или ждать и повторять операцию или сообщать пользователю об ошибке, если когда захват занят.
Как только рабочая станция успешно захватила запись захватом одной записи, захват действует до тех пор, пока не возникнет одна из следующих ситуаций:
- Рабочая станция корректирует или удаляет захваченную запись. (Рабочая станция может читать и корректировать другие записи в файле без отмены захвата).
- Рабочая станция захватывает другую запись в файле.
- Рабочая станция запрашивает операцию отмены захвата для файла.
- Рабочая станция закрывает файл.
- Рабочая станция запрашивает операцию Reset, закрывая открытые файлы.
- Рабочая станция получает доступ к файлу через транзакцию.
Как только рабочая станция успешно захватила одну или более записей захватом множества записей, захват действует до тех пор, пока не возникнет одна из следующих ситуаций:
- Рабочая станция удаляет захваченную запись(записи).
- Рабочая станция отменяет захваты записи (записей).
- Рабочая станция закрывает файл.
- Рабочая станция запрашивает операцию Reset, закрывая открытые файлы.
- Рабочая станция получает доступ к файлу через транзакцию.
ОГРАНИЧЕННЫЙ ДОСТУП К ФАЙЛУ
Btrieve позволяет Вам ограничивать доступ к файлу с помощью присваивания файлу имени владельца или открывая файл в режиме исключения.
ИМЕНА ВЛАДЕЛЬЦЕВ
Btrieve также позволяет Вам ограничивать доступ к файлу заданием имени владельца. Как только Вы присвоили файлу имя владельца, Btrieve будет требовать это имя для всех будующих операций Open. Это предохраняет от неавторизированного доступа или изменения содержимого файла пользователями или прикладными программами, не имеющими доступ к имени владельца.
Вы можете ограничить доступ таким образом, что пользователи смогут не задавая имя владельца только читать файл. Присвоив право собственности на файл, пользователи и прикладные программы также не могут изменять содержимое файла, пока не зададут имя владельца. Btrieve позволяет Вам удалить право собственности из файла, если Вы знаете присвоенное ему имя владельца.
Когда Вы присваиваете имя владельца, Вы можете также запросить шифровку данных на дисковом файле, используя имя владельца как ключ шифровки. Шифровка данных на диске предохраняет от проверки неавторизированными пользователями Ваших данных с помощью отладчика или утилиты дампа файла. Так как шифровка требует д ополнительного времени выполнения, выбирайте эту опцию только, если безопасность данных важна в Вашей среде.
РЕЖИМ ИСКЛЮЧЕНИЯ
Если Вы хотите ограничить доступ к файлу на одной рабочей станции, Вы можете задать, чтобы Btrieve открывал файл в режиме исключения. Когда рабочая станция откроет файл в режиме исключения, никакая другая рабочая станция не сможет открыть файл до тех пор, пока рабочая станция открывшая файл в режиме исключения, не закроет его.
| <<
| <
| >
| >>
|
Содержание
|