Создание приложений для работы с базами данных в сети____________583

тем блокировки ресурсов, необходимых выполняемой транзакции. Тогда другие
транзакции, обращающиеся к тем же ресурсам, будут ждать, пока данная транзак-
ция не завершится, после чего ресурсы будут освобождены. Правда, при этом воз-
можна взаимная блокировка, когда одна транзакция заблокировала ресурсы, необ-
ходимые другой, а эта другая заблокировала какие-то ресурсы, необходимые пер-
вой. Это тупиковая ситуация, которую можно разрешить только извне.

C++Builder реализует более оптимальное управление доступом. Оно предпола-
гает, что большинство обращений к базе данных — это обращения для чтения. И
очень невелика вероятность того, что два приложения одновременно будут изме-
нять одну и ту же запись и одни и те же поля в ней. Такое редкое наложение изме-
нений будет восприниматься как аварийная ситуация, приводящая к генерации
исключения.

Процесс работы приложения C++Builder с базой данных выглядит следую-
щим образом. При выполнения приложения оно получает копию записи с сервера,
позволяет что-то в ней изменить, а затем посылает изменения на сервер с помощью
команды Update. Эта команда SQL имеет элемент Where, перечисляющий значе-
ния полей, совпадение которых идентифицирует изменяемую запись. Эти значе-
ния берутся из копии записи и, следовательно, не зависят от того, не изменились
ли за это время поля реальной записи.

В компонентах Table и Query имеется свойство UpdateMode — режим обнов-
ления. Значения этого свойства и определяют, какие поля будут включены в эле-
мент Where команды Update. Возможные значения:

upWhereAll       Where включает все поля записи (принято по умолчанию)

upWhereChanged  Where включает ключевые поля и поля, которые были из-
менены

upWhereKeyOnly Where включает только ключевые поля

Вариант upWhereAll наиболее надежен, поскольку распознает запись по зна-
чениям всех ее полей. Но он и наиболее трудоемок, поскольку при большом коли-
честве полей элемент Where получается очень большим. Вариант upWhereChan-
ged требует меньших затрат, но он и менее надежен. Если, пока шло редактирова-
ние записи в данной транзакции, другая транзакция изменила в этой записи поля,
отличные от измененных данной транзакцией, то фиксироваться результаты будут
уже практически для другой записи. Еще менее надежен вариант upWhereKeyOn-
1у, хотя он наиболее быстрый. Его можно рекомендовать только в случае, если есть
уверенность, что данное приложение — единственное, модифицирующее таблицу
на данном отрезке времени.

10.3 Interbase — работа на платформе
клиент/сервер

10.3.1 Общие сведения

Все рассмотренное выше по созданию сетевых приложений, работающих с ба-
зами данных, относится и к платформе клиент/сервер. Но некоторые особенности
этой платформы, в частности, создание обзоров — Views и использование храни-
мых на сервере процедур, еще не обсуждались. Прежде, чем заняться этим, рас-
смотрим в качестве примера работу с сервером Interbase. Это тем более оправдано,
что в C++Builder имеется локальный сервер Interbase — Borland Interbase Server.
Он является усеченной локальной версией Borland Workgroup сервера, который
находит применение в больших реальных задачах.