Читать интересную книгу Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Шрифт:

-
+

Интервал:

-
+

Закладка:

Сделать
1 ... 115 116 117 118 119 120 121 122 123 ... 238

В транзакции вы можете резервировать более одной таблицы.

Использование резервирования таблиц

Использование резервирования таблиц с уровнями изоляции SNAPSHOT и READ COMMITTED является более предпочтительным, чем с SNAPSHOT TABLE STABILITY, когда требуется блокировка на уровне таблицы. Резервирование таблиц является менее агрессивным и более гибким способом предварительной блокировки таблиц. Он доступен для использования с любым уровнем изоляции. При этом его использование с SNAPSHOT TABLE STABILITY не рекомендуется, поскольку он не имеет эффекта при ограничениях доступа к таблицам, к которым транзакции может понадобиться доступ и которые находятся за пределами предложения RESERVING.

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

Параметры резервирования таблиц

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

! ! !

ПРИМЕЧАНИЕ. Транзакция SNAPSHOT TABLE STABILITY не может получить доступ ни к какой таблице, зарезервированной с помощью средства резервирования таблиц.

. ! .

Вариантами выбора являются:

[PROTECTED | SHARED] {READ | WRITE}

Атрибут PROTECTED предоставляет транзакции исключительный доступ к таблице по чтению и позволяет другим транзакциям с уровнями изоляции SNAPSHOT и READ COMMITTED читать строки. Запись ограничивается одним или двумя модификаторами:

* PROTECTED WRITE позволяет текущей транзакции писать в таблицу и блокирует запись другими транзакциями;

* PROTECTED READ запрещает запись в таблицу для любой транзакции, включая текущую.

Атрибут SHARED позволяет любой транзакции SNAPSHOT или READ COMMITTED читать из таблицы и предоставляет два режима для параллельных изменений другими транзакциями:

* SHARED WRITE любой транзакции чтения/записи SNAPSHOT или транзакции чтения/записи READ COMMITTED изменять строки в наборе, пока никакая транзакция не имеет или не запросит исключительного доступа по записи;

* SHARED READ является наиболее либеральным условием резервирования. Этот режим позволяет любой другой транзакции чтения/записи изменять таблицу.

Итоги

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

* другая транзакция имеет уровень изоляции SNAPSHOT TABLE STABILITY;

* другая транзакция сконфигурирована на резервирование этой таблицы в режиме PROTECTED WRITE (хотя она может читать эту таблицу, если текущая транзакция зарезервировала ее в режиме SHARED READ);

* другая транзакция собирается зарезервировать эту таблицу в режиме SHARED WRITE, а текущая транзакция зарезервировала ее в режиме PROTECTED READ или PROTECTED WRITE.

В случае если это все еще вам непонятно, посмотрите на рис. 26.1, где некоторые сконфигурированные транзакции сами все расскажут.

Рис. 26.1. Конфигурирование резервирования таблиц

Версии записей

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

Пока транзакция, в конце концов, не подтвердит изменения, она не касается "живой" версии. В своем собственном контексте она трактует отправленную версию, как если бы она была самой последней подтвержденной версией. Тем временем другие транзакции продолжают "видеть" самую последнюю подтвержденную версию. В случае "мгновенного снимка" базы данных (snapshot) в транзакциях, которые были запущены до нашей транзакции, последняя подтвержденная версия записи, которую они видят, может быть более старой, чем та, которую видит наша транзакция и другие транзакции, либо ранее запущенные, либо имеющие уровень изоляции READ COMMITTED.

Зависимые строки

Если на таблицу, изменение в которой было отправлено на сервер, ссылаются внешние ключи других таблиц, сервер создает версии строк в этих таблицах, которые "принадлежат" измененной строке[96]. Эти зависимые строки, равно как и другие строки других таблиц, зависящие от них через внешние ключи, также становятся недоступными другим транзакциям для изменения, пока выполняется наша транзакция.

Блокировки и конфликты блокировок

В Firebird блокировки управляются относительным возрастом транзакций, а записи управляются системой поддержки версий. Все блокировки применяются на уровне строки, за исключением тех случаев, когда транзакция оперирует на уровне изоляции SNAPSHOT TABLE STABILITY или когда используется резервирование таблицы, которое блокирует доступ по записи.

Время действия

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

Пессимистическая блокировка

Пессимистическая, или предварительная, блокировка может быть применена для наборов строк или для целых таблиц. Режимы блокировки таблиц уже были описаны (см. разд. "Резервирование таблиц" и "SNAPSHOT TABLE STABILITY (согласованность)").

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

Явная блокировка

Возможность осуществлять явную пессимистическую блокировку строки была добавлена в синтаксис SQL-оператора SELECT в Firebird 1.5. Блокировка ограничена "внешним уровнем" операторов SELECT, которые возвращают выходные наборы или определяют курсоры. Она не может применяться к подзапросам.

Сокращенный синтаксис запроса явной пессимистической блокировки строки:

SELECT <выходной-список>

FROM <таблица-или-процедура-или-просмотр>

[WHERE <условия-поиска>]

[GROUP BY <спецификация-группирования>]

[UNION <выражение-выбора> [ALL]]

[PLAN <выражение-плана>]

[ORDER BY <список-столбцов>]

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

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

Фиктивные изменения

Традиционным способом получения пессимистической блокировки строки в Firebird являются фиктивные изменения (dummy updates). Этот трюк позволяет использовать преимущества многоверсионной архитектуры. Клиент просто посылает на сервер для строки оператор изменения, который ничего не изменяет - он просто устанавливает значение столбца в его текущее значение, что приводит к тому, что сервер создает новую версию записи и, следовательно, блокирует для других транзакций запрос на изменение или удаление этой строки.

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

Конфликты блокировки

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

Эта стратегия работает хорошо только в случае двух условий, которые приводят к конфликтам блокировки.

1 ... 115 116 117 118 119 120 121 122 123 ... 238
На этом сайте Вы можете читать книги онлайн бесплатно русская версия Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри.
Книги, аналогичгные Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ - Хелен Борри

Оставить комментарий