Вход/Регистрация
Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ
вернуться

Борри Хелен

Шрифт:
Явная блокировка в версии 1.5 и более поздних

Синтаксис явной блокировки:

SELECT спецификация-выхода FROM имя-таблицы

[WHERE условие-поиска]

[FOR UPDATE [OF столбец1 [, столбец2 [, ...]]]]

WITH LOCK;

Как это работает

Для каждой записи, попадающей под действие оператора с явной блокировкой, сервер возвращает либо самую последнюю подтвержденную версию записи, независимо от того состояния, которое имела база данных при передаче на сервер этого оператора, либо исключение.

Поведение ожидания и сообщение о конфликте зависят от параметров транзакции, заданных в буфере параметров транзакции (TPB).

Сервер гарантирует, что все записи, возвращенные оператором с явной блокировкой, являются заблокированными и соответствуют условиям поиска, заданным в предложении WHERE, если условия поиска не зависят от любых других таблиц, указанных, например, в соединении или подзапросе. Он также гарантирует блокировку только тех строк, которые соответствуют условиям поиска.

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

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

Если указано SELECT ... WITH LOCK и необязательное предложение FOR UPDATE опущено, то все строки в наборе будут предварительно заблокированы, неважно, изменяете вы их фактически или нет. При аккуратном конфигурировании транзакции и управлении буферизацией со стороны клиента блокировка будет предотвращать доступ по записи к любой из этих строк или к зависимым от них строкам другим транзакциям, пока не завершится ваша транзакция. Предварительная блокировка набора, содержащего много строк, приведет к росту конфликтов блокировок, и ваш код приложения должен быть готовым к их обработке.

Таблица 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

Если присутствует предложение FOR UPDATE, буферизованная загрузка будет отключена, а блокировка будет применяться к каждой строке, одна за другой в том порядке, в котором они загружаются из кэша с серверной стороны. Если именованный курсор [108] управляет позицией обновления, это предложение может включать необязательное выражение ON <список-столбцов> для направления изменений указанным столбцам курсора.

108

По причине ограничения объема книги тема именованных курсоров затрагивается лишь слегка. Для работы с ними API предоставляет группу функций isc_dsql_*. Синтаксис оператора DECLARE CURSOR, полностью реализованный в ESQL, доступен в некоторых средах программирования DSQL. Описание использования именованных курсоров в модулях PSQL см. в главах 29 и 30.

  • Читать дальше
  • 1
  • ...
  • 224
  • 225
  • 226
  • 227
  • 228
  • 229
  • 230
  • 231
  • 232
  • 233
  • 234
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: