Хелен Борри - Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Название:Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2006
- Город:Санкт-Петербург
- ISBN:5-94157-609-9
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Хелен Борри - Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ краткое содержание
Рассмотрены вопросы, необходимые разработчику для создания клиент-серверных приложений с использованием СУБД Firebird, явившейся развитием СУБД Borland Interbase 6. Содержится обзор концепций и моделей архитектуры клиент/сервер, а также практические рекомендации по работе с клиентскими библиотеками Firebird. Детально описаны особенности типов данных SQL, язык манипулирования данными (Data Manipulation Language, DML), а также синтаксис и операторы языка определения данных ( Data Definition Language, DDL). Большое внимание уделено описанию транзакций и приведены советы по их использованию при разработке приложений. Описано программирование на стороне клиента и сервера написание триггеров и хранимых процедур, создание и использование событий базы данных, обработка ошибок в коде на сервере и многое другое. Материал сопровождается многочисленными примерами, советами и практическими рекомендациями.
Для разработчиков баз данных
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
Таблица 27.3. Взаимодействие установок транзакции и явных блокировок
Изоляция |
Разрешение блокировок |
Поведение |
isc_tpb_consistency (SNAPSHOT TABLE STABILITY) |
- - - |
Игнорируется. Блокировки на уровне таблицы перекрывают явные блокировки |
isc_tpb_concurency (SNAPSHOT) |
isc_tpb_nowait (NO WAIT) |
Если строка была изменена любой транзакцией и подтверждена после старта нашей транзакции, или уже активная транзакция изменила строку до того, как она была помещена в кэш строк, то немедленно возникает исключение по конфликту изменения |
isc_tpb_concurency (SNAPSHOT) |
isc_tpb_wait (WAIT) |
Если строка была изменена любой транзакцией и подтверждена после старта нашей транзакции, или уже активная транзакция изменила строку до того, как она была помещена в кэш строк, то немедленно возникает исключение по конфликту изменения. Если активная транзакция использует строку с явной блокировкой или с обычной блокировкой по записи, то наша транзакция ждет результатов блокирующей транзакции. Если блокирующая транзакция подтверждает затем измененную версию этой записи, то возникает исключение по конфликту изменения |
isc_tpb_read committed (READ COMMITTED) |
isc_tpb_nowait (NO WAIT) |
Если активная транзакция использует строку с явной блокировкой или с обычной блокировкой по записи, то наша транзакция немедленно получает исключение по конфликту изменения |
isc_tpb_read committed (READ COMMITTED) |
isc_tpb_wait (WAIT) |
Если активная транзакция использует строку с явной блокировкой или с обычной блокировкой по записи, то наша транзакция ждет результатов блокирующей транзакции. Когда блокирующая транзакция завершается, наша транзакция снова пытается установить блокировку на эту строку. Исключения по конфликту изменения никогда не возникнут для оператора с явной блокировкой с такой конфигурацией |
Количество строк в указанном выходном наборе имеет важные последствия, если вы используете метод доступа, который запрашивает "наборы данных" или "наборы записей" в пакетах из нескольких сотен строк за один раз ("буферизованная загрузка"), и буферизируете их на клиенте- обычно для реализации интерфейса прокручивания. Если блокировка не срабатывает в процессе получения отдельной строки и вызывает исключение, то ни одна из строк, находящихся в состоянии ожидания в буфере на сервере, не будет отправлена, а те, которые уже были переданы на клиентский буфер, станут ошибочными. Ваше приложение должно будет выполнить откат транзакции.
При таком стиле доступа важно обеспечить в ваших приложениях способ обработки исключений по мере их появления. Используйте сильно ограничивающее предложение WHERE для уменьшения диапазона блокировок до одной или очень небольшого количества строк и исключите ошибки в частично загруженных наборах. Если ваш интерфейс доступа к данным такое поддерживает, то сделайте в вашем компоненте доступа к данным буфер для загрузки только одной строки, например:
SELECT * FROM DOCUMENT
WHERE ID = ? WITH LOCK /* ID - первичный ключ */
Необязательное предложение FOR UPDATE предоставляет способ для определения набора из множества строк, загрузки и обработки строк за один раз.
Если присутствует предложение FOR UPDATE, буферизованная загрузка будет отключена, а блокировка будет применяться к каждой строке, одна за другой в том порядке, в котором они загружаются из кэша с серверной стороны. Если именованный курсор [108] По причине ограничения объема книги тема именованных курсоров затрагивается лишь слегка. Для работы с ними API предоставляет группу функций isc_dsql_*. Синтаксис оператора DECLARE CURSOR, полностью реализованный в ESQL, доступен в некоторых средах программирования DSQL. Описание использования именованных курсоров в модулях PSQL см. в главах 29 и 30.
управляет позицией обновления, это предложение может включать необязательное выражение ON <���список-столбцов> для направления изменений указанным столбцам курсора.
Поскольку к транзакции применяются обычные правила изоляции, то существует возможность для блокировки, которая была доступна в момент старта запроса, впоследствии получить отказ. Незагруженные строки остаются "чистыми" и доступными другим транзакциям для изменения, за исключением "скользящих окон", в которых некоторые незагруженные строки могут быть заблокированы другой транзакцией, даже если блокировка появилась после того, как был запрошен набор данных.
Приведенный далее оператор определяет неограниченный по количеству строк выходной набор, где каждая строка будет загружаться в буфер на серверной стороне индивидуально. Следующая строка не будет загружаться до тех пор, пока сервер не сообщит о своей готовности ее принять, WITH LOCK пытается выполнить пессимистическую блокировку при запросе каждой строки. Будет возвращена либо следующая строка, либо исключение.
SELECT + FROM DOCUMENT
WHERE PARENT ID=? FOR UPDATE WITH LOCK
Конструкция SELECT ... WITH LOCK доступна в DSQL и PSQL. Она может использоваться только в операторе SELECT верхнего уровня для единственной таблицы.
* Она недоступна в подзапросе или в соединяемом наборе.
* Она не может быть указана с квантификаторами (оператор DISTINCT, FIRST или SKIP), С предложением GROUP BY, а также с любыми другими агрегатными операциями.
* Она не может быть использована в просмотрах, во внешних таблицах и в выходном наборе хранимой процедуры выбора.
Хранимые процедуры, триггеры и транзакции
Сведения о написании и использовании хранимых процедур и триггеров см. в части VII.
Хранимые процедуры
Хранимые процедуры выполняются в контексте тех транзакций, которые их вызвали. Сделанная работа, включая ту, которая была выполнена в задачах встроенных или рекурсивных вызовов, будет иметь результат, если все завершится без ошибок, с обработанными исключениями и вся работа будет подтверждена. Если результатом обработки исключения в одной операции будет откат транзакции, то вся работа этой транзакции будет отменена.
Триггеры
Триггеры вызываются внутри контекста оператора DML. Сделанная работа, включая ту, которая была выполнена в задачах встроенных вызовов процедур, все обновления, добавления или удаления данных других таблиц или за счет внутренней ссылочной целостности или другими триггерами, принадлежащими другим таблицам - все будет подтверждено или возвращено клиенту в неопределенном состоянии. Необработанные исключения в одной операции приведут к отмене операции, при которой встретилась ошибка, и сохранят транзакцию в том состоянии, когда приложение сможет принять решение отменить транзакцию или попытаться исправить ошибку и заново отправить запрос. Отмена транзакции отменит все операции, выполненные в транзакции до момента появления исключения.
Читать дальшеИнтервал:
Закладка: